一、首先,你不能像datawindow那樣用數組名作為參數進行傳值,因為在嵌入式sql語句中不支援唯寫數組名:
比如:如果是datawindow的話你可以這樣寫:
string ls_jobids[]
dw_1.retrieve(ls_jobids)
但是,如果是嵌入式sql語句,你如下面寫法就是錯誤的,因為在PB中它不識別數組名:
string ls_jobids[]
long ll_count
select isnull(count(distinct order_id),0) into :ll_count from Order_Main where job_id in ( ls_jobids ) using sqlca;
二、如果第一種方法行不通,你可能會想到動態sql語句,如果是這樣那就對了說明你確實思考了這個問題。看到這個要求,我們首先會想到的是第三種動態sql語句,既有參數也有結果值:
//ls_strjobid是用“,”號串連好的字串
ls_sql = "select order_id from Order_Main where job_id in (?)"
declare cur_order dynamic cursor for sqlsa;
prepare sqlsa from :ls_sql;
open dynamic cur_order using :ls_strjobid;
fetch cur_order into :ll_count;
close cur_order;
但是,這樣寫雖然沒有語法錯誤,但還是得不到想要的結果,因為sql會把ls_strjobid作為一個字串看待。於是呼,你絞盡腦汁經過千思萬想,突發奇想一種寫法。但是這種寫法是否正確,你也不敢肯定,行不行試了才知道:
ls_sql = "select isnull(count(distinct order_id),0) from Order_Main where job_id in ("+ls_strjobid+")"
declare cur_order dynamic cursor for sqlsa;
prepare sqlsa from :ls_sql;
open dynamic cur_order ;
fetch cur_order into :ll_count;
close cur_order;
首先,你會發現上面的寫法,是第三種動態sql語句的寫法,但又沒有參數,這樣到底行不行呢,經過測試可行的。恭喜你成功了!
總結:
(1)數組名不能作為嵌入式sql語句的參數。
(2)串連好的字串也不能作為參數,否則為認為是一個串,而不是多個串。
(3)動態sql語句的定寫法是可以變形的