ORA-00904 - 动态标识符无效 SQL

ORA-00904 - Invalid Identifier in Dynamic SQL

我正试图查明我在存储过程中遇到的 ORA-00904 - Invalid Identifier 错误。

代码如下:

CREATE OR REPLACE PROCEDURE CDG4_HIER_GET_SUBTREE(pDimensionId IN VARCHAR2, pPeriodId IN NUMBER, pNodeId IN NUMBER, pMode IN CHAR, rCursor OUT SYS_REFCURSOR) IS

v_table_name VARCHAR2(30);
v_function_name VARCHAR2(30) := 'CDG4_HIER_MGR_HAS_CHILDREN'; -- some function defined in the same package
InvalidMode EXCEPTION;
---
v_sql VARCHAR2(2000);

BEGIN

-- Get dynamic table name
v_sql := 'SELECT UPPER(TABLE_ID)'
      ||'FROM CDG4_CFG_MAP_GER '
      ||'WHERE UPPER(DIMENSION_ID) = UPPER(''' || pDimensionId || ''') ';

EXECUTE IMMEDIATE v_sql INTO v_table_name;

IF pMode = 'F' THEN

    -- Do something

ELSIF pMode = 'S' THEN

    v_sql := 'SELECT A.PERIODO_K, '
           ||'      A.FIGLIO_K, '
           ||'      A.PADRE_K, '
           ||'      A.F_LAYOUT, '
           ||'      A.F_VISUALIZZA, '
           ||'      DECODE(A.PADRE_K, NULL, NULL, B2.CODICE) AS CODICE_PADRE, '
           ||'      A.F_ORDINE, '
           ||'      DECODE(A.GEN1, ''2'', ''I'', A.GEN1) AS GEN1, '
           ||'      A.GEN2, '
           ||'      A.GEN3, '
           ||'      ''[''|| B1.CODICE || ''] - '' || B1.DESCR AS DESCR, '
           ||'      ''[''|| B1.CODICE || ''] - '' || B1.DESCR AS DESCRIZIONE, '
           ||'      ' || v_function_name || '(''' || pDimensionId || ''', ' || pPeriodId || ', A.FIGLIO_K) AS HAS_CHILDREN '
           ||'FROM DM_GERARCHIE A, DIM_BO_CANALE_PRIMARIA B1, DIM_BO_CANALE_PRIMARIA B2 '
           ||'WHERE A.FIGLIO_K = B1.CODICE_K '
           ||'AND A.PADRE_K = B2.CODICE_K '
           ||'AND UPPER(A.DIMENSION_ID) = UPPER(''' || pDimensionId || ''') ' 
           ||'AND UPPER(B1.DIMENSION_ID) = UPPER(''' || pDimensionId || ''') ' 
           ||'AND UPPER(B2.DIMENSION_ID) = UPPER(''' || pDimensionId || ''') '
           ||'AND A.PERIODO_K = ' || pPeriodId
           ||' AND A.FIGLIO_K = ' || pNodeId;

ELSE 

    RAISE InvalidMode;

END IF;

OPEN rCursor FOR v_sql;

EXCEPTION
WHEN InvalidMode THEN
RAISE_APPLICATION_ERROR(-20005, 'Invalid selection mode.');
WHEN OTHERS THEN
RAISE_APPLICATION_ERROR(-20004, 'Generic error - '||SQLCODE||' -ERROR- '||SQLERRM);

END;

Oracle 似乎无法识别函数 v_function_name(它在同一个包中),因为它在打开游标 rCursor.[=16 时不断返回 ORA-00904 =]

有任何关于此行为的合理条款的提示吗?

提前致谢。

Oracle seems not to be able to identify the function v_function_name (it is in the same package

动态 SQL 作为 SQL 执行,但在包的范围之外。这意味着我们需要构建一个有效的 SQL 语句。如果你是 运行 一个类似的静态 SELECT 语句你会写 package_name.v_function_name 因为你的 SQL 会在包外执行。这就是你需要在这里做的。


尽管现在我更仔细地查看了您的代码,但我根本不明白您为什么要使用 Dynamic SQL。您可以使用绑定变量和参数将语句作为静态 SQL 执行。

OPEN rCursor FOR 
    SELECT A.PERIODO_K, 
           A.FIGLIO_K, 
           A.PADRE_K, 
           A.F_LAYOUT, 
           A.F_VISUALIZZA, 
           DECODE(A.PADRE_K, NULL, NULL, B2.CODICE) AS CODICE_PADRE, 
           A.F_ORDINE, 
           DECODE(A.GEN1, ''2'', ''I'', A.GEN1) AS GEN1, 
           A.GEN2, 
           A.GEN3, 
           '[' || B1.CODICE || '] - ' ||  B1.DESCR AS DESCR, 
           '[' || B1.CODICE || '] - ' || B1.DESCR AS DESCRIZIONE, 
            package_name.v_function_name (pDimensionId ,pPeriodId , A.FIGLIO_K) AS HAS_CHILDREN 
      FROM DM_GERARCHIE A, DIM_BO_CANALE_PRIMARIA B1, DIM_BO_CANALE_PRIMARIA B2 
      WHERE A.FIGLIO_K = B1.CODICE_K 
      AND A.PADRE_K = B2.CODICE_K 
      AND UPPER(A.DIMENSION_ID) = UPPER( pDimensionId )  
      AND UPPER(B1.DIMENSION_ID) =  UPPER( pDimensionId )  
      AND UPPER(B2.DIMENSION_ID) = UPPER( pDimensionId )  
      AND A.PERIODO_K = pPeriodId
      AND A.FIGLIO_K = pNodeId;