PowerBuilder提供了四種格式的動態SQL語句
1. 既無輸入參數,也無結果集。
EXECUTE IMMEDIATE SQLStatement{USING TransactionObject};
TransactionObject是事務對象名,大括號表示該子句可以省略,省略時使用SQLCA。
Execute Immediate "Create Table table1( code char(6),name char(30) )" Using SQLCA;
String ls_sql
ls_sql = "INSERT INTO TABLE table1 VALUES('20010','張三')"
Execute Immediate :ls_sql Using SQLCA;
2. 有輸入參數,但沒有結果集。
PREPARE DynamicStagingArea FROM SQLStatement{USING TransactionObject};
EXECUTE DynamicstagingArea{USING Parameterlist};
其中:DynamicstagingArea是PowerBuilder提供的一種數據類型。PowerBuilder本身提供了一個名字爲SQLSA的DynamicstagingArea類型的全局變量,用於保存要執行的動態SQL語句信息。
//刪除table1表中的滿足一定條件的記錄。
String ls_code
ls_code = "20010"
Prepare SQLSA From "Delete table1 Where code=?" Using SQLCA;
Execute SQLSA Using :ls_code;
3. 編譯時已經知道參數和結果集的列。
在返回結果時由於不知道滿足過濾條件的記錄到底有多少條,因此第三種格式通常採用遊標的形式。
DECLARE cursor DYNAMIC CURSOR FOR DynamicStagingArea;
PREPARE DynamicStagingArea FROM SQLStatement{USING TransactionObject};
OPEN DYNAMIC cursor {USING Parameterlist};
FETCH cursor INTO VariableList;
CLOSE cursor;
其中cursor是用戶所定義的遊標的名字。
string ls_sql,ls_where, ls_code,ls_name
ls_sql = "SELECT code,name FROM table1 WHERE code>=?"
ls_where = "20001"
Declare cursor_base Dynamic Cursor for SQLSA;
PrePare SQLSA From :ls_sql Using SQLCA;
Open Dynamic cursor_base Using :ls_where;
Do
Fetch cursor_base INTO :ls_code,:ls_name;
Loop While SQLCA.SQLcode=0
CLOSE cursor_base;
4. 開發程序時尚不知道參數和結果集。
PREPARE DynamicStagingArea FROM SQLStatement{USING TransactionObject};
DESCRIB DynamicStagingArea INTO DynamicDescriptionObject;
DECLARE cursor DYNAMIC CURSOR FOR DynamicDescriptionObject;
OPEN DYNAMIC cursor USING DESCRIPTOR DynamicDescriptionObject;
FETCH cursor USING DESCRIPTOR DynamicDescriptionObject;
CLOSE cursor;
其中:DynamicDescriptionObject是PowerBuilder提供的一個數據類型,在PowerBuilder中提供了一個DynamicDescriptionObject類型的全局數據類型SQLDA,用來存放動態SQL語句的輸入輸出參數。通過該對象變量的四個屬性NumInputs,InParmType,NumOutputs和OutParmType能夠得到輸入參數個數、輸入參數類型、輸出參數個數和輸出參數類型的信息。其中InParmType是個數組,每個元素依次對應於SQL語句中的一個問號;OutParmType也是個數組,每個元素對應於一個輸出參數。InParmType和OutParmType的數據類型是枚舉類型ParmType。
GetDynamicNumber():TypeInteger! TypeDecimal! TypeDouble! TypeLong!TypeReal! ypeBoolean! TypeUnsignedInteger! TypeUnsignedLong!
GetDynamicString():TypeString!
GetDynamicDate():TypeDate!
GetDynamicTime():TypeTime!
GetDynamicDateTime():TypeDateTime!
Int i
String ls_sql, ls_x
Datetime ld_x
ls_sql = "SELECT * FROM table1 WHERE code like ?"
Prepare SQLSA From :ls_sql Using SQLCA;
DESCRIB SQLSA INTO SQLDA; //SQLDA中含有輸入輸出參數
DECLARE cursor_base DYNAMIC CURSOR FOR SQLSA;
SetDynamicparm(SQLDA,1,"200%") //傳遞第1個參數值
OPEN DYNAMIC cursor_base USING DESCRIPTOR SQLDA;
DO
FETCH cursor_base USING DESCRIPTOR SQLDA;
FOR i=1 TO SQLDA.NumOutPuts //輸出參數個數
CHOOSE CASE SQLDA.OutParmType[i]
CASE Typestring!
ls_x = GetDynamicString(SQLDA,i)∥處理該字符型的字段
CASE TypeDateTime!
ld_x = GetDynamicDateTime(SQLDA,i)∥處理該日期型的字段
END CHOOSE
NEXT
LOOP WHILE SALCA.SQLCODE=0
CLOSE cursor_base;
5. 調用存儲過程
DECLARE ProcedureName PROCEDURE FOR StoredProcedureName
@Param1=Value1,
@Param2=Value2,...{USING TransactionObject};
EXECUTE ProcedureName;
FETCH Cursor | Procedure INTO HostVariableList;
string ls_reture
string ls_user
date ld_date
DECLARE p1 PROCEDURE FOR procedure_name
@P_date = :ld_date,
@P_user=:ls_user USING SQLCA;
EXECUTE p1;
if SQLCA.sqlcode=0 then
FETCH p1 into :ls_reture ;
else
rollback USING SQLCA;
messagebox("系統信息","執行錯誤!")
end if
CLOSE p1;