游标中使用动态的sql 语句能造成死循环 (我已经解决提出来给大家看看.不知道大家遇到没有 )
小弟在作一个系统.非的要用游标中使用动态的sql 才可以满足要求.但出现死循环 .开始不解 后来发现的用 两个事务才能解决. 我用的是一个默认的sqlca .和 SQLCA_MASTER 这就是要在连接数据库是多建立一个事务
例如 默认是 sqlca 事务
sqlca.DBMS = ProfileString (ls_startupfile, "database", "dbms", "")
sqlca.database = ProfileString (ls_startupfile, "database", "database", "")
sqlca.userid = ProfileString (ls_startupfile, "database", "userid", "")
sqlca.dbpass = ProfileString (ls_startupfile, "database", "dbpass", "")
sqlca.logid = ProfileString (ls_startupfile, "database", "logid", "")
sqlca.logpass = ProfileString (ls_startupfile, "database", "Logpass", "")
sqlca.servername = ProfileString (ls_startupfile, "database", "servername", "")
sqlca.dbparm = ProfileString (ls_startupfile, "database", "dbparm", "")
在建立一个 SQLCA_MASTER 事务
transaction sqlca_master
sqlca_master.DBMS = ProfileString (ls_startupfile, "database", "dbms", "")
.......
// 游标
declare ffx_or_kkx cursor for
select distinct fld_name, fld_chin_name,fld_pay from DICT_ALL_COLUMN
WHERE TABLE_NAME =:is_table_name and ( fld_pay='2' ) and ( fld_type ='decimal');
open ffx_or_kkx;
my_sql = "insert into grsr() values ()"
execute immediate :my_sql using sqlca ; // 换成sqlca_master 就不会死循环
do while sqlca.sqlcode = 0
fetch ffx_or_kkx into :get_fld_name,:get_fld_chin_name,:get_fld_pay;
my_sql = "insert into grsr() values ()"
execute immediate :my_sql using sqlca; //// 换成sqlca_master 就不会死循环
messagebox('',string (sqlca.sqlcode))
loop
close ffx_or_kkx;
不知道大家遇到没有 ,可以试试看 . 为什么呢 /
因为游标是 sqlca.sqlcode = 0 就循环. 而用 动态的sql 执行成功后.返回sqlca.sqlcode 是0 这样破使你的事务总是0 就是sqlca.sqlcode 总是0 . 所以是死循环 .
不知道大家明白没有 . 可以试试看