如何通过 VARCHAR2 填充关联数组索引

how to populate an Associative Array index by VARCHAR2

我有 2 个关联数组:

type r1 is record
   ( c1 number
   , c2 varchar2(64));
type t1 is table of r1 index by binary_integer;
v1 t1;

type t2 is table of varchar2(64) index by binary_integer;
v2 t2;

counter number := 0;

type r3 is record
    ( no_visits number);
type t3 is table of r3 index by varchar2(64);
v3 t3;

我想要一个列表(可能是另一个关联数组 - v3,其中包含 v1 中的城市,这些城市在 v2 中定义,以及我访问过它们的次数(访问在 v1).

中定义

我在想 v3 是由 VARCHAR2 索引(索引是城市名称)并且只包含一个值,即访问次数。

是否可以实现类似的东西:

begin
    v1(1).c1 := 1990;
    v1(1).c2 := 'PARIS';
    V1(2).c1 := 2000;
    V1(2).c2 := 'PARIS';
    v1(3).c1 := 2001;
    v1(3).c2 := 'PARIS';
    v1(4).c1 := 1992;
    v1(4).c2 := 'MADRID';
    v1(5).c1 := 1994;
    v1(5).c2 := 'LONDON';
    v1(6).c1 := 1998;
    v1(6).c2 := 'PRAGUE';

    v2(1) := 'PARIS';
    v2(2) := 'LONDON';
    v2(3) := 'MADRID';

    for i in 1 .. v1.count loop
        for j in 1 .. v2.count loop
            if v1(i).c2 = v2(j)
                then
                    v3(v2(j).c2) := counter + 1;

            end if;
        end loop;
    end loop;

end;

一般来说,是的,你可以做到。在这种情况下存在一些问题 - 例如,在 v3(v2(j).c2) := counter + 1; 行中 v2 中没有 c2 元素,因此您会在那里遇到编译错误,并且在同一行中 v3 reference 后面应该跟 .no_visits,但一般来说,你在这里尝试做的事情肯定是语言允许的。

使用 v2 中的值初始化 v3,稍微修改计数循环并在最终循环中显示结果:

declare 
    type r1 is record ( c1 number, c2 varchar2(64));
    type t1 is table of r1 index by binary_integer;
    v1 t1;
    type t2 is table of varchar2(64) index by binary_integer;
    v2 t2;
    type r3 is record( no_visits number);
    type t3 is table of r3 index by varchar2(64);
    v3 t3;
begin
    v1(1).c1 := 1990;
    v1(1).c2 := 'PARIS';
    V1(2).c1 := 2000;
    V1(2).c2 := 'PARIS';
    v1(3).c1 := 2001;
    v1(3).c2 := 'PARIS';
    v1(4).c1 := 1992;
    v1(4).c2 := 'MADRID';
    v1(5).c1 := 1994;
    v1(5).c2 := 'LONDON';
    v1(6).c1 := 1998;
    v1(6).c2 := 'PRAGUE';

    v2(1) := 'PARIS';
    v2(2) := 'LONDON';
    v2(3) := 'MADRID';

    for i in 1..v2.count loop
        v3(v2(i)).no_visits := 0;
    end loop;

    for i in 1 .. v1.count loop
        for j in 1 .. v2.count loop
            if v1(i).c2 = v2(j) then
                    v3(v2(j)).no_visits := v3(v2(j)).no_visits + 1;
            end if;
        end loop;
    end loop;

    for i in 1..v2.count loop
        dbms_output.put_line('City: '||v2(i));
        dbms_output.put_line('Visited: '||v3(v2(i)).no_visits);
    end loop;

end;

输出:

City: PARIS
Visited: 3
City: LONDON
Visited: 1
City: MADRID
Visited: 1