我通过以下方式在数据库模式上创建了一条记录和一个记录表:
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;
有人可以帮我解决这个问题吗?
您有一个包含
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;
/