對比應用程式
存儲在當前的套用中安全性由資料庫提供安全保證,必須通過授權才能使用存儲子程式
安全性靠應用程式來保證,如果能執行應用程式,就能執行該子程式。
| | |
| | |
| | |
| | |
| | |
| 由資料庫提供安全保證,必須通過授權才能使用存儲子程式 | 安全性靠應用程式來保證,如果能執行應用程式,就能執行該 子程式。 |
由資料庫提供安全保證,必須通過授權
才能使用存儲子程式
安全性靠應用程式來保證,如果能執
行應用程式,就能執行該子程式。
語法
CREATE [ORReplace]
PROCEDURE[schema.] procedure_name
[(argument [{IN|OUT|INOUT}] datatype,
...
argument [{IN|OUT|INOUT}] datatype)]
{IS | AS}
[descriptionpart說明部分]
BEGIN
SQLSTATEMENT語句序列
[EXCEPTION例外處理]
END[procedureName過程名];
語法分析
ORREPLACE
是一個可選的關鍵字,建議用戶使用此關鍵字。如果過程已經存在,該關鍵字將重新創建過程,這樣就不必刪除和重新創建過程。
關鍵字IS和AS均可,
形式參數可以有三種模式:IN、OUT、INOUT。如果沒有為形式參數指定模式,那么默認的模式是IN。
IN表示輸入參數
OUT表示輸出參數
SQL>create or replace procedure helloworld
as
begin
end;
/
註:需要在存儲過程輸入完成後回車,下一行輸入”/”回車,才會創建成功。
當提示Procedurecreated表示存儲過程創建成功。
執行
SQL>set serveroutput on;
SQL>exec[ute] helloworld;
顯示如下結果
PL/SQL procedure successfully completed
編譯過程
注意:
存儲過程不論創建是否成功,創建過程/函式命令CREATEPROCEDURE或CREATEFUNCTION都將自動把其
原始碼存入資料庫中,而編譯代碼只有在編譯成功後才能存入資料庫中。
只有編譯代碼被存入到資料庫的存儲過程和函式才能被調用。
也就是說,如果你創建存儲過程的語句是錯誤的,那么存儲過程的原始碼也會放入資料庫,只是被顯示為錯誤。
查看錯誤請用USER_ERRORS
數據字典或用SHOWERRORS命令,可以查詢到當前系統中錯誤。
帶參存儲過程
模式描述IN參數(默認模式)(輸入參數)用來從調用環境中向
存儲過程傳遞值,不能給IN參數賦值,給此
參數傳遞的值可以是常量、有值的變數、表達式等。
OUT參數(輸出參數)用來從過程中返回值給調用者,不能將此參數的值賦給另一個變數,不能是常量或表達式。在過程體內,必須給OUT參數
賦值。INOUT參數(輸入輸出參數)既可以從調用者向過程中傳遞值,執行過程後還可返回可能改變了的值給調用者。
| |
| 用來從調用環境中向 存儲過程傳遞值,不能給IN參數賦值,給此 參數傳遞的值可以是常量、有值的變數、表達式等。 |
| 用來從過程中返回值給調用者,不能將此參數的值賦給另一個變數,不能是常量或表達式。在過程體內,必須給OUT參數賦值。 |
| 既可以從調用者向過程中傳遞值,執行過程後還可返回可能改變了的值給調用者。 |
模式
描述
用來從調用環境中向存儲過程傳遞值,不能給IN參數
賦值,
給此
參數傳遞的值可以是常量、有值的變數、表達式等。
用來從過程中
返回值給調用者,不能將此參數的值賦給另
一個變數,不能是常量或表達式。在過程體內,必須給
OUT參數賦值。
既可以從調用者向過程中傳遞值,執行過程後還可返回可能
改變了的值給調用者。
1、帶參存儲過程(輸入參數)
SQL>create or replace procedure helloTom(pname in varchar2)
as
begin
dbms_output.put_line('hello'||pname||'!');
end;
SQL>/
執行
SQL>set serveroutput on;
SQL>exec helloTom('jerry');
顯示如下結果
hellojerry!
PL/SQL procedure successfully completed
註:由於
存儲過程是高度過程化語言,所以‘+’為能像
面向對象一樣被
重載為字元串相加,所以在存儲過程語法中使用‘||’表示字元串相加操作。輸入參數可省略in如(pname varchar2)
2、帶參存儲過程(輸出參數)
SQL>create or replace procedure writeTom(pname out varchar2)
as
begin
select name into pname from t1 where rownum=1;
end;
SQL>/
帶輸出參數存儲過程的調用格式:
(1)綁定參數值
variable輸出參數變數1,輸出參數變數2…;
調用存儲過程
EXEC[UTE]procedure_name(參數值1…參數名n,:
綁定變數1,,:綁定變數2….);
SQL>variable pname varchar2(40);
SQL>exec writeTom(:pname);
(2)在程式塊中調用存儲過程
2pname varchar2(40);
3begin
4writeTom(pname);
5dbms_output.put_line(pname);
6end;
7/
3、帶參存儲過程(inout參數)
SQL>create or replace procedure inoutTom(pname in out varchar2)
as
begin
select name into pname fromt1 where id=pname;
end;
SQL>/
執行
2pname varchar2(30):='1';
3begin
4inoutTom(pname);
5dbms_output.put_line(pname);
6end;
7/
4、參數規則
如果形式參數是OUT模式的參數,實際參數必須是一個變數,當調用過程後,此變數就被
賦值了。可以輸出此變數的值來測試過程執行的結果。
如果形式參數是INOUT模式的參數,則實際參數必須是一個預先已經賦值的變數。執行完過程後,該變數被重新賦值,可以輸出此變數的值來測試過程執行結果。