SQL QUERY returns ORACLE APEX CLASSIC REPORT 没有数据

SQL QUERY returns no data with ORACLE APEX CLASSIC REPORT

我在 Oracle Application Express 4.2 中有一个 SQL 查询(PL/SQL 函数体返回 SQL 查询)。我创建了一个经典报告,这是我在下面使用的查询。我的查询目前工作正常,但我需要用另一个查询更新此函数中的现有查询,当我尝试更改查询时它不起作用。我究竟做错了什么?任何帮助表示赞赏。

下面是我的工作查询:

declare
  a_query varchar2(5000);
  this_strin varchar2(50);
begin
  a_query := 'select flight_nmbr, sequence_nmbr '||
         'from flights '||
         'where sequence_nmbr >= 0 and data_version_name = ''' ||
    :P3_DATA_VERSION || '''';
  if :P3_SEARCH_NUMBER is not null then
    if instr(:P3_SEARCH_NUMBER, '%') > 0 then
      this_strin := :P3_SEARCH_NUMBER;
  else
      this_strin := '%'||:P3_SEARCH_NUMBER||'%';
  end if;
  a_query := a_query||chr(10)||
            ' and flight_nmbr like '''|| upper(this_strin) ||'''';
  end if;
  return a_query;
    end;

我需要将此函数内的查询更新为以下内容:

SELECT FLIGHT_NMBR, SCHEDULED_LAUNCH_DATE
FROM FLIGHTS
WHERE DATA_VERSION_NAME = 'WORKING' AND
  sequence_nmbr >= 0
ORDER BY (CASE WHEN to_date(scheduled_launch_date, 'DD-MON-YY') 
BETWEEN add_months(trunc(sysdate, 'MON'), 0) 
AND add_months(trunc(sysdate, 'MON'), 6) THEN 1 ELSE 2 END),
     (CASE WHEN to_date(scheduled_launch_date, 'DD-MON-YY') 
BETWEEN add_months(trunc(sysdate, 'MON'), 0) 
     AND add_months(trunc(sysdate, 'MON'), 6) 
THEN SCHEDULED_LAUNCH_DATE END),
     sequence_nmbr;

我自己尝试这样做,这是我在下面得到的(这不起作用):

   declare
       a_query varchar2(5000);
    this_strin varchar2(50);
   begin
      a_query := 'select flight_nmbr, sequence_nmbr '||
         'from flights '||
         'where sequence_nmbr >= 0 and data_version_name = ''' ||
         'ORDER BY (CASE WHEN to_date(scheduled_launch_date, 'DD-MON-YY'
          BETWEEN add_months(trunc(sysdate, 'MON'), 0) 
          AND add_months(trunc(sysdate, 'MON'), 6) THEN 1 ELSE 2 END),
          (CASE WHEN to_date(scheduled_launch_date, 'DD-MON-YY') BETWEEN 
           add_months(trunc(sysdate, 'MON'), 0) 
     AND add_months(trunc(sysdate, 'MON'), 6) THEN
             SCHEDULED_LAUNCH_DATE END),
             sequence_nmbr' ||
      :P3_DATA_VERSION || '''';
        if :P3_SEARCH_NUMBER is not null then
        if instr(:P3_SEARCH_NUMBER, '%') > 0 then
           this_strin := :P3_SEARCH_NUMBER;
        else
             this_strin := '%'||:P3_SEARCH_NUMBER||'%';
        end if;
          a_query := a_query||chr(10)||
            ' and flight_nmbr like '''|| upper(this_strin) ||'''';
        end if;
         return a_query;
          end;

它不起作用,因为查询中有很多符号 '。您需要复制每个引号(您只对第一个和最后一个这样做),或者使用以下技巧:

a_query := q'[SELECT FLIGHT_NMBR, SCHEDULED_LAUNCH_DATE
    FROM FLIGHTS
    WHERE DATA_VERSION_NAME = 'WORKING' AND
      sequence_nmbr >= 0
    ORDER BY (CASE WHEN to_date(scheduled_launch_date, 'DD-MON-YY') 
    BETWEEN add_months(trunc(sysdate, 'MON'), 0) 
    AND add_months(trunc(sysdate, 'MON'), 6) THEN 1 ELSE 2 END),
         (CASE WHEN to_date(scheduled_launch_date, 'DD-MON-YY') 
    BETWEEN add_months(trunc(sysdate, 'MON'), 0) 
         AND add_months(trunc(sysdate, 'MON'), 6) 
    THEN SCHEDULED_LAUNCH_DATE END),
         sequence_nmbr]';

q'[ ... ]' 中的文本可以包含单个引号,并且将被视为带有引号的字符串值。

UPD
一个演示这个想法的小例子:

select q'[I'm here]' text from dual;

TEXT   
--------
I'm here