Plsql 如何将两个VARCHAR2列表转换为关联数组?
我正在寻找一种将两个VARCHAR2列表转换为关联数组的方法。。。更具体地说,varchar2(30)的varchar2(30)索引的Plsql 如何将两个VARCHAR2列表转换为关联数组?,plsql,Plsql,我正在寻找一种将两个VARCHAR2列表转换为关联数组的方法。。。更具体地说,varchar2(30)的varchar2(30)索引的表。例如: v_list1 sys.odcivarchar2list := sys.odcivarchar2list('A', 'B', 'C'); v_list2 sys.odcivarchar2list := sys.odcivarchar2list('1', '2', '3'); (...) v_result := SomeFunction(v_list
表。例如:
v_list1 sys.odcivarchar2list := sys.odcivarchar2list('A', 'B', 'C');
v_list2 sys.odcivarchar2list := sys.odcivarchar2list('1', '2', '3');
(...)
v_result := SomeFunction(v_list1, v_list2);
-- v_result above should be such that:
-- v_result('A') = '1'
-- v_result('B') = '2'
-- v_result('C') = '3'
换句话说,结果应该是一个关联数组,其中list1中的每个元素都对list2中相应的元素进行索引
以下是我尝试过的:
declare
type t_associative_vc2 is table of varchar2(30) index by varchar2(30);
v_list1 sys.odcivarchar2list := sys.odcivarchar2list('A', 'B', 'C');
v_list2 sys.odcivarchar2list := sys.odcivarchar2list('1', '2', '3');
v_zipped t_associative_vc2;
v_index varchar2(30);
-- Purpose: turn p_list1 and p_list2 into an associative VARCHAR2 to VARCHAR2 array
-- Elements of p_list1 will index those of p_list2
function zip(p_list1 sys.odcivarchar2list, p_list2 sys.odcivarchar2list) return t_associative_vc2 is
v_result t_associative_vc2;
begin
for i in p_list1.first .. p_list1.last loop
v_result(p_list1(i)) := p_list2(i);
end loop;
return v_result;
end;
begin
-- Zip both lists
v_zipped := zip(v_list1, v_list2);
-- Print the associative array's keys and values
v_index := v_zipped.first;
while v_index is not null loop
dbms_output.put_line(v_index || ' --> ' || v_zipped(v_index));
v_index := v_zipped.next(v_index);
end loop;
end;
将生成以下输出:
A --> 1
B --> 2
C --> 3
到目前为止,一切都很好,似乎
但我的问题是:我这样做对吗?我这样问是因为我不确定使用p_列表1
中的索引来索引p_列表2
是否“合适”
基本上,我的目标是在上面的v_-zipped
中填充成对:('A','1'),('B','2')和('C','3')。只要v_-list1
中的值不同,您构建的解决方案就可以正常工作。例如,如果它们是这样设置的:
v_list1 SYS.odcivarchar2list := sys.odcivarchar2list ('A', 'B', 'C', 'A');
v_list2 SYS.odcivarchar2list := sys.odcivarchar2list ('1', '2', '3', '4');
然后输出将是
A --> 4
B --> 2
C --> 3
那很好,只要这是你所期望的
另一个选项是创建一个同时包含字符串值的记录类型,并将其存储为表。这将允许重复的“密钥”,这可能是您的第一个解决方案的问题
DECLARE
TYPE two_strings_rec IS RECORD
(
val1 VARCHAR2 (30),
val2 VARCHAR2 (30)
);
TYPE two_strings_t IS TABLE OF two_strings_rec;
v_list1 SYS.odcivarchar2list
:= sys.odcivarchar2list ('A',
'B',
'C',
'A');
v_list2 SYS.odcivarchar2list
:= sys.odcivarchar2list ('1',
'2',
'3',
'4');
l_two_strings two_strings_t := two_strings_t ();
BEGIN
l_two_strings.EXTEND (LEAST (v_list1.COUNT, v_list2.COUNT));
FOR i IN 1 .. l_two_strings.COUNT
LOOP
l_two_strings (i) := two_strings_rec (v_list1 (i), v_list2 (i));
END LOOP;
FOR i IN 1 .. l_two_strings.COUNT
LOOP
DBMS_OUTPUT.put_line (l_two_strings (i).val1 || ' --> ' || l_two_strings (i).val2);
END LOOP;
END;
/
输出
A --> 1
B --> 2
C --> 3
A --> 4