oracle学习笔记(5)-存储过程

存储过程:
存储子程序是被命名的PL/SQL块,以编译的形式存储在数据库服务器中,可以在应用程序中进行调用,是PL/SQL程序模块化的一种体现。
PL/SQL中的存储子程序包括存储过程和(存储)函数两种。 
存储子程序是以独立对象的形式存储在数据库服务器中,因此是一种全局结构,与之对应的是局部子程序,即嵌套在PL/SQL块中的局部过程和函数,其存储位置取决于其所在的父块的位置。 
存储过程的创建:
CREATE OR REPLACE PROCEDURE procedure_name 
(param1 datatype,
param2 datatype [DEFAULT:= value]
) AS|IS
   /*Declarative section is here */
BEGIN
/*Executable section is here*/ 
EXCEPTION
/*Exception section is here*/ 
END procedure_name;


参数的模式 
IN(默认参数模式)表示当过程被调用时,实参值被传递给形参;
在过程内,形参起常量作用,只能读该参数,而不能修改该参数;
当子程序调用结束返回调用环境时,实参没有被改变。IN模式参数可以是常量或表达式。
OUT表示当过程被调用时,实参值被忽略;
在过程内,形参起未初始化的PL/SQL变量的作用,初始值为NULL,可以进行读/写操作;
当子程序调用结束后返回调用环境时,形参值被赋给实参。OUT模式参数只能是变量,不能是常量或表达式。
IN OUT表示当过程被调用时,实参值被传递给形参;
在过程内,形参起已初始化的PL/SQL变量的作用,可读可写;
当子程序调用结束返回调用环境时,形参值被赋给实参。IN OUT模式参数只能是变量,不能是常量或表达式。 

参数的限制
在声明形参时,不能定义形参的长度或精度、刻度,它们是作为参数传递机制的一部分被传递的,是由实参决定的。
参数传递方式
当子程序被调用时,实参与形参之间值的传递方式取决于参数的模式。IN参数为引用传递,即实参的指针被传递给形参;OUT,IN OUT参数为值传递,即实参的值被复制给形参。
参数默认值
可以为参数设置默认值,这样存储过程被调用时如果没有给该参数传递值,则采用默认值。需要注意,有默认值的参数应该放在参数列表的最后。 
例子:创建一个存储过程,以部门号为参数,查询该部门的平均工资,并输出该部门中比平均工资高的员工号、员工名。
CREATE OR REPLACE PROCEDURE pro_emp( 
    p_deptno IN emp.deptno%TYPE)IS
    v_sal emp.sal%TYPE;
BEGIN
    SELECT AVG(sal) INTO v_sal FROM emp WHERE deptno = p_deptno;
    FOR v_emp IN (select * from emp where deptno = p_deptno and sal > v_sal) LOOP
    DBMS_OUTPUT.PUT_LINE(v_emp.empno || ' ' || v_emp.ename)
    END LOOP;
EXCEPTION
    WHEN NO_DATA_FOUND THEN
    DBMS_OUTPUT.PUT_LINE('THE DEPARTMENT DOES NOT EXISTS !')
END;

存储过程的调用:
在SQL*PLUS中调用
EXEC  procedure_name(parameter_list)
EXECUTE show_emp(10)
在PL/SQL块中调用
BEGIN
procedure_name(parameter_list);
END;
注意
在PL/SQL程序中,存储过程可以作为一个独立的表达式被调用。 


存储过程的管理
修改存储过程 
CREATE OR REPLACE PROCEDURE procedure_name
查看存储过程及其源代码 
查询数据字典视图USER_SOURCE
SELECT name,text FROM user_source 
WHERE type='PROCEDURE'; 
重新编译存储过程 
ALTER PROCEDURE…COMPILE 
ALTER PROCEDURE show_emp COMPILE; 
删除存储过程 
DROP PROCEDURE
DROP PROCEDURE show_emp;

猜你喜欢

转载自blog.csdn.net/lucca_hello/article/details/80068027