值列表 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;
我有这个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;