值列表 PL/SQL 函数主体在 APEX 中返回 sql 查询未读取项目值

List of Values PL/SQL function body returning sql query in APEX not reading item values

我有这个PL/SQL功能

declare 
v_sql varchar2(222);
s1 real;
s2 real;
p67_price real;
p67_type_project real;
begin
p67_price:=:p67_price;
p67_type_project:=:p67_type_projet;
select :limit_1_type_project into s1 from type_project where id_type_project=p67_type_project;
select :limit_2_type_project into s2 from type_project where id_type_project=p67_type_project;
if p67_price>=s1 then
    v_sql:='select label_mode_pass, id_mode_pass from mode where id_mode_pass<4';
    return v_sql;
end if;

if p67_price<s1 and p67_price>=s2 then
    v_sql:='select label_mode_pass, id_mode_pass from mode where id_mode_pass=3 or id_mode_pass=2';
    return v_sql;
end if;

if p67_price<s2 then
    v_sql:='select label_mode_pass, id_mode_pass from mode where id_mode_pass<5';
    return v_sql;
end if;
end;

我测试过,当 :p67_price 和 :p67_type_projet 都被赋予数值时它工作正常,例如 :

p67_price:=15000000;
p67_type_project:=2;

问题是它不会工作,否则 APEX 编译器会显示此错误消息 ORA-01403: no data found。 是否无法将区域项目的数据包含在值列表中,或者是否存在我没​​有看到的其他问题?

NO DATA FOUND 表示 SELECT 语句之一没有 return 任何内容,因为没有满足 WHERE 条件的行。

如果您编写的代码适用于您提到的值 (15000000 / 2) 但不适用于其他值,那么您将不得不 以某种方式处理 它:

  • 一个选项是确保只提供有效的价格值和 type_project

  • 另一种是复习where条文;也许你编码错了

  • 最明显的是包括异常处理部分;它以 exception 关键字开头,并且...嗯, 处理 错误。例如:

    declare
      s1 ...
      s2 ...
    begin
      select ... into ... from ... where ...;     --> this is SELECT which might raise the error
    
      <do stuff if SELECT succeeds>
    
    -- this is what you need
    exception
      when no_data_found then
        -- handle it; this is just an example, you should know what to do
        s1 := 0;
        s2 := 0;
    end;
    

此外,请确保您在该代码中使用的 P67_ 项存储在 会话状态 中。一种方法是提交页面(通过按下按钮)。或者,如果它是一个值列表,您可以将这些 P67_ 项目用作级联值列表中的 parent 项目,或者提交它们的值(您会发现这两个属性在 LoV 项目的 属性 调色板中)。

如果您想知道“15000000 / 2 组合如何工作?”,可能是因为您之前确实将这些值放入会话状态,并且在您的会话期间保持如此。如果您注销并再次登录,它们的值将会丢失,并且 - 我想 - 您的代码将不再有效,至少在这些值再次进入会话状态之前不会。

我找到了解决问题的方法,而不是

p67_price:=:p67_price;

我用过

p67_price:=V('p67_price');

当然我不得不在最后添加这段代码

exception
  when no_data_found then
    v_sql:='select label_mode_pass, id_mode_pass from mode';
    return v_sql;