DBMS_DDL包的使用--=============================為了便于建立性能良好的PL/SQL程序,Oracle提供了大量的系統(tǒng)包供使用。Oracle提供的這些包擴展并增強了數(shù)據(jù)庫的一些功能,以及突破了PL/SQL的一些限制。本文講述了Oracle提供的包DBMS_DDL,以及其使用方法。一、使用DBMS_DDL包可以對包,包體,存儲過程,函數(shù),觸" />

日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

PL/SQL --> DBMS_DDL包的使用

系統(tǒng) 2121 0

--=============================

-- PL/SQL --> DBMS_DDL 包的使用

--=============================

?

??? 為了便于建立性能良好的 PL / SQL 程序, Oracle 提供了大量的系統(tǒng)包供使用。 Oracle 提供的這些包擴展并增強了數(shù)據(jù)庫的一些功能,以及突

破了 PL / SQL 的一些限制。本文講述了 Oracle 提供的包 DBMS_DDL ,以及其使用方法。

?

一、 ??? 使用 DBMS_DDL 包可以對包,包體,存儲過程,函數(shù),觸發(fā)器等等進行編譯,以及為數(shù)據(jù)庫對象提供一些統(tǒng)計信息。

??? 下面列出幾個常用的過程

??? 1.ALTER_COMPILE ?? -- 編譯對象

??????? PROCEDURE DBMS_DDL . ALTER_COMPILE

??????? ?? ( type IN VARCHAR2 ???? --PROCEDURE, FUNCTION, PACKAGE, PACKAGE BODY or TRIGGER.

??????? ?? , schema IN VARCHAR2

??????? ?? , name IN VARCHAR2 );

???????

??????? 與之相等的操作: ALTER PROCEDURE | FUNCTION | PACKAGE [<schema>.] < name > COMPILE [BODY]

???????

??????? -- 下面創(chuàng)建一個過程來對數(shù)據(jù)庫中特定用戶的無效對象進行重新編譯

??????????? CREATE OR REPLACE PROCEDURE recompile

??????????? ?? ( status_in IN VARCHAR2 := 'INVALID' ,

??????????????? name_in IN VARCHAR2 := '%' ,

??????????????? type_in IN VARCHAR2 := '%' ,

??????????????? schema_in IN VARCHAR2 := USER )

??????????? IS

??????????? ?? v_objtype VARCHAR2 ( 100 );

??????????? ?? err_status NUMERIC ;

?

??????????? ?? CURSOR obj_cur IS ??

??????????????? ? SELECT owner , object_name , object_type

??????????????????? FROM ALL_OBJECTS

??????????????? ?? WHERE status LIKE UPPER ( status_in )

??????????????????? ? AND object_name LIKE UPPER ( name_in )

??????????????????? ? AND object_type LIKE UPPER ( type_in )

??????????????????? ? AND owner LIKE UPPER ( schema_in )

??????????????? ?? ORDER BY

??????????????????? ? DECODE ( object_type ,

??????????????????????? 'PACKAGE' , 1 ,

??????????????????????? 'FUNCTION' , 2 ,

??????????????????????? 'PROCEDURE' , 3 ,

??????????????????????? 'PACKAGE BODY' , 4 );

??????????? BEGIN

??????????? ?? FOR rec IN obj_cur

??? ??????? ?? LOOP

??????????????? ? IF rec . object_type = 'PACKAGE'

??????????????? ? THEN

??????????????????? ? v_objtype := 'PACKAGE SPECIFICATION' ;

??????????????? ? ELSE

??????????????????? ? v_objtype := rec . object_type ;

??????????????? ? END IF ; ?

?

??????????????? ? DBMS_DDL . ALTER_COMPILE ( v_objtype , rec . owner , rec . object_name );

?

??????????????? ? DBMS_OUTPUT . PUT_LINE

??????????????????? ? ( 'Compiled ' || v_objtype || ' of ' ||

??????????????????? ? rec . owner || '.' || rec . object_name ); ?

??????????? ?? END LOOP ;

??????????????? ?

??????????? EXCEPTION

??????????? ?? WHEN OTHERS THEN

??????????? ?? BEGIN

??????????????????? err_status := SQLCODE ;

??????????????????? DBMS_OUTPUT . PUT_LINE ( ' Recompilation failed : ' || SQLERRM ( err_status ));

??????????????????? IF ( obj_cur % ISOPEN ) THEN

??????????????????? ?? CLOSE obj_cur ;

??????????????????? END IF ;

??????????? ? ? END ;

??????????? END ;

?

??????????? scott@ORCL > exec recompile ( schema_in => 'SCOTT' );

