sql - 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;
我在这个函数体上得到一个无效的对象名称错误。我找不到出现此错误的行。关于如何解决这个语法错误的任何想法?
问候, 克里斯蒂安
解决方案
就是这一行:
dbms_assert.sql_object_name('SAFEGE.MSR_'||NVL(:P8_ECHELLE_EMMA,'4245'))
DBMS_ASSERT.SQL_OBJECT_NAME
功能文档指出:
此函数验证输入参数字符串是否为现有 SQL 对象的限定 SQL 标识符。
您断言该对象存在,但您在断言之外将其连接起来,该断言@EMMASAFE.NTSIVOA
将跨越数据库链接。您正在运行查询的服务器无法断言对象名称有效,因为它可能不存在于该服务器上(而是存在于远程服务器上)。
推荐阅读
- javafx - 如何在 Java-fx 中创建这样的视图?
- javascript - 如何在使用 React 的同一页面上更新 URL 参数并调用 fetch?
- python-3.x - ImportError:没有名为 Courses.wsgi 的模块
- mysql - 如何按选定的顺序选择所有具有 min begin_date 和 max end_date 的工人?
- php - 如何通知用户房间预订状态?
- python - 如何在 Python 的 Argparse 中为位置参数设置可选参数?
- python - 使用视图装饰器来处理用户权限是不好的做法吗?
- django-rest-framework - Django DRF 检索选择列表(组合框)
- amazon-web-services - 使用提供的 lambda 运行时的 AWS SAM 解决方法
- python - 如何计算速度的相空间并在python中绘制散点图?