要建立一個過程對象(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使用同一個變數和遊標。