如何在 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
谁能帮帮我?我不太擅长 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