如何在存储过程中将 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