问题描述
长时间潜伏,第一次闯入。
我正在尝试使用PL / SQL函数填充LOV,这是第一次返回查询。我似乎无法正确使用语法,因为在验证时总是会收到以下错误:
ORA-20999:解析“ ORA-20999:无法解析SQL查询!”中返回的查询结果!
以下PL / SQL函数的ORA-06550:第2行,第145列:ORA-00923:在预期的位置找不到FROM关键字
:
DECLARE
EMPLOYEES NUMBER := 0;
QR varchar(4000);
BEGIN
SELECT COUNT(*) INTO EMPLOYEES FROM TS4_USER@TS_INFO_4.STT
WHERE MAN_QT = :APP_USER
IF EMPLOYEES = 0 THEN
QR := 'select FIRST_NAME|| '' '' ||LAST_NAME d,select FIRST_NAME|| '' ''
||LAST_NAME r
FROM TS4_USER@TS_INFO_4.STT
WHERE MAN_QT IN (SELECT QT FROM TS4_USER@TS_INFO_4.STT
WHERE MAN_QT = (SELECT MAN_QT FROM TS4_USER@TS_INFO_4.STT
WHERE QT = :APP_USER)) AND FL = ''ESA''';
ELSE
QR := 'select FIRST_NAME|| '' '' ||LAST_NAME d,select FIRST_NAME|| '' ''
||LAST_NAME r
from TS4_USER@TS_INFO_4.STT
where MAN_QT = :APP_USER';
END IF;
RETURN QR;
END
这令人困惑,因为第2行是我声明区域的一部分,并且我不希望在这里出现FROM。我已对此问题进行了一些谷歌搜索,但很少提出。我是SQL和APEX的新手,所以我意识到我可能会忽略一些相当简单的内容。任何帮助都将不胜感激。
编辑:很抱歉格式化
解决方法
乍一看,查询使用错误的语法。您不能有两个SELECT
,例如
select FIRST_NAME|| '' '' ||LAST_NAME d,select FIRST_NAME||
------ ------
here here
应该是
select FIRST_NAME|| ' ' ||LAST_NAME d,FIRST_NAME||
正如您所注意到的(如果这样做的话),我用两个连续的单引号替换了一个。当然,它会失败,因为您正在编写动态SQL,并且必须“转义”单引号。但是,我建议您使用q引用机制,该机制更易于编写和维护。像这样:
QR := q'[select FIRST_NAME|| ' ' || LAST_NAME d,FIRST_NAME|| ' ' || LAST_NAME r
FROM TS4_USER@TS_INFO_4.STT
WHERE MAN_QT IN (SELECT QT FROM TS4_USER@TS_INFO_4.STT
WHERE MAN_QT = (SELECT MAN_QT FROM TS4_USER@TS_INFO_4.STT
WHERE QT = :APP_USER
)
)
AND FL = 'ESA']';
但是,您不是使它复杂化了吗?不只是
select ...
from ts4_user
where qt = :APP_USER
and fl = 'ESA'
此外,选择列表具有两个值:display
和return
。我们通常显示名称并返回ID;两种情况下都使用“名称”。我并不是说这是错误的,这有点不寻常。
因此:首先请确保您编写的查询在SQL * Plus(或SQL Developer或您使用的任何工具)中返回所需的值,然后将其移至Apex。
P.S。不要为格式化而后悔。付出一些努力,使您(和我们)的生活更简单。