所謂動態sql,是相對靜態sql而言的,靜態sql在編譯的時候就已經知道它的全部內容了。而動態sql指令碼是在編譯的時候還不完整,直到執行過程中才能確定的sql語句。
在db2/400中實現動態sql的方式很多,但一般都採用prepare的方式來實現,下面是在sqlc中實現動態sql的例項:
exec sql begin declare section;
dcl emp char(6);
dcl prj char(6);
dcl search_prj char(6); //真正的查詢條件
dcl act binary fixed(15);
dcl tim dec fixed(5,2);
dcl select_stmt char(200) varying; //定義動態sql字串變數
exec sql end declare section;
select_stmt = .select empno, projno, actno, emptime . ||
.from emp_act . ||
.where projno = ?.; //動態查詢sql..
.exec sql prepare select_prj from :select_stmt; //定義新的sql prepare statement
exec sql declare c1 cursor for select_prj;
exec sql open c1 using :search_prj; //把search_prj的值賦給select_stmt中的『?』
exec sql fetch c1 into :emp, :prjt, :act, :tim;
if sqlstate = .02000. then //查詢到頭
call data_not_found;
else
do while (substr(sqlstate,1,2) = .00.
| substr(sqlstate,1,2) = .01.);
exec sql fetch c1 into :emp, :prj, :act, :tim; //檢索cursor的查詢內容
end;
exec sql close c1;
在store procedure中使用sql的乙個難題就是如何把傳入的變數反映到sql語句中,這裡就必須用到動態sql。
例如:create procedure qgpl/test(in file char(10),in field char(10),inout max_value integer)
language sql
begin atomic
declare stmt varchar(256);
declare not_found condition for 『02000』;
declare continue handler for not_found;
declare c1 dynamic scroll cursor for s1;
set max_value =null;
set stmt=『select '||field||' from '||file || ' order by 1';
prepare s1 from stmt;
open c1;
fetch last from c1 into :max_value;
close c1;
end利用傳入的檔名和欄位名把最大的紀錄值作為傳出引數傳出來。
前端雜燴 在工作,在思考,在沉澱
當我們沉浸在旺盛的需求之中時,整個人便會成為一台工作的機器,切著類似的頁面,寫著同樣的邏輯,重複著昨天或者上個月做的事情,時間久了,覺得膩味,沒有什麼創新,也沒有明顯的成長。用一句通俗的話來講 工作五年,後面四年重複著第一年的活兒。很多人嘗試跳出這個怪圈,不過基於環境壓力和思維受阻,最後又不得不選擇...
前端雜燴 在工作,在思考,在沉澱
當我們沉浸在旺盛的需求之中時,整個人便會成為一台工作的機器,切著類似的頁面,寫著同樣的邏輯,重複著昨天或者上個月做的事情,時間久了,覺得膩味,沒有什麼創新,也沒有明顯的成長。用一句通俗的話來講 工作五年,後面四年重複著第一年的活兒。很多人嘗試跳出這個怪圈,不過基於環境壓力和思維受阻,最後又不得不選擇...
需求在變化,思維在變化
做了這個遠端監控專案,發現開發專案其實相當具有挑戰性的,這種挑戰性主要表現在兩個方面 1 不斷變化的領導需求 或者客戶需求 2 並不熟練甚至並不了解的技術。最近看了一些 瘋狂的程式設計師 還是很羨慕絕影能在大學期間找到自己喜歡的方向,喜歡的事情,把自己喜歡的事情作為自己的工作甚至事業實際上是非常快樂...