PL SQL FUNCTION BODY RETURN SQL QUERY GETS ERROR: ORA-20001: Query must begin with SELECT or WITH
PL SQL FUNCTION BODY RETURN SQL QUERY GETS ERROR: ORA-20001: Query must begin with SELECT or WITH
我得到一个 ORA-20001:当我验证下面的代码时,查询必须以 SELECT 或 WITH 开头。这是否意味着我不能使用 FOR 记录(sql 查询)和循环?可以像我在循环中那样加载 APEX 卡信息吗?感谢任何帮助。
我的目标是显示项目的所有媒体,并使特定 STEP_MEDIA 行中引用的媒体的图标变为绿色。我试过外连接,但我得到了重复。如果有更好的方法请告诉我。
甲骨文云
应用快车 21.1.7
数据库版本:19c
return q'~
DECLARE
n_count number;
BEGIN
FOR record in (SELECT *
FROM MEDIA
where KHN_PROJECT_ID = :P300_PROJECT_ID
ORDER BY FILE_NAME)
LOOP
CARD_TITLE := record.FILE_NAME;
CARD_SUBTITLE := record.FILE_MIMETYPE;
CARD_LINK := apex_util.prepare_url( '#' );
CASE WHEN record.FILE_MIMETYPE LIKE 'video%'
THEN
CARD_TEXT := '<video> ...</video>';
ELSE
CARD_TEXT := '<img> ...</img>';
END CASE;
CARD_ICON := 'fa-check';
SELECT COUNT(STEP_MEDIA_ID) INTO n_count
FROM STEP_MEDIA
WHERE MEDIA_ID = record.MEDIA_ID AND STEP_ID = :P300_STEP_ID_LOADED;
IF ncount = 0
THEN
CARD_COLOR := 'u-success';
ELSE
CARD_COLOR := 'u-normal';
END IF;
CARD_SUBTEXT := '<button class="t-Button t-Button--noLabel t-Button--icon add-favorite" id="fav_'||record.MEDIA_ID||'" type="button">Select</span></button>';
END LOOP;
END;
~';
这是我使用外连接编写的代码。它会产生重复的行。
select m.FILE_NAME AS CARD_TITLE,
m.FILE_MIMETYPE AS CARD_SUBTITLE,
m.MEDIA_ID,
apex_util.prepare_url( '#' ) CARD_LINK,
CASE WHEN m.FILE_MIMETYPE LIKE 'video%'
THEN
'<video >...</video>'
ELSE
'<img >...</img>'
END
CARD_TEXT,
'fa-check' CARD_ICON,
CASE WHEN sm.step_media_id is NULL
THEN
'u-success'
ELSE
'u-normal'
END
CARD_COLOR,
from MEDIA m
LEFT OUTER JOIN STEP_MEDIA sm
ON m.MEDIA_ID = sm.MEDIA_ID
where m.KHN_PROJECT_ID = :P300_PROJECT_ID OR sm.STEP_ID = :P300_STEP_ID_LOADED
ORDER BY m.FILE_NAME
这是 Apex 吧?
代码从 -20000 到 -20999 的错误是 user-defined。在这种情况下,Apex 开发人员创建了它(因此它不是 built-in Oracle 错误之一)。
上面写了什么?看起来您想“动态地”创建具有卡片布局的经典报告。您应该 return 一个 有效查询 ,它以 select
或 with
关键字开头(如果您使用 with
分解子句,即 CTE(常见 table 表达式))。
没有证据表明您发布的代码return就是我所说的。
在我看来,您无论如何都不应该循环执行。一切都可以通过使用 CASE
表达式设置某些 CARD_...
值的单个查询(在您的情况下,这将是两个 table 的 join
来完成。
该查询将是经典报告的 来源。
此查询使用与 Oracle Apex 兼容的 sql 并显示所有媒体并显示步骤中使用的媒体。子查询是解决方案。
select DISTINCT m.FILE_NAME AS CARD_TITLE,
m.FILE_MIMETYPE AS CARD_SUBTITLE,
m.TAGS AS TAGS,
m.MEDIA_ID,
apex_util.prepare_url( '#' ) CARD_LINK,
CASE WHEN m.FILE_MIMETYPE LIKE 'video%'
THEN
'<video controls width = "100%" height= "100%" class="object-fit">... </video>'
ELSE
'<img >...</img>'
END
CARD_TEXT,
'fa-check' CARD_ICON,
CASE WHEN sm.step_media_id is NULL
THEN
'u-normal'
ELSE
'u-success'
END
CARD_COLOR,
'<button class="t-Button t-Button--noLabel t-Button--icon add-favorite" id="fav_'||m.MEDIA_ID||'" type="button">Select</span></button>' CARD_SUBTEXT
from MEDIA m
LEFT OUTER JOIN (select * FROM STEP_MEDIA WHERE STEP_ID = :P300_STEP_ID_LOADED) sm
ON m.MEDIA_ID = sm.MEDIA_ID
where m.KHN_PROJECT_ID = :P300_PROJECT_ID
ORDER BY m.FILE_NAME
我得到一个 ORA-20001:当我验证下面的代码时,查询必须以 SELECT 或 WITH 开头。这是否意味着我不能使用 FOR 记录(sql 查询)和循环?可以像我在循环中那样加载 APEX 卡信息吗?感谢任何帮助。
我的目标是显示项目的所有媒体,并使特定 STEP_MEDIA 行中引用的媒体的图标变为绿色。我试过外连接,但我得到了重复。如果有更好的方法请告诉我。
甲骨文云 应用快车 21.1.7 数据库版本:19c
return q'~
DECLARE
n_count number;
BEGIN
FOR record in (SELECT *
FROM MEDIA
where KHN_PROJECT_ID = :P300_PROJECT_ID
ORDER BY FILE_NAME)
LOOP
CARD_TITLE := record.FILE_NAME;
CARD_SUBTITLE := record.FILE_MIMETYPE;
CARD_LINK := apex_util.prepare_url( '#' );
CASE WHEN record.FILE_MIMETYPE LIKE 'video%'
THEN
CARD_TEXT := '<video> ...</video>';
ELSE
CARD_TEXT := '<img> ...</img>';
END CASE;
CARD_ICON := 'fa-check';
SELECT COUNT(STEP_MEDIA_ID) INTO n_count
FROM STEP_MEDIA
WHERE MEDIA_ID = record.MEDIA_ID AND STEP_ID = :P300_STEP_ID_LOADED;
IF ncount = 0
THEN
CARD_COLOR := 'u-success';
ELSE
CARD_COLOR := 'u-normal';
END IF;
CARD_SUBTEXT := '<button class="t-Button t-Button--noLabel t-Button--icon add-favorite" id="fav_'||record.MEDIA_ID||'" type="button">Select</span></button>';
END LOOP;
END;
~';
这是我使用外连接编写的代码。它会产生重复的行。
select m.FILE_NAME AS CARD_TITLE,
m.FILE_MIMETYPE AS CARD_SUBTITLE,
m.MEDIA_ID,
apex_util.prepare_url( '#' ) CARD_LINK,
CASE WHEN m.FILE_MIMETYPE LIKE 'video%'
THEN
'<video >...</video>'
ELSE
'<img >...</img>'
END
CARD_TEXT,
'fa-check' CARD_ICON,
CASE WHEN sm.step_media_id is NULL
THEN
'u-success'
ELSE
'u-normal'
END
CARD_COLOR,
from MEDIA m
LEFT OUTER JOIN STEP_MEDIA sm
ON m.MEDIA_ID = sm.MEDIA_ID
where m.KHN_PROJECT_ID = :P300_PROJECT_ID OR sm.STEP_ID = :P300_STEP_ID_LOADED
ORDER BY m.FILE_NAME
这是 Apex 吧?
代码从 -20000 到 -20999 的错误是 user-defined。在这种情况下,Apex 开发人员创建了它(因此它不是 built-in Oracle 错误之一)。
上面写了什么?看起来您想“动态地”创建具有卡片布局的经典报告。您应该 return 一个 有效查询 ,它以 select
或 with
关键字开头(如果您使用 with
分解子句,即 CTE(常见 table 表达式))。
没有证据表明您发布的代码return就是我所说的。
在我看来,您无论如何都不应该循环执行。一切都可以通过使用 CASE
表达式设置某些 CARD_...
值的单个查询(在您的情况下,这将是两个 table 的 join
来完成。
该查询将是经典报告的 来源。
此查询使用与 Oracle Apex 兼容的 sql 并显示所有媒体并显示步骤中使用的媒体。子查询是解决方案。
select DISTINCT m.FILE_NAME AS CARD_TITLE,
m.FILE_MIMETYPE AS CARD_SUBTITLE,
m.TAGS AS TAGS,
m.MEDIA_ID,
apex_util.prepare_url( '#' ) CARD_LINK,
CASE WHEN m.FILE_MIMETYPE LIKE 'video%'
THEN
'<video controls width = "100%" height= "100%" class="object-fit">... </video>'
ELSE
'<img >...</img>'
END
CARD_TEXT,
'fa-check' CARD_ICON,
CASE WHEN sm.step_media_id is NULL
THEN
'u-normal'
ELSE
'u-success'
END
CARD_COLOR,
'<button class="t-Button t-Button--noLabel t-Button--icon add-favorite" id="fav_'||m.MEDIA_ID||'" type="button">Select</span></button>' CARD_SUBTEXT
from MEDIA m
LEFT OUTER JOIN (select * FROM STEP_MEDIA WHERE STEP_ID = :P300_STEP_ID_LOADED) sm
ON m.MEDIA_ID = sm.MEDIA_ID
where m.KHN_PROJECT_ID = :P300_PROJECT_ID
ORDER BY m.FILE_NAME