使⽤plsqldeveloper创建存储过程以及调试
前⾔~
今天莫名的接到⼀个任务,需要使⽤oracle定时任务和oracle存储过程来每⽇创建⼀个⽇志表,由于⼩编呢尚未接触过存储过程和定时任务,所以今天学习了⼀番,特定来总结⼀下。望能给予⼀些未接触过存储过程的⼩伙伴⼀些帮助。
今⼊今天的正题,⾸先要了解⼀下oracle的存储过程,都有哪些结构,⽽plsql是⼀个辅助⼯具,是能帮助我们更轻松的实现存储过程。
上述就是⼀个⽆参的存储过程实例,⼀个存储过程⼤体分为这么⼏个部分:
1)、创建语句:create or replace procedure 存储过程名称 [authid current_user] ;
“”[]“”中括号的内容是可选的,其表⽰修改存储过程,加⼊authid current_user时存储过程可以使⽤role权限。否则会报ORA-01031权限不⾜。
如果没有or replace语句,那只是新建⼀个存储过程,如果系统中存在相同的存储过程,则会报错,Create or replace procedure
如果系统中没有此存储过程就新建⼀个,如果系统中有此存储过程则把原来删除掉,重新创建⼀个存储过程。
存储过程名定义:包括存储过程名和参数列表、参数名和参数类型。参数列表可不写,如例⼦所⽰。参数名不能重复,并且每个参数之间⽤分号“ ;” 隔开, 参数传递⽅式:IN, OUT, IN OUT。如下⾯例⼦所⽰:
下⾯说明⼀下参数传递⽅式:
in:表⽰输⼊参数,调⽤存储过程时从外⾯传进来的,它的值不能修改。
out:表⽰输出参数,当⼀个参数被指定为OUT类型时,如果还未调⽤存储过程之前对该参数进⾏了赋
值,那么在存储过程中该参数的值仍然是null,但是如果在调⽤过程中对该参数进⾏赋值,那么值不为null。
in out:表⽰输⼊输出参数,它的值可以修改。
参数的数据类型只需要指明类型名即可,不需要指定宽度。参数的宽度由外部调⽤者决定。过程可以有参数,也可以没有参数。
我们看到例⼦中存在⼀个“”as“”,它表⽰变量声明块,可以理解为plsql中的declare关键字,⽤于声明变量。除了as外,还有is。变量声明块⽤于声明该存储过程需要⽤到的变量,它的作⽤域为该存储过程。另外这⾥声明的变量必须指定宽度。遵循PL/SQL的变量声明规范。
其中,as和is的区别:在视图(VIEW)中只能⽤AS不能⽤IS;
在游标(CURSOR)中只能⽤IS不能⽤AS。
过程语句块:从begin 关键字开始为过程的语句块。存储过程的具体逻辑在这⾥来实现。
异常处理块:关键字为exception ,为处理语句产⽣的异常。该部分为可选
结束块:由end关键字结果。
2)、下⾯讲解⼀下参数列表中参数的默认值
通过default 关键字为存储过程的参数指定默认值。在对存储过程调⽤时,就可以省略默认值。
值得注意的是:默认值仅仅⽀持IN传输类型的参数。OUT 和 IN OUT不能指定默认值
上述情况是default关键字修饰的是最后⼀个参数,如果是修饰第⼀个参数呢?
如果我们想使⽤第⼀个参数的默认值时,exec procdefault2('aa'); 这样是会报错的。
那怎么变呢?可以指定参数的值。
SQL> exec procdefault2(p2 =>'aa'); 这样就OK了,指定aa传给参数p2。
3)、继续讲解存储过程内部块
我们知道了存储过程的结构,语句块由begin开始,以end结束。这些块是可以嵌套。在语句块中可以嵌套任何以下的块:Declare …begin … exception … end;
需要注意变量的作⽤域。
4)、存储过程中的循环
存储过程的循环语句块有:in...loop、while和loop循环。下⾯分别给予相关实例。
(1)、in...loop
实例⼀ 循环遍历游标:
create or replace procedure proc_test
as
cursor c1
is
select * from dat_trade;
begin
for x in c1
loop
dbms_output.put_line (x.id);
end loop;
end proc_test;
实例⼆ 根据数值进⾏循环:
create or replace procedure proc_test (v_num in NUMBER)
as
begin
for x in 1..100 loop
dbms_output.put_line (x);
end loop;
end proc_test;
实例三 在过程⾥指定输⼊参数 v_num. 在调⽤过程时指定循环次数:create or replace procedure proc_test (v_num IN NUMBER)
as
begin
for x in 1 .. v_num
loop
dbms_output.put_line (x);
end loop;
end proc_test;
(2)、loop循环
loop
delete from orders
where senddate < to_char (add_months (sysdate, -3),'yyyy-mm-dd') and rownum < 1000; exit when SQL%ROWCOUNT < 1;
commit;
end loop;
这⾥的 SQL%ROWCOUNT 是隐⼠游标。 除了这个,还有其他⼏
个:%found,%notfound, %isopen。
(3)while循环:
create or replace procedure proc_test (v_num in number)
as
i number := 1;
begin
while i < v_num
loop
begin
i := i + 1;
dbms_output.put_line (i);
end;
end loop;
end proc_test;
5)、 存储过程中的判断
存储过程的判断语句块有:if 条件语句、case ... when ... end case两种
下⾯给出实例:
(1)、单if实例(if...d if; && if...d if;)
实例⼀:
create or replace procedure pro_test iscontinue语句执行过程
--逻辑判断变量
exit_table_data varchar2(40); --判断表数据是否存在--sql语句执⾏变量
execu_sql varchar2(2000);
begin
execu_sql := 'select count(*) from user';
execute immediate execu_sql into exit_table_data; if exit_table_data=0 then
execu_sql := 'insert into user values('⼤明')';
execute immediate execu_sql;
commit;
end if;
end pro_test;
实例⼆:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论