首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >oratcl ORA-24338:语句句柄未执行

oratcl ORA-24338:语句句柄未执行
EN

Stack Overflow用户
提问于 2012-05-21 20:13:20
回答 1查看 4.4K关注 0票数 1

使用oratcl的简单示例:

创建表和简单包

代码语言:javascript
复制
CREATE TABLE test (id INTEGER,val INTEGER);
INSERT INTO test (id,val) values (1,10);
INSERT INTO test (id,val) values (2,20);
INSERT INTO test (id,val) values (3,30);
INSERT INTO test (id,val) values (4,40);


CREATE OR REPLACE PACKAGE  tst is
  FUNCTION get_test RETURN sys_refcursor;
END; 
/

CREATE OR REPLACE  PACKAGE BODY tst is
  FUNCTION get_test  RETURN sys_refcursor
IS
   retval sys_refcursor;
BEGIN
    OPEN retval FOR SELECT * FROM test ORDER BY id;
 RETURN retval;
END;
END;
/

Tcl函数如下:

代码语言:javascript
复制
package require Oratcl

proc getLoginStr {} {
   set userName  "xxx"
   set password  "xxxx"
   set db        "xxx"
   append retval  $userName "/" $password "@" $db
}

set _lda ""
set _sqlH ""

proc init {} {
  global _lda
  global _sqlH
 set _lda [oralogon [getLoginStr]]
 set _sqlH [oraopen $_lda]
}

proc prepare {} {
  global _sqlH
  set Sql {
         begin
             :retval := tst.get_test();
         end;                   
 }

 ::db_ora::parseSql $_sqlH $Sql 
}

proc go {} {
  global _lda
  global _sqlH

  set curH [oraopen $_lda]
  set pv_lst [list :retval $curH] 

  orabind $_sqlH  :retval $curH
  oraexec $_sqlH

  set retval ""

  while {[orafetch $curH -datavariable row] == 0} {
    puts "row : $row" 
    lappend retval  $row
  }
return $retval
}

运行以下脚本一次:

代码语言:javascript
复制
source test.tcl
init
prepare
go

输出:

代码语言:javascript
复制
row : 1 10
row : 2 20
row : 3 30
row : 4 40
{1 10} {2 20} {3 30} {4 40}

重新运行go程序

代码语言:javascript
复制
go

输出:

代码语言:javascript
复制
row : 
row : 
row : 
row : 
row : 
row : 
row : 
row : 
row : 
row : 
ORA-24338: statement handle not executed

有什么想法吗?为什么脚本在重新运行时不起作用?如果我没记错的话,它应该重用打开的句柄_SqlH。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-05-21 20:27:53

我认为你不需要tcl就能看到这种行为。你可以用普通的SQL重现这段代码。一旦对tst.get_test()返回的sys_refcursor进行了迭代,就不能“倒带”并再次迭代。

有关如何使用ref_cursors (10.2) http://docs.oracle.com/cd/B19306_01/appdev.102/b14261/sqloperations.htm#i7106的信息,请参阅文档

因此,在当前的表单中,只有在再次运行prepare之后才能再次运行tcl go

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10685051

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档