oracle数据库存储过程教程

作者:袖梨 2022-06-29

要创建一个过程对象(procedural object),必须有 CREATE PROCEDURE 系统权限。如果这个过程对象需要被其他的用户schema 使用,那么你必须有 CREATE ANY PROCEDURE 权限。执行 procedure 的时候,可能需要excute权限。或者EXCUTE ANY PROCEDURE 权限

如果单独赋予权限,如下例所示: 

grant  execute on MY_PROCEDURE  to Jelly


创建一个存储过程

 代码如下 复制代码

create or replace procedure proc_data_check is
 
--定义变量
 
V_LOCK_ID            INTEGER;
 
v_lockhandle         VARCHAR(128);
 
V_RELEASE_ID         INTEGER;
 
--定义出错异常信息编码
 
v_error_code VARCHAR2(10) := '';
 
--定义错误异常描述信息
 
v_error_message VARCHAR2(1000) := '';
 
cursor check_orgs is
 
select org_code, org_name from check_org;
 
begin
 
DBMS_LOCK.ALLOCATE_UNIQUE('PROC_DATA_CHECK', v_lockhandle, 86400);
 
V_LOCK_ID := DBMS_LOCK.REQUEST(v_lockhandle, DBMS_LOCK.X_MODE, 0, FALSE);
 
if (V_LOCK_ID = 0) then
 
for check_org in check_orgs loop
 
null;
 
end loop;
 
V_RELEASE_ID := dbms_lock.release(v_lockhandle);
 
COMMIT;
 
end if;
 
commit;
 
EXCEPTION
 
WHEN OTHERS THEN
 
V_RELEASE_ID := dbms_lock.release(v_lockhandle);
 
--得到异常编码
 
V_ERROR_CODE := SQLCODE;
 
--得到异常描述信息
 
V_ERROR_MESSAGE := SQLERRM;
 
--将异常信息维护到异常表中
 
end proc_data_check;


修改一个存储过程

让我们写一个输出字符串“Hello World!”的存储过程,用Notepad打开你的skeleton.sql 文件,. 用DBMS_OUTPUT.PUT_LINE 过程调用去替换NULL语句,如下所示:

 代码如下 复制代码
CREATE OR REPLACE PROCEDURE skeleton
IS
BEGIN
DBMS_OUTPUT.PUT_LINE('Hello World!');
END;

保存到文件skeleton.sql.
从SQL*Plus命令行, 打开文件skeleton.sql .

 代码如下 复制代码
SQL> @skeleton
SQL>
CREATE OR REPLACE PROCEDURE skeleton
IS
BEGIN
DBMS_OUTPUT.PUT_LINE('Hello World!');
* END;
SQL> /
SQL*Plus 通知你存储过程成功创建并输出提示信息:Procedure created.
SQL>

用EXECUTE 命令运行你的存储过程:

 代码如下 复制代码
SQL> EXECUTE skeleton;

SQL*Plus显 示存储过程运行成功:PL/SQL procedure successfully completed.
我们想要的输出字符串 "Hello World!"没有出来,在显示一个DBMS_OUTPUT.PUT_LINE 结果前需要运行一个SET命令,在SQL*Plus 命令行提示符,键入:

 代码如下 复制代码
SQL> SET SERVEROUTPUT ON
再次执行你的存储过程:
SQL> EXECUTE skeleton;
现在结果输出了:Hello World!

PL/SQL procedure successfully completed.


存储过程(PROCEDURE)和函数(FUNCTION)的区别。

function有返回值,并且可以直接在Query中引用function和或者使用function的返回值。

本质上没有区别,都是 PL/SQL 程序,都可以有返回值。最根本的区别是: 存储过程是命令,  而函数是表达式的一部分。比如:

select max(NAME) FROM

但是不能 exec max(NAME) 如果此时max是函数。

PACKAGE是function,procedure,variables 和sql 语句的组合。package允许多个procedure使用同一个变量和游标。

相关文章

精彩推荐