- 论坛徽章:
- 0
|
全动态的SQL 语句是指这样的语句:在写程序时并不知道SELECT语句的选择项是什么或有多少个,也不知道SQL语句中包含了多少个变量,它们是变化的。全动态SQL支持临时生成的SQL。
我急需在DB2的SQL Stored Procedure中实现全动态SQL,请高手告诉我如何实现。下面是在PB中实现全动态SQL的例子,我需要在DB2的SQL过程中实现类似的功能,我已经山穷水尽了,请高手指点!!
PB中实现的例子:
下面是一个使用动态SQL的例子,此例有一个字符串输入参数,但输出参数的类型和个数不定。
string ls_sql,ls_val
integer i,li_boolean
ls_sql="SELECT * FROM auths WHERE auths_id=?"
DECLARE c1 DYNAMIC CURSOR FOR SQLSA;
PREPARE SQLSA FROM :ls_sql;
DESCRIBE SQLSA INTO SQLDA;
//若DESCRIBE成功,则输入描述符数组将包含一个输入描述符,
//在打开游标前必须先给输入描述符赋值。
SetDynamicParm(SQLDA,1,'A00001') //这里的“1”表示第一个参数
OPEN DYNAMIC c1 USING DESCRIPTOR SQLDA;
lable:
FETCH c1 USING DESCRIPTOR SQLDA;
IF SQLCA.SQLCODE=0 THEN //若FETCH成功
FOR i=1 to SQLDA.NumOutputs
//SQLDA.NumOutputs含有输出参数的个数
CHOOSE CASE SQLDA.OutParmType
CASE TypeString!
ls_val=GetDynamicString(SQLDA,i)
CASE TypeDate!
ls_val=string(GetDynamicDate(SQLDA,i),'dd mm yyyy')
CASE TypeTime!
ls_val=string(GetDynamicTime(SQLDA,i),'hh:mm:ss')
CASE TypeDataTime!
ls_val=string(GetDynamicDateTime(SQLDA,i),&
'dd mm yyyy hh:mm:ss')
CASE TypeInteger!,TypeLong!,TypeDecimal!,TypeDouble!,TypeReal!
ls_val=string(GetDynamicNumber(SQLDA,i))
CASE TypeBoolean!
li_boolean=GetDynamicNumber(SQLDA,i)
IF li_boolean=1 THEN
ls_val="TRUE"
ELSE
ls_val="FALSE"
END IF
END CHOOSE
…… //进行相应处理
NEXT
GOTO lable //取下一条记录
ENF IF
CLOSE c1; |
|