條件編譯

一個簡單的條件編譯(Conditional Compilation)的例子。

 

-- 設置顯示調試與跟踪的信息的標誌 ALTER SESSION SET PLSQL_CCFLAGS = 'my_debug:FALSE, my_tracing:FALSE'; -- 創建一個根據Oracle版本不同而不同的Package CREATE PACKAGE my_pkg AS SUBTYPE my_real IS $IF DBMS_DB_VERSION.VERSION < 10 $THEN -- 檢查數據版本 NUMBER; $ELSE BINARY_DOUBLE; $END -- 聲明兩個變量 my_pi my_real; my_e my_real; END my_pkg; / CREATE PACKAGE BODY my_pkg AS BEGIN -- 根據數據庫版本不同來設置具體的值 $IF DBMS_DB_VERSION.VERSION < 10 $THEN my_pi := 3.14016408289008292431940027343666863227; my_e := 2.71828182845904523536028747135266249775; $ELSE my_pi := 3.14016408289008292431940027343666863227d; my_e := 2.71828182845904523536028747135266249775d; $END END my_pkg; / CREATE PROCEDURE circle_area(radius my_pkg.my_real) IS my_area my_pkg.my_real; my_datatype VARCHAR2(30); BEGIN my_area := my_pkg.my_pi * radius; DBMS_OUTPUT.PUT_LINE('Radius: ' || TO_CHAR(radius) || ' Area: ' || TO_CHAR(my_area) ); $IF $$my_debug $THEN -- 如果debug為TRUE,那麼顯示debug信息 SELECT DATA_TYPE INTO my_datatype FROM USER_ARGUMENTS WHERE OBJECT_NAME = 'CIRCLE_AREA' AND ARGUMENT_NAME = 'RADIUS'; DBMS_OUTPUT.PUT_LINE('Datatype of the RADIUS argument is: ' || my_datatype); $END END; / -- 可以用ALTER PROCEDURE來用新的標誌來重新編譯該存儲過程 ALTER PROCEDURE circle_area COMPILE PLSQL_CCFLAGS = 'my_debug:TRUE' REUSE SETTINGS; -- 可以使用DBMS_PREPROCESSOR的子程序來查看編譯後的源碼 CALL DBMS_PREPROCESSOR.PRINT_POST_PROCESSED_SOURCE('PACKAGE', 'HR', 'MY_PKG'); PACKAGE my_pkg AS SUBTYPE my_real IS BINARY_DOUBLE; my_pi my_real; my_e my_real; END my_pkg;

你可能感兴趣的:(oracle,session,object,360,compilation,preprocessor)