PB呼叫動態SQL語句

2021-08-08 19:21:58 字數 3989 閱讀 6418

轉截自 

原文解釋的比較詳細 本文只做以後用到的時候方便查詢

第一種:

這種型別的動態sql語句經常用來執行ddl或者資料庫專用的其他sql語句。語法格式是:

execute immediate sqlstatement ;

其中sqlstatement是個字串,其內容是有效的sql語句;transactionobject是事務物件名,大括號表示該子句可以省略,省略時使用sqlca。下面是個建立刪除資料表的例子:

string mysqlmysql = "drop table employee"

//mysqlmysql = 'select * from table where 1=1'

execute immediate :mysql  using sqlca;

if sqlca.sqlcode <> 0 then

messagebox('',sqlca.sqlerrtext)

end if

第二種:有引數無結果集(已知引數個數)

prepare sqlsa from :"update t_user set loginpwd = ? where username=?"    //需要引數的sql語句  

using sqlca;  

execute sqlsa using:sle_newpwd.text,:user.username;        //代入引數執行 

int emp_id_var = 56

prepare sqlsa from "delete from employee where emp_id=?" ;

execute sqlsa using :emp_id_var ;

再如:prepare sqlsa from

"insert into employee (emp_id,manager_id) value (?,?)"

execute sqlsa using :ls_empid,:sle_manager.text;

第三種:

這種型別的動態sql語句的使用頻率可能是僅次於第一種型別,它常用來處理引數個數和結果集在編譯時已知的情況,又分為游標和儲存過程兩種情況。

declare my_cursor dynamic cursor for sqlsa;

int emp_id_var

string sqlstatement,emp_state_var = "北京"

sqlstatament = "select emp_id from employee  where emp_state = ?"

prepare sqlsa from :sqlstatement;

open dynamic my_cursor using :emp_state_var;

fetch my_cursor into :emp_id_var;

close my_cursor;

該示例中省略了必要的sql語句執行狀態檢查工作,在實際編寫程式時,除declare語句外,執行了其他sql語句後,都應該檢查事務物件的sqlcode屬性,以判斷sql語句的執行是否成功。

使用這種型別的動態sql語句可以建立比較通用的向列表框或者下拉列表框中新增資料的指令碼。

////函式名稱wf_additem(dropdownlistbox fo_obj,string fs_sql)

//引數:fo_obj為下拉列表框,fs_sql為sql語句

//返回值:無

//功能:使用引數指定的sql語句向指定的下拉列表框中新增資料

string ls_item

declare item_cur dynamic cursor for sqlsa;        //定義動態游標

prepare sqlsa from :fs_sql using sqlca;

open dynamic item_cur;               //開啟動態游標

fetch item_cur into :ls_item;                  //取資料

fo_obj.setredraw(false)                //禁止下拉列表框重新整理

do while sqlca.sqlcode = 0

fo_obj.additem(ls_item)                //向下拉列表框中新增專案

fetch item_cur into :ls_item;

loop

fo_obj.setredraw(true)                 //重新整理下拉列表框

close item_cur;            //關閉動態游標

第四種

動態sql語句最複雜,功能也最強,它能夠處理程式設計時尚不知道引數和結果集的sql語句。與第三類動態sql語句相似,第四類動態sql語句也有兩種形式:一種針對游標處理,另一種則針對儲存過程而言,區別在於游標處理時使用open語句而不使用execute語句,而運用儲存過程時則使用execute語句但不使用open語句

輸出引數的型別後再用表10-6中的物件函式得到其值。下面是第四類動態sql語句的乙個應用示例,其中省略了實際程式設計中必須具備的檢查事務物件sqlcode屬性的過程(即檢查sql語句執行是否成功):

string , ls_sqlstatement

int,li_count = 0

ls_sqlstatement = "select emp_id from employee"

prepare sqlsa from : ls_sqlstatement ;

describe sqlsa into sqlda ;

declare my_cursor dynamic cursor for sqlsa ;

open dynamic my_cursor using descriptor sqlda ;

fetch my_cursor using descriptor sqlda ;

if sqlca.sqlcode = 100 then

mesasgebox("提示", "沒有找到指定的資料! ")

close my_cur;

return

end if do

li_count ++

//當fetch語句執行成功時,動態描述區sqlda中包含了結果集的

//第一行資料,反覆執行fetch語句即可得到其餘資料。

// sqlda.numoutputs中包含了輸出引數的個數。

// sqlda.outparmtype陣列中包含了各引數的資料型別,

//例如typeinteger!, 或 typestring!等

//使用choose case語句針對不同的輸出引數型別呼叫不同的物件函式

//得到相應引數的值。

choose case sqlda.outparmtype[1]   

case typestring!

stringvar = getdynamicstring(sqlda, 1)   

case typeinteger!

intvar = getdynamicnumber(sqlda, 1)

end choose

loop while li_count <> sqlda.numoutputs

close my_cursor ;

表10-6  得到第四類動態sql輸出引數的函式

函  數  名

適用的引數型別

getdynamicnumber()

typeinteger!  typedecimal! typedouble!  typelong!typereal!     typeboolean!  typeunsignedinteger!   typeunsignedlong!

getdynamicstring()

typestring!

getdynamicdate()

typedate!

getdynamictime()

typetime!

getdynamicdatetime()

typedatetime!

PB動態SQL語句執行應用

decimal c value integer li returns datetime ldt date string ls date ldt date adt date string ls sqlstring ls sqlstring select isnull colname 0 from se...

PB下的SQL語句

sql語句以 結束,可寫成多行形式而不用 1 select 注意 變數前加 如例子程式 select employee.emp id,employee.emp name,employee.emp salary,dept.dept name from employee,dept where emp n...

動態SQL語句

動態使用sql語句的幾點技巧 動態sql語句,就是sql語句中引數會變化的sql語句,一般在程式中要根據使用者的需要隨時改變其引數值,對於動態sql語句必須注意以下幾點 先呼叫close方法,關閉query元件。如果query元件已經關閉,呼叫close方法不會出錯,也沒有其它影響。再呼叫clear...