1 -- ---------------------------------------------------------
4 PROMPT
"env.sql start";
6 CREATE OR REPLACE TYPE env_item
FORCE AS OBJECT (
12 CREATE OR REPLACE TYPE env_data
FORCE IS TABLE OF env_item
;
15 CREATE OR REPLACE TYPE env_type
FORCE AS OBJECT (
22 CREATE OR REPLACE TYPE env_mem_type
FORCE IS TABLE OF env_type
;
25 CREATE OR REPLACE PACKAGE env_pkg
IS
26 TYPE env_entry
IS TABLE OF integer INDEX BY varchar2(256);
27 TYPE env_entry_table
IS TABLE OF env_entry
;
29 FUNCTION env_new(M
IN OUT NOCOPY mem_type
,
30 eeT
IN OUT NOCOPY env_entry_table
,
31 outer_idx
integer DEFAULT NULL)
33 FUNCTION env_new(M
IN OUT NOCOPY mem_type
,
34 eeT
IN OUT NOCOPY env_entry_table
,
37 exprs mal_seq_items_type
)
39 FUNCTION env_set(M
IN OUT NOCOPY mem_type
,
40 eeT
IN OUT NOCOPY env_entry_table
,
43 val
integer) RETURN integer;
44 FUNCTION env_find(M
IN OUT NOCOPY mem_type
,
47 key integer) RETURN integer;
48 FUNCTION env_get(M
IN OUT NOCOPY mem_type
,
51 key integer) RETURN integer;
56 CREATE OR REPLACE PACKAGE BODY env_pkg
IS
57 FUNCTION env_new(M
IN OUT NOCOPY mem_type
,
58 eeT
IN OUT NOCOPY env_entry_table
,
59 outer_idx
integer DEFAULT NULL)
65 eeT(eidx
)('**OUTER**') := outer_idx
;
69 FUNCTION env_new(M
IN OUT NOCOPY mem_type
,
70 eeT
IN OUT NOCOPY env_entry_table
,
73 exprs mal_seq_items_type
)
77 bs mal_seq_items_type
;
81 eeT(eidx
)('**OUTER**') := outer_idx
;
82 IF binds
IS NOT NULL THEN
83 bs
:= TREAT(M(binds
) AS mal_seq_type
).val_seq
;
84 FOR i
IN 1..bs.
COUNT LOOP
85 IF TREAT(M(bs(i
)) AS mal_str_type
).val_str
= '&' THEN
86 eeT(eidx
)(TREAT(M(bs(i
+1)) AS mal_str_type
).val_str
) :=
87 types.
slice(M
, exprs
, i
-1);
90 eeT(eidx
)(TREAT(M(bs(i
)) AS mal_str_type
).val_str
) :=
98 FUNCTION env_set(M
IN OUT NOCOPY mem_type
,
99 eeT
IN OUT NOCOPY env_entry_table
,
102 val
integer) RETURN integer IS
107 k
:= TREAT(M(key) AS mal_str_type
).val_str
;
112 FUNCTION env_find(M
IN OUT NOCOPY mem_type
,
115 key integer) RETURN integer IS
119 k
:= TREAT(M(key) AS mal_str_type
).val_str
;
120 IF eeT(eidx
).
EXISTS(k
) THEN
122 ELSIF
eeT(eidx
)('**OUTER**') IS NOT NULL THEN
123 RETURN env_find(M
, eeT
, eeT(eidx
)('**OUTER**'), key);
129 FUNCTION env_get(M
IN OUT NOCOPY mem_type
,
132 key integer) RETURN integer IS
136 found := env_find(M
, eeT
, eidx
, key);
137 k
:= TREAT(M(key) AS mal_str_type
).val_str
;
138 IF found IS NOT NULL THEN
139 RETURN eeT(found)(k
);
141 raise_application_error(-20005,
142 '''' || k ||
''' not found', TRUE);
150 PROMPT
"env.sql finished";