ORA-06530:使用架构级类型时引用未初始化的复合

问题描述 投票:0回答:1

我通过以下方式在数据库模式上创建了一条记录和一个记录表:

CREATE OR REPLACE TYPE WS_RESPONSE AS OBJECT (
valeur  VARCHAR2(1000 CHAR)
);

CREATE OR REPLACE TYPE WS_RESPONSE_TABLE AS TABLE OF WS_RESPONSE;

但是,当我尝试用存储过程中的值填充它时,我收到一条错误消息,告诉我它尚未初始化。

我的局部变量是通过以下方式声明的:

v_res            WS_RESPONSE_TABLE := WS_RESPONSE_TABLE();

P_KEYS 在我的例子中具有以下值:

'results{}.attributes.stn_label:results{}.attributes.adr_number'
它用于动态使用不同的API。 v_json 具有被询问的 API 的答案。我尝试了代码的提取部分,它给出了正确的值。

这就是我试图填补它的价值观的方式:

for i in 0..10
loop
    v_res.extend;
    for j in 0..REGEXP_COUNT(P_KEYS, ':')
    loop
        v_key := REGEXP_SUBSTR(P_KEYS, '[^:]+', 1, j+1);
        v_data := apex_json.get_varchar2(p_path => REPLACE(v_key, '{}', '[%d]'), p_values => v_json, p0 => i);
        IF j = 0 THEN
            v_res(v_res.last).valeur := v_data;
        ELSE
            v_res(v_res.last).valeur := v_res(v_res.last).valeur || ' ' || v_data;
        END IF;
    end loop;
end loop;

该过程将在第一次赋值时引发错误。我尝试了不同的方法,但无论我尝试什么,它都不起作用。我已经尝试在循环之前将其扩展 10 行,并且还尝试以不同的方式指向记录。 示例:

v_res(v_res.count).valeur := v_data;
v_res(i+1).valeur := v_data;

有人可以帮我解决这个问题吗?

oracle plsql
1个回答
0
投票

您有一个包含

NULL
值且未初始化的嵌套表集合。这是因为
v_res.extend;
不会在集合中创建
WS_RESPONSE
实例;它只是扩展集合,以便有空间容纳另一个值,并且集合中的位置最初设置为
NULL
。您还需要在集合中创建对象。

DECLARE
  p_keys VARCHAR2(1000) := 'results{}.attributes.stn_label:results{}.attributes.adr_number';
  v_res  WS_RESPONSE_TABLE := WS_RESPONSE_TABLE();
  v_key  VARCHAR2(200);
  v_data CLOB;
  v_json CLOB := EMPTY_CLOB();
BEGIN
  FOR i IN 0..10 LOOP
    v_res.EXTEND;
    FOR j IN 0..REGEXP_COUNT(P_KEYS, ':') LOOP
      v_key := REGEXP_SUBSTR(P_KEYS, '[^:]+', 1, j+1);
      v_data := apex_json.get_varchar2(
                  p_path => REPLACE(v_key, '{}', '[%d]'),
                  p_values => v_json,
                  p0 => i
                );
      IF j = 0 THEN
        v_res(v_res.COUNT) := WS_RESPONSE(v_data);
      ELSE
        v_res(v_res.COUNT).valeur := v_res(v_res.last).valeur || ' ' || v_data;
      END IF;
    END LOOP;
  END LOOP;
END;
/

小提琴

© www.soinside.com 2019 - 2024. All rights reserved.