1 2 3 4 5 6 7 8 9 10 11 12 | declare realsal emp.sal%type; realname varchar(40); realjob varchar(40); begin//过程调用开始 realsal:=1100; realname:=''; realjob:='CLERK'; --指定值对应变量顺序可变 runbyparmeters(sname=>realname,isal=>realsal,sjob=>realjob); DBMS_OUTPUT.PUT_LINE(REALNAME||' '||REALJOB); END; //过程调用结束 |
(3)过程调用方式三(SQL命令行方式下)
1、SQL>exec proc_emp(‘参数1’,’参数2’);//无返回值过程调用
2、SQL>var vsal number
SQL> exec proc_emp (‘参数1’,:vsal);// 有返回值过程调用
或者:call proc_emp (‘参数1’,:vsal);// 有返回值过程调用
存储过程创建语法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | create[orreplace] procedure存储过程名(param1 intype,param2 outtype) as 变量1 类型(值范围); 变量2 类型(值范围); Begin Selectcount(*) 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); Endif; Exception Whenothers then Rollback; End; |
注意事项
存储过程参数不带取值范围,in表示传入,out表示输出; 变量带取值范围,后面接分号; 在判断语句前最好先用count(*)函数判断是否存在该条操作记录; 用select … into … 给变量赋值; 在代码中抛异常用 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 在等待资源时超时
基本语法1. 基本结构
1 2 3 4 5 6 7 8 9 10 | CREATEORREPLACEPROCEDURE存储过程名字 ( 参数1 INNUMBER, 参数2 INNUMBER ) IS 变量1 INTEGER:=0; 变量2 DATE; BEGIN --执行体 END存储过程名字; |
2. SELECT INTO STATEMENT
将select查询的结果存入到变量中,可以同时将多个列存储多个变量中,必须有一条记录,否则抛出异常(如果没有记录抛出NO_DATA_FOUND)
例子:
1 2 3 4 5 6 | BEGIN SELECTcol1,col2 into变量1,变量2 FROMtypestruct wherexxx; EXCEPTION WHENNO_DATA_FOUND THEN xxxx; END; |
3. IF 判断
1 2 3 4 5 | IF V_TEST = 1 THEN BEGIN do something END; ENDIF; |
4. while 循环
1 2 3 4 5 | WHILE V_TEST=1 LOOP BEGIN XXXX END; ENDLOOP; |
5. 变量赋值
1 | V_TEST := 123; |
6. 用for in 使用cursor
本文地址:百科问答频道 https://www.neebe.cn/wenda/930785_2.html,易企推百科一个免费的知识分享平台,本站部分文章来网络分享,本着互联网分享的精神,如有涉及到您的权益,请联系我们删除,谢谢!