转截自 http://blog.csdn/lijianhe043/article/details/7171323

原文解释的比较详细 本文只做以后用到的时候方便查询

第一种:

这种类型的动态SQL语句经常用来执行DDL或者数据库专用的其他SQL语句。语法格式是:

EXECUTE IMMEDIATE SQLStatement {USING TransactionObject} ;

其中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语句