【问题标题】:Best way to use PL/SQL Package Cursors from Pro*C从 Pro*C 使用 PL/SQL 包游标的最佳方式
【发布时间】:2010-06-11 14:02:03
【问题描述】:

我在 PL/SQL 中定义了一个游标,我想知道在 ProC 中使用它的最佳方式是什么。通常对于在 ProC 中定义的游标,您会这样做:

EXEC SQL DECLARE curs CURSOR FOR SELECT 1 FROM DUAL;
EXEC SQL OPEN curs;
EXEC SQL FETCH curs INTO :foo;
EXEC SQL CLOSE cusr;

我希望相同(或相似)的语法适用于打包的游标。例如,我有一个包 MyPack,带有声明

type MyType is record (X integer);
cursor MyCurs(x in integer) return MyType;

现在我在我的 Pro*C 代码中有一段相当不令人满意的嵌入式 PL/SQL,它可以打开光标、进行提取等,因为我无法让第一种语法工作。 使用示例

EXEC SQL EXECUTE
  DECLARE
    XTable is table of MyPack.MyType;
  BEGIN
    OPEN MyPack.MyCurs(:param);
    FETCH MyPack.MyCurs INTO XTable;
    CLOSE MyPack.MyCurs;
  END;
END-EXEC;

有谁知道是否有更“纯”的 Pro*C 方法?

【问题讨论】:

标签: oracle plsql oracle-pro-c


【解决方案1】:

它实际上与您的第一个示例没有太大区别,只需确保您的光标定义在包规范中而不是包体中。不要“声明”它,只需使用以下内容:

数据库对象:

create or replace package mypkg as 
  cursor mycur is 
    SELECT 1 FROM DUAL; 
end;

在 pro*c 中:

EXEC SQL OPEN schema.mypkg.mycur; 
EXEC SQL FETCH schema.mypkg.mycur INTO :foo; 
EXEC SQL CLOSE schema.mypkg.mycur; 

当然,您正在与之连接的 oracle 用户需要可以访问该包,等等。如果该包由连接的用户拥有,或者有一个同义词,“模式”。 pro*c 调用中不需要。

【讨论】:

  • 谢谢你 - 这几乎是我最终选择的选项。这是 Pro*C 的一个令人沮丧的限制!
【解决方案2】:

是的。对 REF CURSOR 一词进行谷歌搜索,您应该会看到您想要执行的操作的示例。

【讨论】:

  • 这不是我想要的——然后我需要有函数/存储过程来打开引用游标。我的游标不是参考游标,据我所知,您不能将非参考游标视为参考游标。如果不可能,那也没关系 - 嵌入式 PL/SQL 似乎工作正常。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-06
  • 2010-10-09
  • 2014-05-14
  • 1970-01-01
  • 1970-01-01
  • 2023-03-15
  • 1970-01-01
相关资源
最近更新 更多