如果您有一个包含单列的 EMPLOYEE 表:
CREATE TABLE employee (firstname VARCHAR2(20));
那么你的程序就起作用了。
如果您有额外的列:
ALTER TABLE employee ADD lastname VARCHAR2(20);
ALTER PROCEDURE INSERT_INTEGRATED_EMPLOYEE COMPILE;
SELECT * FROM USER_ERRORS;
输出错误:
| NAME |
TYPE |
SEQUENCE |
LINE |
POSITION |
TEXT |
ATTRIBUTE |
MESSAGE_NUMBER |
| INSERT_INTEGRATED_EMPLOYEE |
PROCEDURE |
1 |
10 |
3 |
PL/SQL: ORA-00913: too many values |
ERROR |
0 |
| INSERT_INTEGRATED_EMPLOYEE |
PROCEDURE |
2 |
9 |
3 |
PL/SQL: SQL Statement ignored |
ERROR |
0 |
这是因为你定义了类型和变量:
TYPE EMPLOYEES IS TABLE OF EMPLOYEE%ROWTYPE;
EMPS EMPLOYEES;
如果EMPLOYEE 表有多于一列,那么EMPS 变量将是一个记录集合,每个记录都需要多于一列。
然后:
SELECT *
BULK COLLECT INTO EMPS
FROM json_table(
emp,
'$[*]'
COLUMNS ( FIRSTNAME VARCHAR PATH '$.firstname'));
将尝试将单个 firstname 值插入需要多个值的记录中。
相反,您可以创建单一数据类型的表(而不是记录):
CREATE OR REPLACE PROCEDURE INSERT_INTEGRATED_EMPLOYEE (
emp clob,
id number
)
IS
TYPE firstname_table IS TABLE OF employee.firstname%TYPE;
EMPS firstname_table;
BEGIN
SELECT *
BULK COLLECT INTO EMPS
FROM json_table(
emp,
'$[*]'
COLUMNS (
FIRSTNAME VARCHAR PATH '$.firstname'
)
);
FOR i IN 1..EMPS.COUNT LOOP
dbms_output.put_line(EMPS(i) || ' ' || emp);
END LOOP;
END;
/
或者,使用游标(而不是集合):
CREATE OR REPLACE PROCEDURE INSERT_INTEGRATED_EMPLOYEE (
emp clob,
id number
)
IS
BEGIN
FOR i IN (
SELECT *
FROM json_table(
emp,
'$[*]'
COLUMNS (
FIRSTNAME VARCHAR PATH '$.firstname'
)
)
)
LOOP
dbms_output.put_line(i.FIRSTNAME || ' ' || emp);
END LOOP;
END;
/
db小提琴here