首页 > 解决方案 > ORA-44002 函数体上的对象名称无效

问题描述

DECLARE 
      X VARCHAR2(32767);
    BEGIN
      X := '
      SELECT to_char(days.n, ''DD/MM/YYYY HH24'') as name,
             NVL(ROUND(AVG(s1.HIGH),2),-1) HIGH
      FROM  (SELECT TO_DATE('''||:P8_DATE_DEBUT||''', ''DD/MM/YYYYHH24'')+(level-1)/TO_NUMBER('''||:P8_ECHELLE||''') as n
             FROM   dual
             CONNECT BY level <= TO_DATE('''||:P8_DATE_FIN||''', ''DD/MM/YYYYHH24'')+1-TO_DATE('''||:P8_DATE_DEBUT||''', ''DD/MM/YYYYHH24''))*TO_NUMBER('''||:P8_ECHELLE||''')      
            ) days
            LEFT OUTER JOIN
            (SELECT trunc(RAW_DATE, '''||:P8_TRUNC||''') as HO,
                    NVL(ROUND(AVG(VALID_VALUE),2), 0) as HIGH
             FROM  '||
                   dbms_assert.sql_object_name('SAFEGE.MSR_'||NVL(:P8_ECHELLE_EMMA,'4245')) -- NVL better than COALESCE for a simple Null check
                   ||'@EMMASAFE.NTSIVOA'
                   ||'
             WHERE RAW_DATE >= TO_DATE('''||:P8_DATE_DEBUT||''', ''DD/MM/YYYY'')  -- avoiding BETWEEN means less messing about with time components
             AND   RAW_DATE <  TO_DATE('''||:P8_DATE_FIN||''', ''DD/MM/YYYY'')+1  -- just need to use less than target date+1 instead
             AND   VALIDITY = 1
             GROUP BY trunc(RAW_DATE, '''||:P8_TRUNC||''') 
            ) s1
            ON days.n = S1.HO
      GROUP BY days.n
      ORDER BY days.n';
      RETURN X;
    END;

我在这个函数体上得到一个无效的对象名称错误。我找不到出现此错误的行。关于如何解决这个语法错误的任何想法?

问候, 克里斯蒂安

标签: sqloracle

解决方案


就是这一行:

dbms_assert.sql_object_name('SAFEGE.MSR_'||NVL(:P8_ECHELLE_EMMA,'4245'))

DBMS_ASSERT.SQL_OBJECT_NAME功能文档指出:

此函数验证输入参数字符串是否为现有 SQL 对象的限定 SQL 标识符。

您断言该对象存在,但您在断言之外将其连接起来,该断言@EMMASAFE.NTSIVOA将跨越数据库链接。您正在运行查询的服务器无法断言对象名称有效,因为它可能不存在于该服务器上(而是存在于远程服务器上)。

db<>小提琴


推荐阅读