??????????? Compiled FUNCTION of SCOTT . F_NEGATIVE

??????????? Compiled PROCEDURE of SCOTT . COMPUTE

??????????? Compiled TRIGGER of SCOTT . E_D

?

??????????? PL / SQL procedure successfully completed .

???????????

??? 2.ANALYZE_OBJECT ?? -- 收集表,索引,簇等的統(tǒng)計信息

??????? PROCEDURE DBMS_DDL . ANALYZE_OBJECT

??????? ?? ( type IN VARCHAR2 ?????????? --TABLE, CLUSTER or INDEX

??????? ?? , schema IN VARCHAR2

??????? ?? , name IN VARCHAR2

??????? ?? , method IN VARCHAR2 ???????? --ESTIMATE, COMPUTE or DELETE

??????? ?? , estimate_rows IN NUMBER DEFAULT NULL

??????? ?? , estimate_percent IN NUMBER DEFAULT NULL

??????? ?? , method_opt IN VARCHAR2 DEFAULT NULL) --[FOR TABLE ][ FOR ALL [INDEXED] COLUMNS] [SIZE n][ FOR ALL INDEXES ]

??????? ?? , partname ?? IN VARCHAR2 DEFAULT NULL); ??

?

??????? 與之相等的操作: ANALYZE TABLE|CLUSTER|INDEX [<schema>.] < name > [<method>] STATISTICS [SAMPLE <n> [ROWS|PERCENT]]

scott@ORCL > exec dbms_ddl . analyze_object ( 'TABLE' , 'SCOTT' , 'EMP' , 'ESTIMATE' );

?

??????????? PL / SQL procedure successfully completed . ??? ??

?

??? 3.DBMS_DDL . WRAP -- 使用 wrap 函數(shù)可以加密子程序

??????? 該函數(shù)使用了 3 個重載函數(shù),即可以使用 3 種不同的方式來對子程序進行動態(tài)加密

??????????? DBMS_DDL . WRAP ( ????????? -- 方式一

??????????? ?? ddl ????? VARCHAR2 ) ?? -- 接收 VARCHAR2 類型的輸入

??????????? ? RETURN VARCHAR2 ;

??????????? ?

??????????? DBMS_DDL . WRAP ( ????????? -- 方式二

??????????? ?? ddl ????? DBMS_SQL . VARCHAR2S , ???? -- 允許大的 DDL 語句的輸入 ,dbms_sql.varchar2s 限制為每行 256 字節(jié)

??????????? ?? lb ?????? PLS_INTEGER ,

??????????? ?? ub ?????? PLS_INTEGER )

??????????? ? RETURN DBMS_SQL . VARCHAR2S ; ???????

?

??????????? DBMS_DDL . WRAP ( ???????? -- 方式三

??????????? ?? ddl ????? DBMS_SQL . VARCHAR2A , ???? -- 允許大的 DDL 語句的輸入 ,dbms_sql.varchar2a 為每行 32767 字節(jié)

??????????? ?? lb ?????? PLS_INTEGER ,

??????????? ?? ub ?????? PLS_INTEGER )

??????????? ? RETURN DBMS_SQL . VARCHAR2A ; ???????????????

?

??????????? ddl : 入?yún)? ddl 要求語法為 create or replace …” 的字符串,用以創(chuàng)建包、包體、類型、類型體、函數(shù)和過程的程序單元的 DDL 語句

??????????????? 。如果入?yún)? ddl 所定義的程序單元不能被加密,或存在語法錯誤,則將拋出 “MALFORMED_WRAP_INPUT” 異常。

??????????? lb : 為加密集合的最低元素

??????????? ub : 為加密集合的最高元素

??????????? 返回值 : 為加密后的代碼。可以將它寫入一個文件中,或者存儲在表中。

??????? -- 使用簡單方式實現(xiàn)加密,使用方式一

??????????? SET SERVEROUTPUT ON SIZE UNLIMITED

??????????? DECLARE

??????????? ? l_source ? VARCHAR2 ( 32767 );

??????????? ? l_wrap ??? VARCHAR2 ( 32767 );

??????????? BEGIN

??????????? ? l_source := 'CREATE OR REPLACE FUNCTION get_date_string RETURN VARCHAR2 AS' ||

??????????????????????? ? 'BEGIN ' ||

??????????????????????? ? 'RETURN TO_CHAR(SYSDATE, ''DD-MON-YYYY''); ' ||

??????????????????????? ? 'END get_date_string;' ;

??????????? ?

??????????? ? l_wrap := SYS.DBMS_DDL . WRAP ( ddl => l_source );

