回答

收藏

PL / SQL数据结构,例如Hashmap

技术问答 技术问答 260 人阅读 | 0 人回复 | 2023-09-14

在Oracle pl / sql中,有没有一种方法可以创建像java Hashmap这样的数据结构,它可以将记录类型作为值,将String作为索引。
# q! O/ B& V" c& H; r7 J% I! C例如;8 c+ T: V2 A" T
type emp_rec_type is record (emp_id number,emp_salary number);" X/ d2 ?0 y4 j( ?5 H1 j0 D% L. g
emp_rec emp_rec_type;/ g7 N. G/ N4 M. j9 T' b- i, C/ e
type emp_assoc_array is table of emp_rec_type indexed by varchar2(30);+ \! Q$ T$ _4 `2 A
emp_map emp_assoc_array;
% O/ q( k' c+ }4 L9 I! O/ ^7 Z我希望能够做到以下几点" I* R5 @7 E0 k, E& P: _4 z
emp_rec.emp_id := 1;5 t# w, u# s6 X& Q0 l8 y
   emp_rec.salary := 1000; / K+ H. y% Y" ~4 a* Q
   emp_map('Rohan') := emp_rec;6 [, I% _+ n; i) d& y, N
能做到吗?我不能使用嵌套表,因为我只能按整数对其进行索引。对于关联数组,我不能将对象类型用作属性。6 E; y2 c$ ^1 J" s$ l
也希望这样做而不必创建对象或架构数据类型。你能建议点什么吗?
: v& I4 [. o5 z3 s                  |* [/ k7 V/ [( c% i  x, |
解决方案:  d+ q1 y1 |# |& ?
               
0 Q, Z2 k+ a: X6 k+ g$ f' x6 ?) p8 T

* o" h# j4 N! k6 M6 P                在PL /  C0 Z( ~4 @# ?3 Q' N4 s$ d
SQL中,您可以定义索引的关联数组VARCHAR2(因为我认为10g):
' @) x& b% ^# x* k; A  cSQL> DECLARE
5 f' ~% x3 g9 K/ w  2     TYPE map_varchar IS TABLE OF VARCHAR2(30) INDEX BY VARCHAR2(30);. R3 v: N5 ~" c6 Z5 h, U0 o+ ]
  3     l map_varchar;
0 T  w# I+ S8 f! i# v1 a1 P  4  BEGIN' d$ i4 k+ P# m) s
  5     l('A') := 'alpha';1 A5 }* |$ q, M2 x' Q! V
  6     l('B') := 'beta';0 Q/ `9 ^' R- F7 R& M5 y
  7     dbms_output.put_line(l('A'));1 M" r0 f4 M0 W8 [) i5 J. B
  8  END;, M6 n8 [& t- M5 R6 L" Z
  9  /- m! I9 p+ R7 o/ O5 Q
alpha
; w, ~; E# z# a2 K7 |( F9 s在内部,我认为该结构更像是二叉树映射而不是哈希映射。
' n7 s% h! r8 n: ?3 ?7 j& y当然,您可以存储PL / SQL记录或SQL对象:. _8 P2 R) I. {& {
SQL> DECLARE
3 r! ^# Q" p$ ?) d7 x  2     TYPE emp_rec_type IS RECORD (emp_id NUMBER,emp_salary NUMBER);
* A: f1 i! |- `  3     TYPE map_varchar IS TABLE OF emp_rec_type INDEX BY VARCHAR2(30);+ N$ I8 H4 E9 l. c: Y
  4     l_emp emp_rec_type;7 q$ {0 _) w% C* p( F" C+ m5 k/ c
  5     l_map map_varchar;
, u. p+ u& M& W9 f2 P  6  BEGIN
# ~% m  Z4 a. s8 F, ^3 O8 |. f  7     l_emp.emp_id := 1;
- a" e" W* K" l  8     l_emp.emp_salary := 1000;5 V4 a1 K7 R# z6 V
  9     l_map('A') := l_emp;
9 Q: ^* Z# h& y! \  R* H 10     -- you can also affect record values directly9 I9 ]. @! V* `# I% a0 X, w7 G4 n
11     l_map('B').emp_id := 2;
7 p5 `; p# w; F$ u: b) p$ u1 ^ 12     l_map('B').emp_salary := 2000;
4 ]& V0 {7 i" q5 E) @9 v0 ] 13     dbms_output.put_line(l_map('A').emp_salary);
) [/ v/ A3 W7 \+ {/ A 14  END;
( D) p, n7 I2 H3 b# J6 D6 x8 A+ D 15  /$ u3 X7 G+ w  B
1000( @5 d6 W! e8 X' L
PL/SQL procedure successfully completed
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则