hur.cn - 华软网

 热门搜索

用第二种格式的动态SQL语句创建的游标,如何关闭?

  作者:未知    来源:网络    更新时间:2018/4/16
如下方式应用的游标,如何关闭?

prepare sqlsa from "delete from pdc_order_excute where orderid=?" using ta_librarian_writer;

execute sqlsa using :s_orderid;
------华软网友回答------
您这……叫游标么
------华软网友回复------
這個只是動態sql語句,不需要關閉!
------华软网友回复------
再认真看一遍四种动态SQL
------华软网友回复------
动态SQL四种类型的语句格式

1.Dynamic SQL Format 1

EXECUTE IMMEDIATE SQLStatement     {USING TransactionObject} ;

eg:
string            Mysql
Mysql = "CREATE TABLE Employee "&
    +"(emp_id integer not null,"&
    +"dept_id integer not null, "&
    +"emp_fname char(10) not null, "&
    +"emp_lname char(20) not null)"
EXECUTE IMMEDIATE :Mysql ;

2.Dynamic SQL Format 2

PREPARE DynamicStagingArea FROM SQLStatement     {USING TransactionObject} ;
EXECUTE DynamicStagingArea USING {ParameterList} ;

eg:
INT        Emp_id_var = 56
PREPARE SQLSA 
    FROM "DELETE FROM employee WHERE emp_id=?" ;
EXECUTE SQLSA USING :Emp_id_var ;


3.Dynamic SQL Format 3

DECLARE Cursor | Procedure     DYNAMIC CURSOR | PROCEDURE      FOR DynamicStagingArea ;
PREPARE DynamicStagingArea FROM SQLStatement     {USING TransactionObject} ;
OPEN DYNAMIC Cursor     {USING ParameterList} ;
EXECUTE DYNAMIC Procedure    {USING ParameterList} ;
FETCH Cursor | Procedure     INTO HostVariableList ;
CLOSE Cursor | Procedure ;
eg:
integer Emp_id_var

DECLARE my_cursor DYNAMIC CURSOR FOR SQLSA ;
PREPARE SQLSA FROM "SELECT emp_id FROM employee" ;
OPEN DYNAMIC my_cursor ;
FETCH my_cursor INTO :Emp_id_var ;
CLOSE my_cursor ;


4.Dynamic SQL Format 4

DECLARE Cursor | Procedure     DYNAMIC CURSOR | PROCEDURE      FOR DynamicStagingArea ;
PREPARE DynamicStagingArea FROM SQLStatement    {USING TransactionObject} ;
DESCRIBE DynamicStagingArea    INTO DynamicDescriptionArea ;
OPEN DYNAMIC Cursor | Procedure    USING DESCRIPTOR DynamicDescriptionArea ;
EXECUTE DYNAMIC Cursor | Procedure    USING DESCRIPTOR DynamicDescriptionArea ;
FETCH Cursor | Procedure     USING DESCRIPTOR DynamicDescriptionArea ;
CLOSE Cursor | Procedure ;

eg:

string Stringvar, Sqlstatement
integer Intvar
Sqlstatement = "SELECT emp_id FROM employee"
PREPARE SQLSA FROM :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 the FETCH is successful, the output 
// descriptor array will contain returned 
// values from the first row of the result set.
// SQLDA.NumOutputs contains the number of 
// output descriptors.
// The SQLDA.OutParmType array will contain 
// NumOutput entries and each entry will contain
// an value of the enumerated data type ParmType
// (such as TypeInteger!, or TypeString!).

CHOOSE CASE SQLDA.OutParmType[1]
CASE TypeString!
        Stringvar = GetDynamicString(SQLDA, 1)
    CASE TypeInteger!
        Intvar = GetDynamicNumber(SQLDA, 1)

END CHOOSE
CLOSE my_cursor ;

------华软网友回复------
同上,第二种格式不需要关闭,只有用到DECLARE语句的地方才需要对应CLOSE,否则不需要,直接执行即可,最多根据需要加上COMMIT; ROLLBACK;

DECLARE的情况如:

DECLARE Cursor | Procedure  DYNAMIC CURSOR | PROCEDURE  FOR DynamicStagingArea ;

CLOSE Cursor | Procedure ;
------华软网友回复------
感谢各位回答!

我在用了上述语句后,保持界面不关闭。然后再在其他界面对相同表进行操作时,总是阻塞。

而一旦关闭上述语句所在界面后,再在其他界面对相同表进行操作时,一切正常。

我以为是没有将事务关闭的原因。到底是什么原因呢?

多谢各位回答,问题解决后,马上结贴。
------华软网友回复------
再執行commit,試一試
------华软网友回复------
刚才分情况加了commit和rollback语句,在测试,可能原因在这里。      
华软声明:本内容来自网络,如有侵犯您版权请来信指出,本站立即删除。