我有一個要求,我需要將 JSON 作為輸入引數傳遞并相應地處理資料。
JSON資料:
{
"Table name": "test_table",
"Column name":["column_1","column_2"],
"Column_value":["test_data","1"]
}
我需要用這個 JSON 作為輸入引數撰寫一個程序。
然后根據表名和列名,它應該將特定的列值插入到表的各個列中。
偽代碼:
將 JSON 存盤在一個表中,表結構為
table_id |Table_name | Column_name | Column_value
然后將 table_name、column_name 和 column_values JSON 格式作為輸入引數傳遞。
然后從輸入引數中提取表、列和 column_value 并加載到相應的表中。
這行得通嗎?因為我不知道如何在存盤程序中處理 JSON,或者如果有人知道如何從這個開始,它會對我有所幫助。
使用的工具:SQL Developer (18c)
uj5u.com熱心網友回復:
您可以使用:
CREATE PROCEDURE load_data(
i_json IN CLOB
)
IS
v_obj JSON_OBJECT_T := JSON_OBJECT_T(i_json);
v_tbl VARCHAR2(20) := v_obj.get_string('Table name');
v_cols JSON_ARRAY_T := v_obj.get_Array('Column name');
v_vals JSON_ARRAY_T := v_obj.get_Array('Column_value');
v_sql CLOB := 'INSERT INTO ';
v_sql_vals CLOB := ') VALUES (';
BEGIN
v_sql := v_sql || DBMS_ASSERT.SQL_OBJECT_NAME(
DBMS_ASSERT.ENQUOTE_NAME(v_tbl, FALSE)
);
v_sql := v_sql || ' (';
FOR pos IN 0 .. v_cols.get_size() - 1
LOOP
IF pos > 0 THEN
v_sql := v_sql || ',';
v_sql_vals := v_sql_vals || ',';
END IF;
v_sql := v_sql || DBMS_ASSERT.ENQUOTE_NAME(v_cols.get_string(pos), FALSE);
v_sql_vals := v_sql_vals || DBMS_ASSERT.ENQUOTE_LITERAL(v_vals.get_string(pos));
END LOOP;
v_sql := v_sql || v_sql_vals || ')';
EXECUTE IMMEDIATE v_sql;
END;
/
如果你有桌子:
CREATE TABLE "test_table" (
"column_1" VARCHAR2(20),
"column_2" NUMBER
);
然后你可以使用:
BEGIN
load_data('{
"Table name": "test_table",
"Column name":["column_1","column_2"],
"Column_value":["test_data","1"]
}');
END;
/
該表將包含:
SELECT * FROM "test_table";
列_1 column_2 測驗資料 1
db<>在這里擺弄
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/484740.html
