【问题标题】:Using PL/SQL Function returning query to populate LOV使用 PL/SQL 函数返回查询来填充 LOV
【发布时间】:2020-08-18 18:32:22
【问题描述】:

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

ORA-20999:解析返回的查询结果为“ORA-20999:解析 SQL 查询失败!

ORA-06550:第 2 行,第 145 列:ORA-00923:未在预期的位置找到 FROM 关键字

以下 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。

【问题讨论】:

    标签: oracle plsql oracle-apex


    【解决方案1】:

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

    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'
    

    此外,选择列表有两个值:displayreturn。我们通常显示名称并返回 ID;在这两种情况下你都有“名字”。我并不是说这是错误的,只是有点不寻常。


    因此:首先确保您编写的查询在 SQL*Plus(或 SQL Developer 或您使用的任何工具)中返回所需的值,然后将其移至 Apex。


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

    【讨论】:

    • 感谢小脚的回复!看起来双重选择和另一个小问题解决了它。这是我必须在我们的管理结构中解决的一个奇怪问题。其他适用于直接向他们汇报的经理。最初的 IF 部分用于“Ops Leads”,没有直接分配给他们的任何人,但其职责包括经理下的职责。所以,我基本上必须先上一层,然后再下两层,以找出那个人将负责并在此基础上开发一个 LOV。是的中层管理人员。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-06
    • 2010-10-20
    • 2011-02-03
    • 2014-06-11
    • 1970-01-01
    相关资源
    最近更新 更多