【问题标题】:SYBASE execute SQLstatement in a procedureSYBASE 在一个过程中执行 SQL 语句
【发布时间】:2017-04-08 09:45:08
【问题描述】:

我正在为动态 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' 无法使用,因为它找不到。可能是它没有声明,或者它在当前不可用 上下文。”

如何解决这个问题?

谢谢

【问题讨论】:

    标签: sql cursor procedure sap-ase


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 那么,如果我想用动态表名声明游标而不使用EXEC,我该怎么做呢?
      • @TamNguyen 你一般不能,RDBMS 中的任何方法都将特定于该 RDBMS(我希望大多数不支持它)。
      • 好的。感谢您的支持!对我很有帮助
      猜你喜欢
      • 2015-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多