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;

 

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