使用 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 列表有两个值:display
和 return
。我们通常 显示姓名和return ID;在这两种情况下你都有“名字”。我不是说它是错误的,它只是有点不寻常。
因此:首先确保您在SQL*Plus(或SQL开发者或任何一个)中写入return所需的查询值您使用的工具),然后将其移动到 Apex。
P.S。不要为格式化感到抱歉。付出一些努力,让您(和我们)的生活更简单。
我正在尝试使用 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 列表有两个值:display
和 return
。我们通常 显示姓名和return ID;在这两种情况下你都有“名字”。我不是说它是错误的,它只是有点不寻常。
因此:首先确保您在SQL*Plus(或SQL开发者或任何一个)中写入return所需的查询值您使用的工具),然后将其移动到 Apex。
P.S。不要为格式化感到抱歉。付出一些努力,让您(和我们)的生活更简单。