Oracle存储过程总结

1、存储过程:

  存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。

2、创建一个存储过程简要过程:

  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体的结束。

3、存储过程创建语法:

create or replace procedure 存储过程名(param1 in type,param2 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(‘打印信息’);
    Else if (判断条件) 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+异常名.

 4、oracle存储过程语法:

  1.判断语句:if 比较式 then begin end; end if;

    例:

create or replace procedure test1(x in number) as
  y integer(10, 4);
begin
  if x > 0 then
    y := 1;
  end if;
  if x < 0 then
    y := -1;
  end if;
  if x = 0 then
    y := 0;
  end if;
  DBMS_OUTPUT.put_line('y=' || y);
end test1;

 

plsql 中执行

declare param1 integer(10, 2);
begin
param1 := -2; test1(param1);
end;

执行结果:y=-1

  2.for循环

  For ... in ... LOOP 

  -- 执行语句 

  end LOOP; 

例:

create or replace procedure test2() as
  cursor testcursor is select uname from test_pro_users;
  name varchar(20);
begin
 for name in testcursor loop
   -- begin
      DBMS_OUTPUT.put_line('aa');
   -- end;
  end loop;
  commit;
end test2;

plsql中执行

begin
  test2();
end;
--有错误,待修改

 

 

例子

  --创建一个存储过程,名:test_pro
  create or replace procedure test_pro(uname   in varchar,
                                       itemnum out number) as
  --定义变量名
  itemaccount   number;
  likeuname     varchar(20);
  user_borndate date;
  vs_msg        varchar(1000);
  i            number;
  --定义游标
  cursor items is
    select * from test_pro_users where uname like '张小小%' order by uname;
begin
  --《测试1》
  --变量赋值
  --选择表中的uname和'张小小%'匹配的个数,保存到itemaccount
  select count(*)
    into itemaccount
    from test_pro_users
   where uname like '张小小%';
  --把itemaccount的值赋给itemnum
  itemnum := itemaccount;
  --输出
  DBMS_OUTPUT.put_line('uname:' || uname); --参数
  DBMS_OUTPUT.put_line('itemaccount:' || itemaccount); --变量
  --《测试2》
  --组合表插入到另一个表,这里组合test_pro_users中的uname,address和TEST_PRO_RELATIONSHIP中的father,mother,插入到TEST_PRO_USERINFO
  INSERT INTO TEST_PRO_USERINFO
    (UNAME, BORNDATE, FATHER, MOTHER, ADDRESS)
    SELECT T1.UNAME, T1.BORNDATE, T2.FATHER, T2.MOTHER, T1.ADDRESS
      FROM TEST_PRO_USERS T1, TEST_PRO_RELATIONSHIP T2
     WHERE T1.UNAME = T2.UNAME;
  --然后用内置的DBMS_OUTPUT对象的put_line方法打印出影响的记录行数,其中用到一个系统变量SQL%rowcount 
  DBMS_OUTPUT.put_line('插入记录数=' || SQL%rowcount || '');

  --《测试3》使用游标
  --items即为游标,在定义变量的时候就已经’初始化?‘,不知道算不算初始化。
  --遍历items中的每一条记录
  for item in items loop
    --取test_pro_users中对应记录的borndate,并且将值传给已定义的变量user_borndate
    select borndate
      into user_borndate
      from test_pro_users
     where uname = item.uname;
    --输出user_borndate的值
    DBMS_OUTPUT.put_line('user_borndate=' || user_borndate);
    --每个人的出生日期推迟12个月
    update test_pro_users
       set borndate = ADD_MONTHS(user_borndate, 12)
     where uname = item.uname;
  end loop;

  --while循环
  i:=0;
  while i < 10 LOOP
    begin
      i := i + 1;
      DBMS_OUTPUT.put_line('i=' || i);
    end;
  end LOOP;

  COMMIT;
end test_pro;

 

plsql中执行

  declare param1 varchar(20); param2 integer(10, 4);
begin
  param1 := '张小小'; test_pro(param1, param2);
--DBMS_OUTPUT.put_line('param1:' || param1 || ' ' || 'param2:' || param2);
end;

结果:

uname:张小小
itemaccount:4
插入记录数=4条
user_borndate=01-9月 -96
user_borndate=01-9月 -97
user_borndate=01-9月 -98
user_borndate=01-9月 -99
i=1
i=2
i=3
i=4
i=5
i=6
i=7
i=8
i=9
i=10

 

 

posted on 2013-09-09 21:55  Mr.SuYang  阅读(315)  评论(0)    收藏  举报

导航