【问题标题】:Oracle stored procedure json_table giving too many value errorOracle 存储过程 json_table 给出太多值错误
【发布时间】:2022-01-13 10:24:33
【问题描述】:
CREATE OR REPLACE PROCEDURE INSERT_INTEGRATED_EMPLOYEE ( emp clob ,  id number) IS TYPE EMPLOYEES IS TABLE OF EMPLOYEE%ROWTYPE; EMPS EMPLOYEES; 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).FIRSTNAME || ' ' || emp);
END LOOP;END;/

我的数据库中有一个员工表,我想映射一个员工的 json 数组,然后打印所有员工的名字。但是这个 json_table 给出了一个错误语句 Error(11,5): PL/SQL: ORA-00913: too many values。

【问题讨论】:

    标签: json oracle stored-procedures


    【解决方案1】:

    如果您有一个包含单列的 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

    【讨论】:

    • 当 Record 需要多于一列时,它只需要不可为空的列还是所有列?
    • @PulkitSharma 所有列
    • 还有一个问题,id 属性现在如何生成唯一值,或者我必须只在 json 对象中传递它?
    猜你喜欢
    • 2015-02-07
    • 2011-12-29
    • 1970-01-01
    • 2019-07-11
    • 2020-12-14
    • 2015-05-02
    • 2012-11-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多