1 -- ---------------------------------------------------------
4 CREATE OR REPLACE TYPE env_item
FORCE AS OBJECT (
10 CREATE OR REPLACE TYPE env_data
FORCE IS TABLE OF env_item
;
13 CREATE OR REPLACE TYPE env_T
FORCE AS OBJECT (
20 CREATE OR REPLACE TYPE env_mem_T
FORCE IS TABLE OF env_T
;
23 CREATE OR REPLACE PACKAGE env_pkg
IS
24 TYPE env_entry
IS TABLE OF integer INDEX BY varchar2(256);
25 TYPE env_entry_table
IS TABLE OF env_entry
;
27 FUNCTION env_new(M
IN OUT NOCOPY types.mal_table
,
28 eeT
IN OUT NOCOPY env_entry_table
,
29 outer_idx
integer DEFAULT NULL)
31 FUNCTION env_new(M
IN OUT NOCOPY types.mal_table
,
32 eeT
IN OUT NOCOPY env_entry_table
,
37 FUNCTION env_set(M
IN OUT NOCOPY types.mal_table
,
38 eeT
IN OUT NOCOPY env_entry_table
,
41 val
integer) RETURN integer;
42 FUNCTION env_find(M
IN OUT NOCOPY types.mal_table
,
45 key integer) RETURN integer;
46 FUNCTION env_get(M
IN OUT NOCOPY types.mal_table
,
49 key integer) RETURN integer;
55 CREATE OR REPLACE PACKAGE BODY env_pkg
IS
57 FUNCTION env_new(M
IN OUT NOCOPY types.mal_table
,
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 types.mal_table
,
70 eeT
IN OUT NOCOPY env_entry_table
,
81 eeT(eidx
)('**OUTER**') := outer_idx
;
82 IF binds
IS NOT NULL THEN
83 bs
:= TREAT(M(binds
) AS mal_seq_T
).val_seq
;
84 FOR i
IN 1..bs.
COUNT LOOP
85 IF TREAT(M(bs(i
)) AS mal_str_T
).val_str
= '&' THEN
86 eeT(eidx
)(TREAT(M(bs(i
+1)) AS mal_str_T
).val_str
) :=
87 types.
slice(M
, exprs
, i
-1);
90 eeT(eidx
)(TREAT(M(bs(i
)) AS mal_str_T
).val_str
) :=
98 FUNCTION env_set(M
IN OUT NOCOPY types.mal_table
,
99 eeT
IN OUT NOCOPY env_entry_table
,
102 val
integer) RETURN integer IS
107 k
:= TREAT(M(key) AS mal_str_T
).val_str
;
112 FUNCTION env_find(M
IN OUT NOCOPY types.mal_table
,
115 key integer) RETURN integer IS
119 k
:= TREAT(M(key) AS mal_str_T
).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 types.mal_table
,
132 key integer) RETURN integer IS
136 found := env_find(M
, eeT
, eidx
, key);
137 k
:= TREAT(M(key) AS mal_str_T
).val_str
;
138 IF found IS NOT NULL THEN
139 RETURN eeT(found)(k
);
141 raise_application_error(-20005,
142 '''' || k ||
''' not found', TRUE);