??????????? ? DBMS_OUTPUT . put_line ( l_wrap );

??????????? END ;

?

??????????? CREATE OR REPLACE FUNCTION get_date_string wrapped

??????????? a000000

??????????? 1f

??????????? abcd

??????????? abcd

??????????? abcd

??????????? abcd

??? ??????? abcd

??????????? abcd

??????????? abcd

??????????? abcd

??????????? abcd

??????????? abcd

??????????? abcd

??????????? abcd

??????????? abcd

??????????? abcd

??????????? abcd

??????????? 8

??????????? 6e 96

??????????? Mm0XeMkyhwPRoFPms2i + maxm + XAwg0xff8upynSmEPJ4IfeVjSbm6TkMCRi9trW1AmVTMIZs

??????????? v4ABZD6CoiUcaSYfjdvzRqCeavAGromyS4qOtqqHxyw / 0TtfJ0S2rO1lBTPgb1vb7rX16x0m

??????????? LRwU

???????????

??????????? 對于使用 DBMS_DDL . WRAP 輸出的密文,可以將其復(fù)制到文本文件或表中,然后將其部署到需要的地方,從一定程度上保證了代碼

??????? 的安全性。對于方式一而言, VARCHAR2 ( 32767 字節(jié) ) 長度限制了能夠使用的 PL / SQL 代碼長度 , 因此使用 WRAP 的兩外兩個重載函數(shù)可以解

??????? 決長度缺陷問題。

?

??? 4. 使用重載過程 CREATE_WRAPPED 加密子程序 ?

??????? Oracle 除了提供個重載函數(shù) WRAP 實現(xiàn)加密之外,同時也提供了個重載過程來實現(xiàn)對子程序加密,有關(guān)參數(shù)描述請參考前面。

??????????? DBMS_DDL . CREATE_WRAPPED (

??????????? ?? ddl ???? VARCHAR2 );

?

??????????? DBMS_DDL . CREATE_WRAPPED (

??????????? ?? ddl ???? DBMS_SQL . VARCHAR2A ,

??????????? ?? lb ????? PLS_INTEGER ,

??????????? ?? ub ????? PLS_INTEGER );

?

??????????? DBMS_DDL . CREATE_WRAPPED (

??????????? ?? ddl ???? DBMS_SQL . VARCHAR2S ,

??????????? ?? lb ????? PLS_INTEGER ,

??????????? ?? ub ????? PLS_INTEGER );

??????????? ??

??????? 與函數(shù) wrap 不同,過程 create_wrapped 不但加密源代碼,而且還會在數(shù)據(jù)庫中執(zhí)行加密后的密文。

???????

??????? -- 下面使用 CREATE_WRAPPED 來加密子程序

??????????? SET SERVEROUTPUT ON SIZE UNLIMITED

??????????? DECLARE

??????????? ? l_source ? DBMS_SQL . VARCHAR2A ;

??????????? ? l_wrap ??? DBMS_SQL . VARCHAR2A ;

??????????? BEGIN

??????????? ? l_source ( 1 ) := 'CREATE OR REPLACE FUNCTION get_date_string RETURN VARCHAR2 AS ' ;

??????????? ? l_source ( 2 ) := 'BEGIN ' ;

??????????? ? l_source ( 3 ) := 'RETURN TO_CHAR(SYSDATE, ''DD-MON-YYYY''); ' ;

??????????? ? l_source ( 4 ) := 'END get_date_string;' ;

??????????? ?

??????????? ? SYS.DBMS_DDL . CREATE_WRAPPED ( ddl => l_source ,

??????????????????????????????????????? ? lb ? => 1 ,

??????????????????????????????????????? ? ub ? => l_source . count );

??????????? END ; ???????????

?

??????????? scott@ORCL > SET PAGESIZE 100

??????????? scott@ORCL > SELECT text ???? -- 查看加密后的密文

??????????? ? 2 ? FROM ?? user_source

??????????? ? 3 ? WHERE ? name = 'GET_DATE_STRING'

??????????? ? 4 ? AND ??? type = 'FUNCTION' ;

?

??????????? TEXT

??????????? --------------------------------------------------------------------------------------

??????????? FUNCTION get_date_string wrapped

??????????? a000000

??????????? 1f

??????????? abcd

??????????? abcd

??????????? abcd

??????????? abcd

??????????? abcd

??????????? abcd

??????????? abcd

??????????? abcd

??????????? abcd

??????????? abcd

??????????? abcd

??????????? abcd

??????????? abcd

??????????? abcd

??????????? abcd

