SYBASE在过程中执行SQLstatement

时间:2016-11-24 07:36:12

标签: sql cursor procedure sybase-ase

我正在为动态SQL编写程序

CREATE PROC ...
AS
DECLARE
... 
BEGIN TRANSACTION migrate_uuid
    ...
    EXEC('DECLARE u_cursor CURSOR FOR SELECT * FROM ' || @table_name) 

    OPEN u_cursor

    ...

我无法打开u_cursor。我会收到这样的信息:
"光标' u_cursor'因为无法找到所以无法使用。它可能是未声明的,也可能是当前不可用的 。上下文"

如何解决此问题?

由于

2 个答案:

答案 0 :(得分:1)

您无法在Sybase ASE中实际创建“动态定义”游标。 首先,您的示例失败的原因是游标是在EXEC内部声明的,EXEC是与外部块相比的嵌套作用域,因此在EXEC之外无法访问游标。 原则上,您可以在EXEC中包装整个游标声明和open-fetch-close(最好先将它全部放在字符串变量中),但是另一个问题将涉及如何声明(不)声明游标,这本身与EXEC无关,但无论如何都会导致它失败。

唯一的解决方法包括将光标定位在视图上但重新定义视图以指向另一个表格的技巧,但这会有各种问题和限制。

答案 1 :(得分:0)

在大多数RDBMS中,EXEC(或其等价物)运行的代码都在其自己的范围内。在EXEC执行的代码中创建的任何变量和句柄仅存在于该范围内。

您需要运行EXEC中的所有内容或不运行任何内容。你不能混搭。如果您想要对表名进行参数化,则需要执行EXEC中的所有代码。