Я не могу полностью понять ваши потребности в создании динамического запроса c, но, возможно, приведенный ниже сценарий может дать вам некоторое представление об использовании JSON_VALUE и написании операторов динамического c pl sql.
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;
/
![enter image description here](https://i.stack.imgur.com/1hYTp.png)
Примечание: если вы хотите динамически описывать столбцы из ваших json данных, поскольку я знаю oracle, не могу этого сделать. Вы должны описать json теги один за другим как столбцы JSON_TABLE перед их использованием.