oracle資料庫預存程序教程

來源:互聯網
上載者:User

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.