[学习] 求存储过程
表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




