I write this post is just to make a summary of a point met this week.
寫得不好的話,請園子裡的朋友們多提意見。
這個星期的工作遇到需要給Pakage加一個function,這個 function需要動態組織Sql ,
以實現不同的 logic.
In oracle, we know that:
EXECUTE IMMEDIATE代替了以前Oracle8i中DBMS_SQL package包.它解析並馬上執行動態SQL語句或非運行時建立的PL/SQL塊.動態建立和執行SQL語句效能超前.
使用起來也非常容易,for example:
declare
l_dept pls_integer := 20;
l_nam varchar2(20);
l_loc varchar2(20);
begin
execute immediate 'select dname, loc from dept where deptno = :1'
into l_nam, l_loc
using l_dept ;
end;
這就是一個典型的檢索並傳值的例子。
我的例子稍微有一點不同,the column name needed to be binded dynamically.
PKG_***.GET_****('service_credit_percent', 1, 2, inValExtractControlId, inEndDate)
其中, service_credit_percent 就是我想動態bind的列名,
我發現其它參數都可以,就是列名不能作為參數通過 bind 來傳遞。
向同事請教後,採取以下措施:
將列名,在拼接sql 時,直接拼接進 string:
sql_select := 'SELECT sum(' || v_service_credit_pct || ')' || ;
v_service_credit_pct 是 function用來接受列名的參數.
其它參數則可以使用bind來傳遞。