</p> DMBS_DDL包包含WRAP函数和CREATE_WRAPPED过程。CREATE_WRAPPED过程加密语句并建树PL/SQL单元。如下为使用 DBMS_DDL.CREATE_WRAPPED加密包的例子:8 n9 c7 x$ l1 \# `
DECLARE9 L1 B/ N) E. F+ R
package_text VARCHAR2(32767); — text for creating package spec & body$ c# v0 w2 w- ], g5 J0 q# Y& }
FUNCTION generate_spec (pkgname VARCHAR2) RETURN VARCHAR2 AS, _( W$ Z; \' P( h# w; c
BEGIN
7 j7 E4 E; O8 ~; P5 @/ E RETURN ‘CREATE PACKAGE ‘ || pkgname || ‘ AS
0 P; I. G* g% V PROCEDURE raise_salary (emp_id NUMBER, amount NUMBER);4 D8 M3 ^4 x: N p; B( T- B* R
PROCEDURE fire_employee (emp_id NUMBER);
9 t5 m# ^7 U& A' o$ r+ T$ R" J* N END ‘ || pkgname || ‘;’;$ ^% r& Q1 {3 V/ @# n( n$ ^. L
END generate_spec;
6 k- f3 P r5 m8 _) {: a* A6 k7 O FUNCTION generate_body (pkgname VARCHAR2) RETURN VARCHAR2 AS
0 p: x6 ?5 \7 J% f3 A6 ^ BEGIN" x. j3 F9 ?8 T* L0 M5 b
RETURN ‘CREATE PACKAGE BODY ‘ || pkgname || ‘ AS
$ H1 y( t0 Q% \9 V+ L9 s PROCEDURE raise_salary (emp_id NUMBER, amount NUMBER) IS% _: i) U+ f. T; l5 X
BEGIN
" C7 \& a& r5 @2 ~+ f# ^' }% `4 K UPDATE employees' d6 R# i1 v6 T5 E
SET salary = salary + amount WHERE employee_id = emp_id;
0 P8 l# R& _& ^) ? y END raise_salary;
. A* j6 P% D/ v; C% n# F) J PROCEDURE fire_employee (emp_id NUMBER) IS g* S. ]2 x9 ]$ e
BEGIN
5 r7 S3 v; E0 r# b DELETE FROM employees WHERE employee_id = emp_id;
4 O. a6 j5 w( P7 A# ~ END fire_employee;
; T0 `' c% [8 J, @* A END ‘ || pkgname || ‘;’;
. m; X) L7 |; {* R2 B4 I0 m END generate_body;: X/ n; N1 F$ ]4 K8 {6 I: ~, v
BEGIN5 a {8 ~9 f) `1 N. J9 o! [
— Generate package spec
1 }4 S0 I% o( F& K$ [! B( o package_text := generate_spec(‘emp_actions’)0 r5 s4 K# `/ q, I @) g
— Create wrapped package spec/ X" {' L$ s: W' p4 s, ~5 o& Y; T
DBMS_DDL.CREATE_WRAPPED(package_text);% Q! a* v8 N" {5 e
— Generate package body. _: f; S5 P7 h" H$ |
package_text := generate_body(‘emp_actions’);
- \% l! {# x- `7 Y: j7 ` — Create wrapped package body
( `5 Q3 O4 W' [) p8 K: p" Z DBMS_DDL.CREATE_WRAPPED(package_text);' p3 Q1 i, |% ?0 q: }- {
END; |