plsql語法之_PRAGMA RESTRICT_REFERENCES()
oracle 包純度級別
PRAGMA RESTRICT_REFERENCES(),這個PRAGMA比較複雜, 總的來說,它是一個程式輔助檢驗碼,檢查子程式的純度(PURITY),幫助檢驗子程式是否有違反規則的地方。一般用在函式上,但當函式呼叫過程時,也要作相應的設定檢查。這是為了避免當在DML語句上呼叫函式時正常執行不至於產生錯誤。語法,PRAGMA RESTRICT_REFERENCES(function_name | default , )RNDS, WNDS, RNPS, WNPS) | , TRUST);
RNDS,WNDS,RNPS,WNPS可以同時指定。但當TRUST指定是,其它的被忽略。
DEFAUT是指作用在該程式包上的所有子程式,函式。
RNDS(Read No Database State),規定子程式不能讀取任何的資料庫狀態資訊。(即不會查詢資料庫的任何表,包括DUAL虛表)
RNPS(Read No Package State),規定子程式不能讀取任何程式包的狀態資訊,如變數等。
WNDS(Write No Database State),規定子程式不能向資料庫寫入任何資訊。(即不能修改資料庫表)
WNPS(Write No Package State),規定子程式不能向程式包寫入任何資訊。(即不能修改程式包變數的值)
TRUST,指出子程式是可以相信的不會違反一個或多個規則。這個選項是需要的當用C或JAVA寫的函式透過PL/SQL呼叫時,因為PL/SQL在執行是對它們不能檢查。
示例:
create or replace package purity is
minsal number(9);
maxsal number(9);
function max_sal return number;
function min_sal return number;
pragma restrict_references(max_sal, wnps);
pragma restrict_references(min_sal, wnps);
end;
create or replace package body purity is
function max_sal return number as
begin
select max(sal) into maxsal from emp; return maxsal;
end;
function min_sal return number as
begin
select min(sal) into minsal from emp; return minsal;
end;
對該包進行編譯時提示“PACKAGE BODY SCOTT.PURITY 編譯錯誤
錯誤:PLS-00452: 子程式 'MAX_SAL' 違反了它的相關編譯指示
行:2
文字:function max_sal return number
錯誤:PLS-00452: 子程式 'MIN_SAL' 違反了它的相關編譯指示
行:10
文字:function min_sal return number”
因為規定了包中的函式不能修改包中的變數,在函式max_sal和min_sal中進行賦值操作時改變了包的變數minsal和maxsal,因此導致編譯錯誤。
修改如下:即函式只讀但不做修改包變數:
create or replace package purity is
minsal number(9);
maxsal number(9);
function max_sal return number;
function min_sal return number;
pragma restrict_references(max_sal, wnps);
pragma restrict_references(min_sal, wnps);
end;
create or replace package body purity is
function max_sal return number as
begin
return maxsal;
end;
function min_sal return number as
begin
return minsal;
end;
begin
select min(sal), max(sal) into minsal, maxsal from emp;
end;
--呼叫包的公用函式
SQL> var minsal number;
SQL> var maxsal number;
SQL> exec :minsal:=purity.min_sal;
PL/SQL procedure successfully completed
minsal
---------
800
SQL> exec :maxsal:=purity.max_sal;
PL/SQL procedure successfully completed
maxsal
---------
5000
minsal number(9);
maxsal number(9);
function max_sal return number;
function min_sal return number;
pragma restrict_references(max_sal, wnps);
pragma restrict_references(min_sal, wnps);
end;
create or replace package body purity is
function max_sal return number as
begin
select max(sal) into maxsal from emp; return maxsal;
end;
function min_sal return number as
begin
select min(sal) into minsal from emp; return minsal;
end;
對該包進行編譯時提示“PACKAGE BODY SCOTT.PURITY 編譯錯誤
錯誤:PLS-00452: 子程式 'MAX_SAL' 違反了它的相關編譯指示
行:2
文字:function max_sal return number
錯誤:PLS-00452: 子程式 'MIN_SAL' 違反了它的相關編譯指示
行:10
文字:function min_sal return number”
因為規定了包中的函式不能修改包中的變數,在函式max_sal和min_sal中進行賦值操作時改變了包的變數minsal和maxsal,因此導致編譯錯誤。
修改如下:即函式只讀但不做修改包變數:
create or replace package purity is
minsal number(9);
maxsal number(9);
function max_sal return number;
function min_sal return number;
pragma restrict_references(max_sal, wnps);
pragma restrict_references(min_sal, wnps);
end;
create or replace package body purity is
function max_sal return number as
begin
return maxsal;
end;
function min_sal return number as
begin
return minsal;
end;
begin
select min(sal), max(sal) into minsal, maxsal from emp;
end;
--呼叫包的公用函式
SQL> var minsal number;
SQL> var maxsal number;
SQL> exec :minsal:=purity.min_sal;
PL/SQL procedure successfully completed
minsal
---------
800
SQL> exec :maxsal:=purity.max_sal;
PL/SQL procedure successfully completed
maxsal
---------
5000
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/9240380/viewspace-702737/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- plsql之pragma exception_initSQLException
- sql case語法和plsql case語法!SQL
- plsql--PRAGMA關鍵字的討論SQL
- SQLite的Pragma語句SQLite
- oracle之PLSql語言(一)OracleSQL
- #pragma用法(1)#pragma startup和#pragma exit
- PLSQL中使用繫結變數的語法SQL變數
- oracle之PLSql語言(二)sql語句的使用OracleSQL
- RESTRICT_REFERENCES的意思REST
- PLSQL程式語言SQL
- Oracle vs PostgreSQL Develop(25) - plsql vs plpgsql(語法嚴謹性)OracleSQLdev
- Dart語法篇之基礎語法(一)Dart
- oracle plsql(二)_plsql塊內之**冪OracleSQL
- iOS #pragma clangiOS
- 解析#pragma指令 (轉)
- Drools之基礎語法
- gRPC之proto語法RPC
- Hive之 Hql語法解析Hive
- PLSQL學習——控制語句SQL
- ORACLE PLSQL語言參考OracleSQL
- 淺談Kotlin語法篇之基礎語法(一)Kotlin
- plsql_index by_table of_count_next_prior_last,first語法小測SQLIndexAST
- oracle plsql package_body_procedure_構建語法_sp_儲存過程OracleSQLPackage儲存過程
- Java高階語法之反射Java反射
- 《JavaScript 闖關記》之語法JavaScript
- SQL之EXPLAIN語法詳解SQLAI
- JavaSE之java基礎語法Java
- plsql開發語言基礎SQL
- oracle儲存過程plsql_sp_多個out引數測試語法Oracle儲存過程SQL
- Flutter學習之Dart語法(二)FlutterDart
- Flutter學習之Dart語法(一)FlutterDart
- Flutter學習之Dart語法(三)FlutterDart
- Python 語法之裝飾器Python
- Python爬蟲之XPath語法Python爬蟲
- Flutter學習之Dart語法特性FlutterDart
- Java學習之基礎語法Java
- selenium之xpath語法總結
- JavaScript進階之基礎語法JavaScript