初学数据库,相信大家跟我这个菜鸟一样,对“存储过程”这种此物只应天上有的东西,应该是有点望洋兴叹、望而生畏了,不过大家别怕,俗话说的好,不怕你不会,就怕就不学,让咱们一起学习一下吧!
因为工作中涉及到了参数模式的存储过程,所以就说这一块吧,不过我到现在也没搞明白,带参和不带参有啥具体区别,还望大家相互帮助,可以留言讨论。
首先创建一个需要传入表名的存储过程,代码如下
create or replace procedure table_test(table_name in varchar2)
is
str_test varchar2(10000);
begin
str_test := 'insert into '||table_name||'(key_id) values(1)';
dbms_output.put_line(str_test);
execute immediate str_test;
end;
其中table_name为传入的表名
刚开始的时候是这么写的
create or replace procedure table_test(table_name in varchar2)
is
--str_test varchar2(10000);
begin
--str_test := 'insert into '||table_name||'(key_id) values(1)';
--dbms_output.put_line(str_test);
--execute immediate str_test;
select * from table_name;
end;
这样写就会报错了,目测是存储过程不直接识别sql语句,需调用execute 函数执行才可以。
正确的就是第一次写的代码了
所以,创建存储过程,简单来说有这么几步,和我一样的菜鸟朋友们可以这么来做
一、创建存储过程
1.创建一个存储过程
create or replace procedure table_test(table_name in varchar2)(不要加分号)
过程名为table_test,参数名为table_name,类型为varchar2,in关键字不要忘了。
2.声明变量
is (不要加分号)
str_test varchar2(10000);(记得加分号)
变量名为str_test, 类型为varchar2,长度为10000;
注:不同于c中变量的声明,此处需要先写变量名,再写类型,c中是先写类型,再写变量名。
3.代码执行区
begin(没有分号)
str_test := 'insert into '||table_name||'(key_id) values(1)';(给str_test变量赋值,一句结束,加分号)
dbms_output.put_line(str_test);(输出str_test的内容,可通过输出的内容判断,参数名是否传正确)
execute immediate str_test;(执行sql语句串)
注:str_test := 'insert into '||table_name||'(key_id) values(1)'; 估计一开始可能会被'||table_name||'这个折磨的死去活来,后来同事一说才发现,原来这是拼接参数table_name的,首先是这一串'insert into ',然后是利用拼接符||拼接参数table_name,然后再用||拼接剩下的sql串'(key_id) values(1)',此处大家一定要小心。
4.结束执行区(求解释是结束的执行区还是整个存储过程,自己感觉结束的是执行区,和begin对应)
end;(有分号)
好啦,存储过程建好了,下面就得调用了,
二、调用存储过程
执行call table_test('account');
这里大家要注意了,因为table_test(table_name)参数table_name是verchar2类型,所以实参一定要加单引号,切记!!!!!!
好了,基本就这样,有问题大家可以留言讨论。这是最基本的,如果以后研究的多了,再贴上来跟大家分享。