使用 PL/SQL 函数返回查询来填充 LOV

Using PL/SQL Function returning query to populate LOV

我正在尝试使用 PL/SQL 函数首次返回查询来填充 LOV。我似乎无法获得正确的语法,因为我在验证时总是收到以下错误:

ORA-20999: Parsing returned query results in "ORA-20999: Failed to parse SQL query!

ORA-06550: line 2, column 145: ORA-00923: FROM keyword not found where expected

以下 PL/SQL 函数:

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。

乍一看,查询使用了错误的语法。您不能有两个 SELECT,例如

select FIRST_NAME|| '' '' ||LAST_NAME d, select FIRST_NAME||
------                                   ------
here                                     here

应该是

select FIRST_NAME|| ' ' ||LAST_NAME d, FIRST_NAME||

如您所见(如果您注意到的话),我将两个连续的单引号替换为一个。当然,它会失败,因为您正在编写动态 SQL 并且必须“转义”单引号。但是,我建议您使用更易于编写和维护的 q-quoting 机制。像这样:

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'

此外,select 列表有两个值:displayreturn。我们通常 显示姓名和return ID;在这两种情况下你都有“名字”。我不是说它是错误的,它只是有点不寻常。


因此:首先确保您在SQL*Plus(或SQL开发者或任何一个)中写入return所需的查询值您使用的工具),然后将其移动到 Apex。


P.S。不要为格式化感到抱歉。付出一些努力,让您(和我们)的生活更简单。