要创建一个过程对象(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 |
修改一个存储过程
让我们写一个输出字符串“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使用同一个变量和游标。