语法:CREATE OR REPLACE PROCEDURE procedure_name
[(parameter1 IN|OUT|IN OUT data_type,
...
parametern IN|OUT|INOUT data_type
)]
IS|AS
[declaration_section;]
BEGIN
procedure_body;
[EXCEPTION exception_handlers]
END [procedure_name];
说明:
参数传递方式:IN, OUT, IN OUT
IN:表示输入参数,按值传递方式。如果存储过程的参数没有指定参数传递类型,默认为IN;参数列表中为IN参数赋予一个默认值,不能为OUT、IN OUT参数赋予默认值。
OUT:表示输出参数,可以理解为按引用传递方式。可以作为存储过程的输出结果,供外部调用者使用。
IN OUT:即可作输入参数,也可作输出参数。
参数的数据类型只需要指明类型名即可,不需要指定宽度,参数的宽度由外部调用者决定。
--样例
1、创建存储过程
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
CRCREATE OR REPLACE PROCEDURE procedure_xju(
p_para1 VARCHAR2,
p_para2 out NUMBER,
p_para3 in out VARCHAR2
)
AS
v_name varchar2(20);
BEGIN
p_para2 :=123456789;
v_name := '张三' ;
p_para3 := v_name;
DBMS_OUTPUT.PUT_LINE( 'p_para1参数值为:' ||p_para1);
DBMS_OUTPUT.PUT_LINE( 'p_para2参数值为:' ||p_para2);
DBMS_OUTPUT.PUT_LINE( 'p_para3参数值为:' ||p_para3);
END procedure_xju;
|
2、调用存储过程
2.1 使用execute命令调用过程
2.2 使用call命令调用过程
SQL> var p1 VARCHAR2(10)
SQL> var p2 NUMBER
SQL> var p3 VARCHAR2(10)
SQL> exec procedure_xju(:p1,:p2,:p3)
输出结果为:
p_para1参数值为:第一个参数
p_para2参数值为:123456789
p_para3参数值为:张三
PL/SQL procedure successfully completed
查看参数值:
SQL> print p1
p1
---------
第一个参数
SQL> print p2
p2
---------
123456789
SQL> print p3
p3
---------
张三
3、传递变量和数据
为存储过程参数传递变量和数据有三种方法:
3.1 位置传递
SQL> exec procedure_xju(:p1,:p2,:p3)
或:
SQL> exec procedure_xju('第一个参数',:p2,:p3)
3.2 名称传递
SQL> exec procedure_xju(p_para1=>:p1,p_para3=>:p3,p_para2=>:p2)
或:
SQL> exec procedure_xju(p_para1=>'第一个参数',p_para3=>:p3,p_para2=>:p2)
3.3 组合传递
SQL> exec procedure_xju(:p1,p_para3=>:p3,p_para2=>:p2)
或
SQL> exec procedure_xju('第一个参数',p_para3=>:p3,p_para2=>:p2)
4、查看存储过程源代码
SQL> select text FROM user_source WHERE name='PROCEDURE_XJU';
备注:存储过程名称必须大写。
5、将过程的执行权限授予其他用户
GRANT EXECUTE ON PROCEDURE_XJU TO PUBLIC;
6、删除存储过程
SQL>DROP PROCEDURE procedure_xju;
示例一:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
CREATE OR REPLACE PROCEDURE find_emp(p_empno IN NUMBER:=7900)
AS
empname varchar2(20);
BEGIN
select ename into empname from emp where empno=p_empno;
dbms_output.put_line( '雇员编号:' ||p_empno|| ',雇员姓名是:' ||empname);
exception
when no_data_found then
dbms_output.put_line( '雇员编号未找到' );
end find_emp;
SQL> exec find_emp();
雇员编号:7900,雇员姓名是:JAMES
PL/SQL procedure successfully completed
|
备注:输入参数设置了默认值。
示例二
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
create or replace procedure procedure_test(p_para1 varchar2,p_para2 out number)
is
v_sal number;
begin
select sal into v_sal from emp where empno=p_para1;
if v_sal<2000 then
p_para2:=1000;
else
p_para2:=500;
end if;
end ;
调用带 OUT 参数的过程:
declare
p2 number;
begin
procedure_test( '7900' ,p2);
dbms_output.put_line( 'p2的值为:' ||p2);
end ;
|
输出结果:p2的值为:1000
本文转自stock0991 51CTO博客,原文链接:http://blog.51cto.com/qing0991/1597943,如需转载请自行联系原作者