ORA-1008 如果在 ORDER BY 子句中引用了表单变量
ORA-1008 if form variable referenced in ORDER BY Clause
TLDR;有什么我可以在 Oracle Form 中设置的,可以让我将占位符绑定到 Data Block
的 ORDER BY Clause
?
我正在使用 Oracle Form Builder 10.1.2.3.0 开发一个表单(因为它正在与一个不希望使用其他表单类型的系统交互)。
它有一个 Data Block
和 Query Data Source Type
= Table
。
其 WHERE Clause
允许用户灵活地进行搜索,生成不同兴趣的行。我希望完全匹配的行出现在不匹配的行之前。
为了实现这个规范,我写了表单的 WHERE Clause
和 ORDER 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 Clause
和ORDER 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
等触发器中调用如输入等
TLDR;有什么我可以在 Oracle Form 中设置的,可以让我将占位符绑定到 Data Block
的 ORDER BY Clause
?
我正在使用 Oracle Form Builder 10.1.2.3.0 开发一个表单(因为它正在与一个不希望使用其他表单类型的系统交互)。
它有一个 Data Block
和 Query Data Source Type
= Table
。
其 WHERE Clause
允许用户灵活地进行搜索,生成不同兴趣的行。我希望完全匹配的行出现在不匹配的行之前。
为了实现这个规范,我写了表单的 WHERE Clause
和 ORDER 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 Clause
和ORDER 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
等触发器中调用如输入等