</p> DMBS_DDL包包含WRAP函数和CREATE_WRAPPED过程。CREATE_WRAPPED过程加密语句并建树PL/SQL单元。如下为使用 DBMS_DDL.CREATE_WRAPPED加密包的例子:
/ R* T" g; W6 t: l/ V DECLARE. ]' G. R. ]- Q1 Q7 {1 B
package_text VARCHAR2(32767); — text for creating package spec & body& o% G: @7 \, i# d
FUNCTION generate_spec (pkgname VARCHAR2) RETURN VARCHAR2 AS
( x5 H7 X- x4 b: W4 Z# e7 t1 E BEGIN$ J$ C( ^# @. b+ H( u
RETURN ‘CREATE PACKAGE ‘ || pkgname || ‘ AS! J7 M/ a8 h4 v
PROCEDURE raise_salary (emp_id NUMBER, amount NUMBER);+ T- l* r/ p } _9 G- f8 ^
PROCEDURE fire_employee (emp_id NUMBER);+ t$ `& K) l& Y# }6 a& c
END ‘ || pkgname || ‘;’;
4 \, m+ a) i) X4 U7 j+ E$ N3 i END generate_spec;
8 ]0 B6 u6 O! }; D9 T FUNCTION generate_body (pkgname VARCHAR2) RETURN VARCHAR2 AS7 G3 i( Q) I$ ^" W5 a
BEGIN% g+ D, u& R' [1 Y
RETURN ‘CREATE PACKAGE BODY ‘ || pkgname || ‘ AS
, u5 ~) U2 C! U: y PROCEDURE raise_salary (emp_id NUMBER, amount NUMBER) IS
; n9 @) q" F. @/ K2 s BEGIN J2 e# z( I7 n3 E( d {: l! _/ \
UPDATE employees
7 R8 `. b& G9 r SET salary = salary + amount WHERE employee_id = emp_id;8 c1 c' E8 M. O. O; @/ _" ~, c/ q
END raise_salary;, z2 y" h4 M e6 _" R' ]' K6 i
PROCEDURE fire_employee (emp_id NUMBER) IS
7 e; s0 M+ d# D9 e8 y BEGIN
6 C. S- u' g) i" b3 d8 }5 G DELETE FROM employees WHERE employee_id = emp_id;
- v O6 X4 T- A2 n/ H END fire_employee;' O( |+ C4 {+ f0 @9 B
END ‘ || pkgname || ‘;’;* y; w8 S8 c& Q" f! i/ i3 q. T0 f
END generate_body;) t5 e' w/ p' ?; x3 p( Z: w0 W# `
BEGIN% b) H8 {7 J6 i6 N$ Y! a
— Generate package spec3 B! ^8 d: i& k5 q, \+ x% A$ n
package_text := generate_spec(‘emp_actions’)) t& m5 B O1 v. K9 V) K
— Create wrapped package spec
# M+ T0 Q% F0 Z# D/ n4 }6 |2 X" u! y DBMS_DDL.CREATE_WRAPPED(package_text);
\8 j+ i8 C2 ]/ O% @) T — Generate package body4 W1 h- j5 C$ {% e ~
package_text := generate_body(‘emp_actions’);+ H3 U; M7 T2 K x( R' F$ Y
— Create wrapped package body
8 U/ \. T6 f- U8 }0 M DBMS_DDL.CREATE_WRAPPED(package_text);
y" U+ V; \2 ] END; |