ORA-1008 如果在 ORDER BY 子句中引用了表单变量

ORA-1008 if form variable referenced in ORDER BY Clause

TLDR;有什么我可以在 Oracle Form 中设置的,可以让我将占位符绑定到 Data BlockORDER BY Clause


我正在使用 Oracle Form Builder 10.1.2.3.0 开发一个表单(因为它正在与一个不希望使用其他表单类型的系统交互)。

它有一个 Data BlockQuery Data Source Type = Table

WHERE Clause 允许用户灵活地进行搜索,生成不同兴趣的行。我希望完全匹配的行出现在不匹配的行之前。

为了实现这个规范,我写了表单的 WHERE ClauseORDER BY Clause 来反映这个 SQL*Plus 例子:

var sf varchar2(30)
exec :sf := 'X'

with mdual as (
   select case when level=1 then dummy else dummy || level end dummy
   from dual
   connect by level <= 2
)
select *
from  mdual
where :sf is null or dummy like '%' || upper(:sf) || '%'
order by case when :sf = dummy then 0 else 1 end asc, dummy;

表单变量引用不像:sf那么简单,WHERE ClauseORDER BY Clause一样复杂一点,但这种查询是有效的。当在 SQL*Plus 中执行时,它会产生我想要的结果类型。您可以反转第一个排序表达式来证明它。

当我执行表单时,我得到一个 ORA-1008,直到我注释第一个 ORDER BY 表达式。

我的结论是 Oracle Forms 在 WHERE Clause 而不是 ORDER BY Clause.

中绑定占位符引用

我可以尝试将 Query Data Source Type 设置为 Procedure 并将过程传递给过滤器字段,但是视图比过程更有用,所以我更愿意继续使用视图我已经为 Query Data Source Type.

定义了

有没有办法强制 Oracle Forms 做我认为正确的事情?

您可以使用 SET_BLOCK_PROPERTY built-in 函数使其动态化并依赖于局部或绑定变量,例如

DECLARE
  v_orderby := ' CASE WHEN '||:sf||' = ''dummy'' THEN 0 ELSE 1 END, dummy';
BEGIN
  SET_BLOCK_PROPERTY('block1',ORDER_BY, v_orderby);
  EXECUTE_QUERY;
END;

在将光标发送到此块后,可能会从 WHEN-NEW-BLOCK-INSTANCE 等触发器中调用如输入等