首页 > 技术文章 > oracle存储过程创建语法及常见异常

heartwarming 2019-02-14 09:02 原文

oracle存储过程创建语法及常见异常:

 

oracle存储过程语法:

CREATE[ORReplace]PROCEDURE[schema.]procedure_name
  [(argument[{IN|OUT|INOUT}]datatype,
  ...
  argument[{IN|OUT|INOUT}]datatype)]
  {IS|AS}
  [descriptionpart说明部分]
  BEGIN
  SQLSTATEMENT语句序列
  [EXCEPTION例外处理]
  END[procedureName过程名];

oracle存储过程

www.MyException.Cn  网友分享于:2015-02-04  浏览:14746次

 

 

 

 一,oracle存储过程语法

 

1.oracle存储过程结构

CREATE OR REPLACE PROCEDURE oracle存储过程名字

(

    参数1 IN NUMBER,

    参数2 IN NUMBER

) IS

变量1 INTEGER :=0;

变量2 DATE;

BEGIN

END oracle存储过程名字

 

2.无返回值的oracle存储过程

create or replace procedure xs_proc_no is

begin

  insert into xuesheng values (3, 'wangwu', 90, 90);

  commit;

end xs_proc_no;

 

3.有单个数据值返回的oracle存储过程

create or replace procedure xs_proc(temp_name in varchar2,

                                    temp_num  out number) is

  num_1 number;

  num_2 number;

begin

  select yu_wen, shu_xue

    into num_1, num_2

    from xuesheng

   where xing_ming = temp_name;

  --dbms_output.put_line(num_1 + num_2);

  temp_num := num_1 + num_2;

end;

其中,以上两种与sql server基本类似,而对于返回数据集时,上述方法则不能满足我们的要求。在Oracle中,一般使用ref cursor来返回数据集。示例代码如下:

 

4.有返回值的oracle存储过程(列表返回)

首先,建立我们自己的包。并定义包中的一个自定义ref cursor

create or replace package mypackage as

  type my_cursor is ref cursor;

end mypackage;

在定义了ref cursor后,可以书写我们的程序代码

create or replace procedure xs_proc_list(shuxue   in number,

                                         p_cursor out mypackage.my_cursor) is

begin

  open p_cursor for

    select * from xuesheng where shu_xue > shuxue;

end xs_proc_list;

 

5.SELECT INTO STATEMENT

  将select查询的结果存入到变量中,可以同时将多个列存储多个变量中,必须有一条

  记录,否则抛出异常(若没有记录则抛出NO_DATA_FOUND)

  例子:

  BEGIN

  SELECT name,age into 变量1,变量2 FROM user where xxx;

  EXCEPTION

  WHEN NO_DATA_FOUND THEN

      xxxx;

  END;

  ...

 

6.IF 判断

  IF V_TEST=1 THEN

    BEGIN

       do something

    END;

  END IF;

 

7.WHILE 循环

  WHILE V_TEST=1 LOOP

  BEGIN

 XXXX

  END;

  END LOOP;

 

8.变量赋值

  V_TEST := 123;

 

9.用FOR IN 使用cursor

  ...

  IS

  CURSOR cur IS SELECT * FROM xxx;

  BEGIN

 FOR cur_result in cur LOOP

  BEGIN

   V_SUM :=cur_result.列名1+cur_result.列名2

  END;

 END LOOP;

  END;

 

10.带参数的CURSOR

  CURSOR C_USER(C_ID NUMBER) IS SELECT NAME FROM USER WHERE TYPEID=C_ID;

  OPEN C_USER(变量值);

  LOOP

 FETCH C_USER INTO V_NAME;

 EXIT FETCH C_USER%NOTFOUND;

    do something

  END LOOP;

  CLOSE C_USER;

 

11.用pl/sql developer debug

  连接数据库后建立一个Test WINDOW

  在窗口输入调用SP的代码,F9开始debug,CTRL+N单步调试

 

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

 

as

 

变量1 类型(值范围);

 

变量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表示输出

 

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

 

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

 

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

 

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

 

 

 

 

 

以命名的异常

 

命名的系统异常                          产生原因

 

ACCESS_INTO_NULL                   未定义对象

 

CASE_NOT_FOUND                     CASE 中若未包含相应的 WHEN ,并且没有设置

 

ELSE 时

 

COLLECTION_IS_NULL                集合元素未初始化

 

CURSER_ALREADY_OPEN          游标已经打开

 

DUP_VAL_ON_INDEX                   唯一索引对应的列上有重复的值

 

INVALID_CURSOR                 在不合法的游标上进行操作

 

INVALID_NUMBER                       内嵌的 SQL 语句不能将字符转换为数字

 

NO_DATA_FOUND                        使用 select into 未返回行,或应用索引表未初始化的

 

 

 

TOO_MANY_ROWS                      执行 select into 时,结果集超过一行

 

ZERO_DIVIDE                              除数为 0

 

SUBSCRIPT_BEYOND_COUNT     元素下标超过嵌套表或 VARRAY 的最大值

 

SUBSCRIPT_OUTSIDE_LIMIT       使用嵌套表或 VARRAY 时,将下标指定为负数

 

VALUE_ERROR                             赋值时,变量长度不足以容纳实际数据

 

LOGIN_DENIED                           PL/SQL 应用程序连接到 oracle 数据库时,提供了不

 

正确的用户名或密码

 

NOT_LOGGED_ON                       PL/SQL 应用程序在没有连接 oralce 数据库的情况下

 

访问数据

 

PROGRAM_ERROR                       PL/SQL 内部问题,可能需要重装数据字典& pl./SQL

 

系统包

 

ROWTYPE_MISMATCH                宿主游标变量与 PL/SQL 游标变量的返回类型不兼容

 

SELF_IS_NULL                             使用对象类型时,在 null 对象上调用对象方法

 

STORAGE_ERROR                        运行 PL/SQL 时,超出内存空间

 

SYS_INVALID_ID                         无效的 ROWID 字符串

 

TIMEOUT_ON_RESOURCE         Oracle 在等待资源时超时  

推荐阅读