当我的json响应如下时,我面临一个问题:
declare
sample_json varchar2 (32767)
:= '{"items": [{"NAME":"AUDI","YEAR":"2000"},{"NAME":"BMW","YEAR":"2010"}]}';
BEGIN
for rec IN (
select j.name,j.year
from json_table(sample_json,'$[*]' COLUMNS
name varchar2(20) PATH '$.items[0].NAME',
year NUMBER PATH '$.items[0].YEAR'
) j )
LOOP
dbms_output.put_line (rec.name||','||rec.year);
END LOOP;
END;
/
我必须使用$ .items [0] .NAME来获得一个值,但我想使其动态化,以便它可以循环给我两个值。
我无法完全理解您对使查询动态化的需求,但是也许下面的脚本可以为您提供一些有关使用JSON_VALUE和编写动态plsql语句的想法。
DECLARE
SAMPLE_JSON VARCHAR2 (32767)
:= '{"items": [{"NAME":"AUDI","YEAR":"2000"},{"NAME":"BMW","YEAR":"2010"}]}';
V_RESULT_NAME VARCHAR2 (500);
V_RESULT_YEAR VARCHAR2 (500);
V_KEY VARCHAR (200) := 'items[0].NAME';
V_KEY2 VARCHAR (200) := 'items[0].YEAR';
BEGIN
EXECUTE IMMEDIATE 'SELECT JSON_VALUE(:1,''$.' || V_KEY || ''') FROM DUAL'
INTO V_RESULT_NAME
USING SAMPLE_JSON;
DBMS_OUTPUT.PUT_LINE (V_RESULT_NAME );
END;
/
这里您可以将json数据中的值动态插入表中。
DECLARE
SAMPLE_JSON VARCHAR2 (32767)
:= '{"items": [{"NAME":"AUDI","YEAR":"2000"},{"NAME":"BMW","YEAR":"2010"}]}';
BEGIN
FOR REC IN (
SELECT J.NAME,J.YEAR
FROM JSON_TABLE(SAMPLE_JSON,'$[*]' COLUMNS
NAME VARCHAR2(20) PATH '$.items[0].NAME',
YEAR NUMBER PATH '$.items[0].YEAR'
) J )
LOOP
EXECUTE IMMEDIATE 'INSERT INTO YOUR_TABLE(NAME,YEAR) VALUES('||REC.NAME||','||REC.YEAR||'); COMMIT;'
-- DBMS_OUTPUT.PUT_LINE (REC.NAME||','||REC.YEAR);
END LOOP;
END;
/
不使用索引。
DECLARE
SAMPLE_JSON VARCHAR2 (32767)
:= '{"items": [{"NAME":"AUDI","YEAR":"2000"},{"NAME":"BMW","YEAR":"2010"},{"NAME":"TOFAS","YEAR":"1995"}]}';
BEGIN
FOR REC IN (
SELECT J.NAME,J.YEAR
FROM JSON_TABLE(SAMPLE_JSON,'$.items[*]' COLUMNS
NAME VARCHAR2(20) PATH '$.NAME',
YEAR NUMBER PATH '$.YEAR'
) J )
LOOP
--EXECUTE IMMEDIATE 'INSERT INTO YOUR_TABLE(NAMEE,YEARR) VALUES('||REC.NAME||','||REC.YEAR||'); COMMIT;';
DBMS_OUTPUT.PUT_LINE (REC.NAME||','||REC.YEAR);
END LOOP;
END;
/
注意:如果要动态描述json数据中的列,因为我知道oracle无法做到这一点。您必须先将JSON标签描述为JSON_TABLE列,然后再使用它们。