??????????? 8

??????????? 6f 96

??????????? i5ktuqFIjCuYLEse2bjmcBG7ZWgwg0xff8upynSmEPJ4IfeVjSbm6TkMCRi9trW1AmVTMB5D

??????????? uU2KKgFAWoMdxYFR8VesyCs4U8zk9ML7b7Q + G / lGiyLbcaOIMZ4bNhIBYc2VVsvjaqr86Fu8

??????????? VByi ???????????

???????

??????????? scott@ORCL > select ? -- 使用 get_ddl 獲得加密后的密文

??????????? ? 2 ? dbms_metadata . get_ddl ( 'FUNCTION' , 'GET_DATE_STRING' )

??????????? ? 3 ? from dual ;

?

??????????? DBMS_METADATA . GET_DDL ( 'FUNCTION' , 'GET_DATE_STRING' )

??????????? --------------------------------------------------------------------------------

?

??????????? ? CREATE OR REPLACE FUNCTION "SCOTT" . "GET_DATE_STRING" wrapped

??????????? a000000

??????????? 1f

??????????? abcd

??????????? abcd

??????????? abcd

??????????? abcd

??????????? abcd

??????????? abcd

??????????? abcd

??????????? abcd

??????????? abcd

??????????? abcd

??????????? abcd

??????????? abcd

??????????? abcd

??????????? abcd

??????????? abcd

??????????? 8

??????????? 6f 96

??????????? i5ktuqFIjCuYLEse2bjmcBG7ZWgwg0xff8upynSmEPJ4IfeVjSbm6TkMCRi9trW1AmVTMB5D

??????????? uU2KKgFAWoMdxYFR8VesyCs4U8zk9ML7b7Q + G / lGiyLbcaOIMZ4bNhIBYc2VVsvjaqr86Fu8

??????????? VByi ???????

???????????????????

??? 5.DBMS_DDL . IS_TRIGGER_FIRE_ONCE 用于判斷特定的觸發(fā)器是否被觸發(fā)過 ???????????????

??????? DBMS_DDL . IS_TRIGGER_FIRE_ONCE (

??????????? trig_owner ? IN VARCHAR2 ,

??????????? trig_name ?? IN VARCHAR2 )

??????????? RETURN BOOLEAN ;

???????????

??????? BEGIN

??????? ? IF dbms_ddl . is_trigger_fire_once ( 'SCOTT' , 'tr_tb_a' ) THEN

??????????? dbms_output . put_line ( 'TRUE' );

??????? ? ELSE

??????????? dbms_output . put_line ( 'FALSE' );

??????? ? END IF ;

??????? END ;

???????

??????? TRUE

???

二、更多參考

有關(guān) SQL 請參考

??????? SQL 基礎(chǔ)--> 子查詢

??????? SQL 基礎(chǔ)--> 多表查詢

SQL 基礎(chǔ)--> 分組與分組函數(shù)

SQL 基礎(chǔ)--> 常用函數(shù)

SQL 基礎(chǔ)--> ROLLUP 與CUBE 運算符實現(xiàn)數(shù)據(jù)匯總

SQL 基礎(chǔ)--> 層次化查詢(START BY ... CONNECT BY PRIOR)

?

??? 有關(guān) PL/SQL 請參考

??????? PL/SQL --> 語言基礎(chǔ)

PL/SQL --> 流程控制

PL/SQL --> 存儲過程

PL/SQL --> 函數(shù)

PL/SQL --> 游標(biāo)

PL/SQL --> 隱式游標(biāo)(SQL%FOUND)

PL/SQL --> 異常處理(Exception)

PL/SQL --> PL/SQL 記錄

PL/SQL --> 包的創(chuàng)建與管理

PL/SQL --> 包重載、初始化

PL/SQL --> DBMS_DDL 包的使用

PL/SQL --> DML 觸發(fā)器

PL/SQL --> INSTEAD OF 觸發(fā)器

???????

?

PL/SQL --> DBMS_DDL包的使用


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 神农架林区| 马边| 水富县| 沙湾县| 开远市| 托克托县| 潮州市| 若羌县| 霸州市| 柘城县| 若尔盖县| 孟村| 抚宁县| 正安县| 济南市| 寿光市| SHOW| 永靖县| 固始县| 阳泉市| 长宁县| 德安县| 陇川县| 邢台市| 长乐市| 乐业县| 沙湾县| 武山县| 金寨县| 许昌县| 英吉沙县| 任丘市| 新余市| 景谷| 明星| 峨边| 桂东县| 马龙县| 习水县| 醴陵市| 襄汾县|