PB執行動態SQL語句

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;

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章