CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Oracle >  开发

[学习] 求存储过程

楼主weilai_w(我的回忆)2005-07-27 23:49:05 在 Oracle / 开发 提问

表t1  
  id       name  
  ----------  
  1         aaa  
  2         bbb  
  3         ccc  
   
  我需要:  
  select   id   from   t1   where   name=变量x  
  如果找到   id   就返回ID,  
  否则  
  select   mysequence.nextval   from   dual  
   
  insert   into   (id,name)   values   (上面这句的序列,变量x)  
  返回新产生的序列。  
   
  正在学习使用   Oracle   ,请多指教!(表t1可不可以也写入变量,动态修改) 问题点数:20、回复次数:2Top

1 楼njhart2003()回复于 2005-07-28 07:37:17 得分 20

两点想法,与楼主交流一下:  
  1.关于主键约束的问题,(id,name)是主键吗?   如果不是,结果就可能返回多个id...  
  2.建议不要把表名也搞成动态的,  
      一是表名若动态,表结构就可能不一样,函数也不能实现通用性;  
      二是若用动态sql,那每次执行函数都要重新解析,那么次函数就性能上意义不大。  
   
  -------------------------------------------------  
  下面就用一个简单的函数来实现你描述的功能,供参考:  
   
  SQL>   create   table   t1(id   integer,name   varchar2(10));  
   
  表已创建。  
   
  SQL>   create   sequence   mysequence   increment   by   1   start   with   3;  
   
  序列已创建。  
   
  SQL>   begin  
      2     insert   into   t1   values(1,'aaa');  
      3     insert   into   t1   values(2,'bbb');  
      4     insert   into   t1   values(3,'ccc');  
      5     commit;  
      6     end;  
      7     /  
   
  PL/SQL   过程已成功完成。  
   
  SQL>   select   *   from   t1;  
   
                  ID   NAME  
  ----------   ----------  
                    1   aaa  
                    2   bbb  
                    3   ccc  
   
  已选择3行。  
   
  SQL>   create   or   replace   function   return_id(  
      2     p_name   in   varchar2  
      3     )  
      4     return   integer  
      5     as  
      6     l_id       integer;  
      7     begin  
      8     for   x   in   (select   id   from   t1   where   name=p_name)   loop  
      9     l_id:=x.id;  
    10     end   loop;  
    11     if   l_id   is   null   then  
    12     insert   into   t1(id,name)    
    13     values(mysequence.nextval,p_name)    
    14     return   id   into   l_id;  
    15     commit;  
    16     end   if;  
    17     return   l_id;  
    18     end;  
    19     /  
   
  函数已创建。  
   
  SQL>   variable   n   number;  
  SQL>   exec   :n:=return_id('aaa');  
   
  PL/SQL   过程已成功完成。  
   
  SQL>   print   :n  
   
                    N  
  ----------  
                    1  
   
  SQL>   exec   :n:=return_id('bbb');  
   
  PL/SQL   过程已成功完成。  
   
  SQL>   print   :n  
   
                    N  
  ----------  
                    2  
   
  SQL>   exec   :n:=return_id('ddd');  
   
  PL/SQL   过程已成功完成。  
   
  SQL>   print   :n  
   
                    N  
  ----------  
                    4  
   
  SQL>   select   *   from   t1;  
   
                  ID   NAME  
  ----------   ----------  
                    1   aaa  
                    2   bbb  
                    3   ccc  
                    4   ddd  
   
  已选择4行。  
   
  SQL>   exec   :n:=return_id('eee');  
   
  PL/SQL   过程已成功完成。  
   
  SQL>   print   :n  
   
                    N  
  ----------  
                    5  
   
  SQL>   select   *   from   t1;  
   
                  ID   NAME  
  ----------   ----------  
                    1   aaa  
                    2   bbb  
                    3   ccc  
                    4   ddd  
                    5   eee  
   
  已选择5行。  
   
   
  Top

2 楼weilai_w(我的回忆)回复于 2005-07-28 09:46:03 得分 0

多谢   njhart2003,刚开始用oracle   不熟,学习中……  
   
  另:  
  id是主键,因为每次   insert   都是先检查一下是否已经有相同name,  
  虽然不是很严格,应该还不会有重复的记录(不过既然这样的话应该做成主键的),多谢提醒。  
   
  Top

相关问题

  • 如何学习存储过程?
  • 到底何谓存储过程?应该怎么开始学习存储过程?
  • 如果建这个存储过程?学习学习。
  • 要学习存储过程知识了,请教各位一个存储过程的简单问题
  • 怎么学习写,用数据库中的存储过程!?
  • 谁有存储过程的学习资料?
  • 100分求Oracle9i的存储过程的快速学习方法
  • 学习DB2,求助DB2存储过程的例子
  • 想通过实例学习"存储过程",怎样开始呢?
  • 存储过程

关键词

  • 函数
  • 学习
  • 选择
  • sql
  • t1
  • aaa2bbb3ccc
  • mysequence
  • 变量
  • 序列
  • pl

得分解答快速导航

  • 帖主:weilai_w
  • njhart2003

相关链接

  • Oracle类图书

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo