存储过程学习

需求:需要每天去执行一个SQL语句,更改一些数据。

方法:用Oracle自带的job.

首先编写一个简单的存储过程:

create or replace procedure p_gen_wfwzdj_zlxqgz_4job is
  /********************************************
      功能: 由于违法违章登记中责令限期改正后状态不反写,
       明天用job调用该存储过程,实现反写
  ********************************************
  编写: yanzhenwei
  时间: 2012-07-06
  *********************************************/
begin

  UPDATE FZ_WFWZDJB A
     SET A.WFWZZT_DM = '13'
   WHERE A.WFWZZT_DM = '01'
     AND EXISTS (SELECT 1
            FROM FZ_ZLXQGZTZS B
           WHERE A.AJ_BH = B.AJ_BH
             AND B.XG_ZT = '17');
  commit;
end p_gen_wfwzdj_zlxqgz_4job;

 

接着新建一个job,调用存储过程,写入执行时间,和循环时间即可。

一、存储过程的学习

    1  CREATE OR REPLACE PROCEDURE 存储过程名

   IS

   BEGIN

  4  NULL;

   END;

 

行1:  CREATE OR REPLACE PROCEDURE 是一个SQL语句通知Oracle数据库去创建一个叫做skeleton存储过程, 如果存在就覆盖它;

行2:  IS关键词表明后面将跟随一个PL/SQL体。

行3:  BEGIN关键词表明PL/SQL体的开始。

行4:  NULL PL/SQL语句表明什么事都不做,这句不能删去,因为PL/SQL体中至少需要有一句;

行5:  END关键词表明PL/SQL体的结束.

create or replace procedure 存储过程名(param1 in typeparam2 out type) 

as 

变量1 类型(值范围); --vs_msg   VARCHAR2(4000); 

变量2 类型(值范围);

创建的基本语法:

Begin

Select count(*) into 变量1 from 表A where列名=param1;

 

    If (判断条件) then

       Select 列名 into 变量2 from 表A where列名=param1;

       Dbms_output.Put_line(‘打印信息');

    Elsif (判断条件) then

       Dbms_output.Put_line(‘打印信息');

    Else

       Raise 异常名(NO_DATA_FOUND);

    End if;

Exception

    When others then

       Rollback;

End;

 

 

注意事项:

1, 存储过程参数不带取值范围,in表示传入,out表示输出

类型可以使用任意Oracle中的合法类型。

2,  变量带取值范围,后面接分号

3,  在判断语句前最好先用count(*)函数判断是否存在该条操作记录

4,  用select 。。。into。。。给变量赋值

5,  在代码中抛异常用 raise+异常名

 

语法实例:

1 、判断语句: 

  

if 比较式 then begin end; end if; 

create or replace procedure test(x in number) is 

begin 

        if x >0 then 

         begin 

        x := 0 - x; 

        end; 

    end if; 

    if x = 0 then 

       begin 

        x: = 1; 

    end; 

    end if; 

end test; 

 

2 、For 循环 

For ... in ... LOOP 

-- 执行语句 

end LOOP; 

(1) 循环遍历游标 

create or replace procedure test() as 

Cursor cursor is select name from student; name varchar(20); 

begin 

for name in cursor LOOP 

begin 

 dbms_output.putline(name);  

end; 

end LOOP; 

end test; 

 

(2) 循环遍历数组 

   

create or replace procedure test(varArray in myPackage.TestArray) as 

--( 输入参数varArray 是自定义的数组类型,定义方式见标题6) 

i number; 

begin 

i := 1;  -- 存储过程数组是起始位置是从1 开始的,与java 、C 、C++ 等语言不同。因为在Oracle 中本是没有数组的概念的,数组其实就是一张 

-- 表(Table), 每个数组元素就是表中的一个记录,所以遍历数组时就相当于从表中的第一条记录开始遍历 

for i in 1..varArray.count LOOP      

dbms_output.putline('The No.'|| i || 'record in varArray is:'||varArray(i));    

 end LOOP; 

end test; 

 3 、While 循环 

while 条件语句 LOOP 

begin 

end; 

end LOOP; 

create or replace procedure test(i in number) as 

begin 

while i < 10 LOOP 

begin     

 i:= i + 1; 

end; 

end LOOP; 

 end test; 

  

你可能感兴趣的:(存储过程)