如何在存储过程中将 JSON 类型的数据作为输入参数传递
How to pass JSON type data as an input parameter in a Stored procedure
我有一个要求,我需要将 JSON 作为输入参数传递并相应地处理数据。
JSON数据:
{
"Table name": "test_table",
"Column name":["column_1","column_2"],
"Column_value":["test_data","1"]
}
我需要用这个 JSON 作为输入参数编写一个程序。
然后根据 table 名称和列名,它应该将特定列值插入到 table 的相应列中。
伪代码:
将JSON存储在一个table中,table结构为
table_id |Table_name | Column_name | Column_value
然后将table_name、column_name和column_valuesJSON格式作为输入参数。
然后从输入参数中提取tables、列和column_value并加载到各自的table.
这行得通吗?因为我不知道如何在存储过程中处理 JSON,或者如果有人知道如何从这个开始,它会对我有所帮助。
使用的工具:SQL 开发人员 (18c)
您可以使用:
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;
/
如果你有 table:
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;
/
table 将包含:
SELECT * FROM "test_table";
column_1
column_2
test_data
1
db<>fiddle here
我有一个要求,我需要将 JSON 作为输入参数传递并相应地处理数据。
JSON数据:
{
"Table name": "test_table",
"Column name":["column_1","column_2"],
"Column_value":["test_data","1"]
}
我需要用这个 JSON 作为输入参数编写一个程序。
然后根据 table 名称和列名,它应该将特定列值插入到 table 的相应列中。
伪代码:
将JSON存储在一个table中,table结构为
table_id |Table_name | Column_name | Column_value
然后将table_name、column_name和column_valuesJSON格式作为输入参数。
然后从输入参数中提取tables、列和column_value并加载到各自的table.
这行得通吗?因为我不知道如何在存储过程中处理 JSON,或者如果有人知道如何从这个开始,它会对我有所帮助。
使用的工具:SQL 开发人员 (18c)
您可以使用:
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;
/
如果你有 table:
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;
/
table 将包含:
SELECT * FROM "test_table";
column_1 column_2 test_data 1
db<>fiddle here