【www.bbyears.com--Oracle教程】
要创建一个过程对象(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 skeletonIS
BEGIN
DBMS_OUTPUT.PUT_LINE("Hello World!");
END;
保存到文件skeleton.sql.
从SQL*Plus命令行, 打开文件skeleton.sql .
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> 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使用同一个变量和游标。