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 一个 有效查询 ,它以 selectwith 关键字开头(如果您使用 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