TLDR;有什么我可以在 Oracle 表單中設定的東西,可以讓我將占位符系結到Data Block'sORDER BY Clause嗎?
我正在使用 Oracle Form Builder 10.1.2.3.0 開發一個表單(因為它與使其他表單型別不受歡迎的系統互動)。
它有一個Data Blockwith 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;
表單變數參考并不像:sfthe 那樣簡單,而且WHERE Clause有點復雜,ORDER BY Clause但是這種型別的查詢是有效的。在 SQL*Plus 中執行時,它會產生我想要的結果型別。您可以反轉第一個排序運算式來證明它。
當我執行表單時,我得到一個 ORA-1008,直到我評論第一個ORDER BY運算式。
我的結論是 Oracle Forms 將占位符參考系結在 aWHERE Clause而不是ORDER BY Clause.
我可以嘗試設定Query Data Source TypetoProcedure并將程序傳遞給過濾器欄位,但視圖比程序更實用,因此我更愿意繼續使用我為Query Data Source Type.
有沒有辦法強制 Oracle Forms 做我認為正確的事情?
uj5u.com熱心網友回復:
您可以使用SET_BLOCK_PROPERTY內置函式以使其動態化并取決于區域或系結變數,例如
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在通過使用其他操作(例如單擊按鈕或按下回車鍵等)將游標發送到此塊之后。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/466329.html
