如何在 table oracle sql 中插入 json 数据?

How can I insert the json data in table oracle sql?

谁能帮帮我?我不太擅长 sql.....

我正在尝试将此示例的输出放入 table

我有这个场景:

DECLARE
  v_project_id   NUMBER(15);
  v_group_name   VARCHAR2(150);
  v_user_id      NUMBER(15);
  v_group_id     NUMBER(15);
BEGIN
   FOR c IN (
             SELECT project_id
               FROM JSON_TABLE(:projectList,
                                    '$' COLUMNS(NESTED PATH '$.projects[*]'
                                                COLUMNS(
                                                        project_id  VARCHAR2(150) PATH '$.project.id'
                                                        )
                                                )
                               )
            )
   LOOP
     v_project_id  := c.project_id;
     v_group_name:= json_value (:projectList,'$.group_name');
     v_user_id:= json_value (:projectList,'$.user_id');
     v_group_id:= json_value (:projectList,'$.group_id');
     DBMS_OUTPUT.PUT_LINE(v_project_id||' - '||v_group_name||' - '||v_user_id||' - '||v_group_id);
   END LOOP;
END;

当我运行这个程序的时候,出现一个box to fill with the bind variables并且我填了这个json参数:

{
    "group_name" : "Grupo 1",
    "user_id" : 12345,
    "group_id": 10001,
    "projects": 
    [
        {
            "project" : {
                "id" : "721"
            }
        },
        {
            "project" : {
                "id" : "722"
            }
        },
        {
            "project" : {
                "id" : "723"
            }
        },
        {
            "project" : {
                "id" : "724"
            }
        }
    ]
}

ok之后,结果是这样的:

721 - Grupo 1 - 12345 - 10001
722 - Grupo 1 - 12345 - 10001
723 - Grupo 1 - 12345 - 10001
724 - Grupo 1 - 12345 - 10001

现在的问题是:

如何将这个输出插入到一个名为 APP_PROJECT_GROUP 的 table 中,具有这种结构??[​​=18=]

TABLE APP_PROJECT_GROUP ( 
  group_id      NUMBER   (15)    NOT NULL, 
  group_name    VARCHAR2 (150)   NOT NULL, 
  project_id    NUMBER   (15)    NOT NULL, 
  user_id       NUMBER   (15)    NOT NULL, 
  PRIMARY KEY ( group_id ) 
 )

我尝试了很多方法,但我无法解决这个问题

你不能,因为你在 JSON 中的所有项目都有一个相同的 group_id,但你在 group_id 中也有一个 PRIMARY KEY,所以它们必须都是独特。如果您不在 table 定义中包含 PRIMARY KEY

CREATE TABLE APP_PROJECT_GROUP ( 
  group_id      NUMBER   (15)    NOT NULL /*PRIMARY KEY*/, 
  group_name    VARCHAR2 (150)   NOT NULL, 
  project_id    NUMBER   (15)    NOT NULL, 
  user_id       NUMBER   (15)    NOT NULL
 );

那你就不需要PL/SQL,可以用:

INSERT INTO app_project_group (group_id, group_name, project_id, user_id)
SELECT group_id, group_name, TO_NUMBER(project_id), user_id
FROM   JSON_TABLE(
         :your_json,
         '$'
         COLUMNS(
           group_name VARCHAR2(150) PATH '$.group_name',
           group_id   NUMBER(15)    PATH '$.group_id',
           user_id    NUMBER(15)    PATH '$.user_id',
           NESTED PATH '$.projects[*]'
           COLUMNS (
             project_id VARCHAR2(15)  PATH '$.project.id'
           )
         )
       );

那么 table 将包含:

GROUP_ID GROUP_NAME PROJECT_ID USER_ID
10001 Grupo 1 721 12345
10001 Grupo 1 722 12345
10001 Grupo 1 723 12345
10001 Grupo 1 724 12345

db<>fiddle here