暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

PL/SQL详解之存储过程

Oracle微学堂 2018-10-30
841

1
概念

存储过程相当于一个有名字的PL/SQL块,经过第一次编译后再次调用时不需要再次编译

创建格式:

CREATE [OR REPLACE] PROCEDURE proc_name [list of parameters]

IS   

   Declaration section

BEGIN   

   Execution section 

EXCEPTION   

  Exception section

END;

返回值:

可有可没有

2
案列分析

1> CREATE OR REPLACE PROCEDURE employer_details

2> IS

3>  CURSOR emp_cur IS

4>  SELECT first_name, last_name, salary FROM emp_tbl;

5>  emp_rec emp_cur%rowtype;

6> BEGIN

7>  FOR emp_rec in sales_cur

8>  LOOP

9>  dbms_output.put_line(emp_cur.first_name || ' ' ||emp_cur.last_name

10>    || ' ' ||emp_cur.salary);

11> END LOOP;

12>END;

13>

执行:

1)  EXECUTE [or EXEC] procedure_name; 

2) 在另一个存储过程里面时:  procedure_name;

3
存储过程的参数

创建存储过程
CREATE OR REPLACE PROCEDURE UpdateAuths(
    p_AuthsCode auths.author_code%TYPE,
    p_AuthsSalary auths.salary%TYPE)
AS
BEGIN
    UPDATE auths
        SET salary=p_AuthsSalary
        WHERE author_code=p_AuthsCode;
    COMMIT;
END UpdateAuths;
调用存储过程
DECLARE
    v_authorcode auths.author_code%TYPE:='A0001';
    v_salary auths.salary%TYPE:=350;
BEGIN
    UpdateAuths(v_authorcode,v_salary);
END;
形参和实参
p_AuthsSalary,p_AuthsCode为形式参数
v_authorcode,v_salary为实际参数
关键字代表参数的三种不同模式
IN:当调用存储过程的时候,该模式的形参接收对应实参的值,并且该形参是只读的,即不能被修改。如果在创建存储过程时没有指定参数的模式,则默认为IN。
OUT:在存储过程中,该形参被认为是只能写,即只能为其赋值。在存储过程中不能读它的值。返回时,将该形参值传给相应的实参。 
IN OUT:该模式是前两种模式的合并。
2)存储过程的处理部分
    一个PL/SQL块,该块包含定义部分、可执行部分以及异常处理部分,其中可执行部分是必须有的。
CREATE OR REPLACE 过程名
(
    --参数定义部分
)    
IS
    --局部变量定义部分
BEGIN
    --可执行部分
EXCEPTION
    --异常处理部分
END 过程名;
在END后加上存储过程名是可选的,只是为了增加程序的可读性。如果加上,则必须要和前面的存储过程名相同。
1.2存储过程的参数
1)参数的数据类型
    在定义一个存储过程参数时,不能指定CHAR类型和VARCHAR2类型形参的长度,也不能指定NUMBER形参的精度和标度。这些约束有实参来传递。  
CREATE OR REPLACE PROCEDURE proc_auths(
    --参数定义了类型长度,这将产生编译错误。
    p_code IN OUT VARCHAR2(6),
    P_salary OUT NUMBER(8,2)) AS
BEGIN
    ...
END proc_auths;
应修改为:
CREATE OR REPLACE PROCEDURE proc_auths(
    p_code IN OUT VARCHAR2,
    P_salary OUT NUMBER) AS
BEGIN
    SELECT salary INTO p_salary
        FROM auths
        WHERE author_code=p_code;
END proc_auths; 
调用存储过程:
DECLARE
    v_code VARCHAR2(6);
    v_salary NUMBER(8,2);
BEGIN
    v_code:='A0001';
    proc_auths(v_code,v_salary);
END;
如果使用%TYPE为参数定义类型,那么该参数将具有定义在形参上而不是通过实参传递的数据长度。
CREATE OR REPLACE PROCEDURE query_salary(
    p_code IN OUT auths.author_code%TYPE,
    P_salary OUT auths.salary%TYPE) AS
BEGIN
    ...
END query_salary; 
如上面的存储过程,由于auths表中的author_code字段长度为6,因此p_code的长度也为6。
2)参数的传值方式
位置表示法
    实参通过位置与形参进行联系。
名称表示法
    实参是与形参的名称进行联系。
定义一个存储过程
CREATE OR REPLACE PROCEDURE insert_auths(
    p_code auths.author_code%TYPE,
    p_name auths.name%TYPE) AS
BEGIN
    INSERT INTO auths(author_code,name) VALUES(p_code,p_name);
END insert_auths;
DECLARE
    v_code VARCHAR2(6);
    v_name VARCHAR2(12);
BEGIN
    v_code:='A0001';
    v_name:='张三';
    --使用位置表示法调用
    insert_auths(v_code,v_name);
    --使用命名表示法调用
    insert_auths(p_name-->v_name,p_code-->v_code);
END;
两种表示法可以混合使用。但是,当调用存储过程中出现了第一个命名表示法的参数时,后面的参数也必须使用命名表示法传值。
3)参数的缺省值
类似于变量的声明,一个过程或函数的形参可以有缺省值。如果参数有缺省值,那么在调用时就可以不用给它传值,只使用缺省值。如果给它传值,则实参的值代替缺省的值。
参数缺省值声明如下:
parameter [mode] datatype {:=|DEFAULT} initial_value
parameter是形参名称
mode是参数模式
datatype是参数的类型
initial_value用来为形参指定缺省值
使用关键字DEFAULT或":="来指定一个缺省值。
CREATE OR REPLACE PROCEDURE insert_auths(
    p_code auths.author_code%TYPE :='A0001',
    p_name auths.name%TYPE DEFAULT '张三'
) AS
BEGIN
    ...
END insert_auths;

扫描二维码关注我的微学堂

搜索刘老师微信号:Rman-2014,备注“Oracle学习与咨询”,即可添加好友;或者扫描下面二维码,关注我的“微学堂”公众号,了解最新OCP认证动态、题库及答案解析、培训机构及讲师介绍、课堂授课内容等。每天还有一篇技术文章发布哦!




最后修改时间:2019-12-20 16:31:22
文章转载自Oracle微学堂,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论