Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Plsql 如何将两个VARCHAR2列表转换为关联数组?_Plsql - Fatal编程技术网

Plsql 如何将两个VARCHAR2列表转换为关联数组?

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

我正在寻找一种将两个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_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