【问题标题】:Oracle is giving error while creating stored procedure. ORA-22905: cannot access rows from a non-nested table itemOracle 在创建存储过程时出错。 ORA-22905: 无法访问非嵌套表项中的行
【发布时间】:2020-11-29 16:08:19
【问题描述】:

大家好,我需要在 Oracle 中使用动态透视来选择记录。我已经完成了使用“antonsPivoting”https://technology.amis.nl/2006/05/24/dynamic-sql-pivoting-stealing-antons-thunder/ 正常工作的查询。

当我在过程中添加查询时,它会给出错误:ORA-22905: cannot access rows from a non-nested table item。

示例表脚本:

CREATE TABLE DEPARTMENT(DEPT_ID NUMBER PRIMARY KEY, DEPT_NAME VARCHAR2(25))

CREATE TABLE EMPLOYEE(EMP_ID NUMBER, EMP_NAME VARCHAR(100), DEPT_ID NUMBER , FOREIGN KEY(DEPT_ID) REFERENCES DEPARTMENT(DEPT_ID))


INSERT INTO DEPARTMENT(DEPT_ID, DEPT_NAME)
SELECT  1, 'HR' FROM DUAL
UNION ALL SELECT 2, 'OPS' FROM DUAL
UNION ALL SELECT 3, 'MKT' FROM DUAL
UNION ALL SELECT 4, 'FIN' FROM DUAL
UNION ALL SELECT 5, 'IT' FROM DUAL
UNION ALL SELECT 6, 'SERV' FROM DUAL

COMMIT;


INSERT INTO EMPLOYEE(EMP_ID, EMP_NAME, DEPT_ID)

SELECT 1, 'A', 1 FROM DUAL
UNION ALL SELECT 1, 'A', 1 FROM DUAL
UNION ALL SELECT 2, 'B', 1 FROM DUAL
UNION ALL SELECT 3, 'C', 2 FROM DUAL
UNION ALL SELECT 4, 'D', 3 FROM DUAL
UNION ALL SELECT 5, 'E', 3 FROM DUAL
UNION ALL SELECT 6, 'F', 4 FROM DUAL
UNION ALL SELECT 7, 'G', 4 FROM DUAL
UNION ALL SELECT 8, 'H', 4 FROM DUAL
UNION ALL SELECT 9, 'I', 5 FROM DUAL
UNION ALL SELECT 10, 'J', 5 FROM DUAL
UNION ALL SELECT 11, 'K', 1 FROM DUAL
UNION ALL SELECT 12, 'L', 1 FROM DUAL
COMMIT;

示例查询脚本运行良好:

SELECT D.DEPT_NAME, COUNT(E.EMP_ID) TOTAL_EMP

FROM DEPARTMENT D
LEFT JOIN EMPLOYEE E ON D.DEPT_ID= E.DEPT_ID

GROUP BY D.DEPT_NAME
;

动态旋转示例运行良好:

select * from table( pivot(  '
SELECT D.DEPT_NAME, COUNT(E.EMP_ID) TOTAL_EMP

FROM DEPARTMENT D
LEFT JOIN EMPLOYEE E ON D.DEPT_ID= E.DEPT_ID

GROUP BY D.DEPT_NAME' ) )

;

添加出错的程序:

CREATE OR REPLACE PROCEDURE GET_EMPLOYEE (P_RESULT OUT SYS_REFCURSOR)
IS
BEGIN 
    OPEN P_RESULT FOR
    select * from table( pivot(  '
SELECT D.DEPT_NAME, COUNT(E.EMP_ID) TOTAL_EMP

FROM DEPARTMENT D
LEFT JOIN EMPLOYEE E ON D.DEPT_ID= E.DEPT_ID

GROUP BY D.DEPT_NAME' ) )

;
    
END
;

【问题讨论】:

  • 您的代码对我有用。尽管我必须添加代码以在 SQL*Plus 中调用该过程:`variable v_cursor refcursor \n execute get_employee(:v_cursor) \n print :v_cursor'。您使用的是什么版本的 Oracle - 可能这些功能使用了早期版本中没有的一些功能。
  • Oracle Database 12c 企业版版本 12.2.0.1.0 - 64 位 PL/SQL 版本 12.2.0.1.0
  • 我不确定它为什么不起作用。您在编译时或运行时收到错误吗?是否有包含完整错误消息的行号?

标签: oracle stored-procedures sys-refcursor


【解决方案1】:

您是否创建了 Pivot 函数?

请通过下面已经回答的链接。

Link

【讨论】:

  • 是的,在上述查询中创建并正常工作。只有当我将它添加到存储过程中才会出错。
  • 能否将您的数据透视函数代码也添加到问题中
  • 大文件无法在此处附加:请从以下网址下载“AntonsPivoting.zip”technology.amis.nl/2006/05/24/…提前致谢。
猜你喜欢
  • 1970-01-01
  • 2018-09-05
  • 1970-01-01
  • 1970-01-01
  • 2019-10-02
  • 2018-10-21
  • 2018-08-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多