Oracle apex oracle apex 18.2 pl/sql函数体返回sql查询检查页项值

Oracle apex oracle apex 18.2 pl/sql函数体返回sql查询检查页项值,oracle-apex,Oracle Apex,我正在创建一个返回sql查询的交互式reporpl/sql函数体 我有一个页面项:P1\u DIVISION\u ID作为参数传递,并检查项值是否不为空,如下所示 declare lv_query varchar2(4000); begin IF :P1_DIVISION_ID IS NOT NULL THEN select 'select DIVISION, CUSTOMER_ID, PARTY_NAME, ACCOUNT_NUMBER,

我正在创建一个返回sql查询的交互式repor
pl/sql函数体
我有一个页面项
:P1\u DIVISION\u ID
作为参数传递,并检查项值是否不为空,如下所示

declare
lv_query varchar2(4000);
begin
IF :P1_DIVISION_ID IS NOT NULL THEN
select 'select DIVISION,
       CUSTOMER_ID,
       PARTY_NAME,
       ACCOUNT_NUMBER,
       ORG_ID,
       OU_NAME,
       AGING_1_30,
       AGING_31_60,
       AGING_61_90,
       ABOVE_90,
       CURRENT_BALANCE,
       PAST_DUE,
       WEBSITE_STATUS,
       BLOCK_DATE,
       BLOCK_REASON,
       TOTAL_NUM_LOGIN,
       CP_LAST_PAY_DT,
       CP_LAST_AMT,
       CP_LAST_PAY_MODE,
       CP_AGE,
       CP_STATUS,
       CP_DATE,
       CP_DEFF,
       CP_UNBILL,
       CP_PHONE,
       CP_EMAIL,
       CP_ACCT_MGR,
       FU_ASSIGN,
       CP_LTR_SENT_DATE,
       CP_LTR_TYPE,
       CP_COMMENTS,
       COMMENTS
  from XX_CUSTOMER_AGING_V WHERE DIVISION '||:P1_DIVISION_ID INTO lv_query
FROM DUAL;
END IF;


RETURN lv_query;


end;
但当我验证查询时,它会显示以下错误

ORA-20999:WWV\u FLOW\u EXEC.NULL\u QUERY\u由函数返回

处理错误所需的建议

  • P1\u DIVISION\u ID
    时的查询是什么样的?此函数返回空值,因为您没有指定空值,因此出现错误

  • 不要做
    选择。。。从dual进入lv_查询
    。只需将字符串赋给变量

  • 你的功能做得不多,那你为什么还要这么做?为什么不仅仅是源代码的SQL查询

  • P1\u DIVISION\u ID
    时的查询是什么样的?此函数返回空值,因为您没有指定空值,因此出现错误

  • 不要做
    选择。。。从dual进入lv_查询
    。只需将字符串赋给变量

  • 你的功能做得不多,那你为什么还要这么做?为什么不仅仅是源代码的SQL查询


  • 我建议您使用代码创建一个函数:

    create or replace function get_my_query return VARCHAR2 
    is
    lv_query varchar2(4000);
    begin
      IF v('P1_DIVISION_ID') IS NOT NULL THEN
        return q'!select DIVISION,
           CUSTOMER_ID,
           PARTY_NAME,
           ACCOUNT_NUMBER,
           ORG_ID,
           OU_NAME,
           AGING_1_30,
           AGING_31_60,
           AGING_61_90,
           ABOVE_90,
           CURRENT_BALANCE,
           PAST_DUE,
           WEBSITE_STATUS,
           BLOCK_DATE,
           BLOCK_REASON,
           TOTAL_NUM_LOGIN,
           CP_LAST_PAY_DT,
           CP_LAST_AMT,
           CP_LAST_PAY_MODE,
           CP_AGE,
           CP_STATUS,
           CP_DATE,
           CP_DEFF,
           CP_UNBILL,
           CP_PHONE,
           CP_EMAIL,
           CP_ACCT_MGR,
           FU_ASSIGN,
           CP_LTR_SENT_DATE,
           CP_LTR_TYPE,
           CP_COMMENTS,
           COMMENTS
        from XX_CUSTOMER_AGING_V WHERE DIVISION=:P1_DIVISION_ID!';
      END IF;
    end;
    
    然后,在返回SQL查询的
    PL/SQL函数体中使用此函数:

    return get_my_query;
    

    我建议您使用代码创建一个函数:

    create or replace function get_my_query return VARCHAR2 
    is
    lv_query varchar2(4000);
    begin
      IF v('P1_DIVISION_ID') IS NOT NULL THEN
        return q'!select DIVISION,
           CUSTOMER_ID,
           PARTY_NAME,
           ACCOUNT_NUMBER,
           ORG_ID,
           OU_NAME,
           AGING_1_30,
           AGING_31_60,
           AGING_61_90,
           ABOVE_90,
           CURRENT_BALANCE,
           PAST_DUE,
           WEBSITE_STATUS,
           BLOCK_DATE,
           BLOCK_REASON,
           TOTAL_NUM_LOGIN,
           CP_LAST_PAY_DT,
           CP_LAST_AMT,
           CP_LAST_PAY_MODE,
           CP_AGE,
           CP_STATUS,
           CP_DATE,
           CP_DEFF,
           CP_UNBILL,
           CP_PHONE,
           CP_EMAIL,
           CP_ACCT_MGR,
           FU_ASSIGN,
           CP_LTR_SENT_DATE,
           CP_LTR_TYPE,
           CP_COMMENTS,
           COMMENTS
        from XX_CUSTOMER_AGING_V WHERE DIVISION=:P1_DIVISION_ID!';
      END IF;
    end;
    
    然后,在返回SQL查询的
    PL/SQL函数体中使用此函数:

    return get_my_query;
    

    +1; 该查询中没有动态内容,因此-在返回查询的函数中没有点。一个简单的
    从XX_CUSTOMER_AGING_V WHERE DIVISION=:P1_DIVISION_ID
    中选择任何内容就足够了。我有4个基于4个页面项目的差异WHERE子句,我想检查是否有任何页面项目不为空。相同的查询将返回一些不同的WHERE子句,我们在您的问题中看不到详细程度,因此,您是判断按函数查询是否合适的最佳人选。我很少使用它作为源代码,因为大多数用例都会遇到精心编制的WHERE子句。如果这是必要的,只需确保函数始终返回有效的SQL查询。并将绑定变量构建到查询字符串中-不要将它们浓缩,这会将它们转换为文本。+1;该查询中没有动态内容,因此-在返回查询的函数中没有点。一个简单的
    从XX_CUSTOMER_AGING_V WHERE DIVISION=:P1_DIVISION_ID
    中选择任何内容就足够了。我有4个基于4个页面项目的差异WHERE子句,我想检查是否有任何页面项目不为空。相同的查询将返回一些不同的WHERE子句,我们在您的问题中看不到详细程度,因此,您是判断按函数查询是否合适的最佳人选。我很少使用它作为源代码,因为大多数用例都会遇到精心编制的WHERE子句。如果有必要,只需确保函数始终返回有效的SQL查询。并将绑定变量构建到查询字符串中-不要将它们浓缩,这会将它们转换为文本。如果他真的想创建“pl/SQL函数体返回SQL查询”类型的IR,我同意将其包装到函数中是一种方法。但根据之前的谈话,我觉得他根本不需要这么做。如果他真的想创建一个“pl/sql函数体返回sql查询”类型的IR,我同意将其包装到函数中是一种可行的方法。但根据之前的谈话,我觉得他根本不需要这么做。他一次查询所有4个字段会得到更快的结果,正确处理空参数值。