代码之家  ›  专栏  ›  技术社区  ›  Greg Reynolds

使用pro*c中的pl/sql包游标的最佳方法

  •  3
  • Greg Reynolds  · 技术社区  · 15 年前

    我在pl/sql中定义了一个光标,我想知道从pro中使用它的最佳方法是什么 C是。通常用于pro中定义的光标 你会这样做:

    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方法?

    2 回复  |  直到 11 年前
        1
  •  1
  •   REW    15 年前

    它实际上与第一个示例没有太大的不同,只需确保光标定义在包规范中,而不是包体中。不要“声明”它,只需进行如下操作:

    数据库对象:

    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调用中不需要“架构”。

        2
  •  0
  •   EvilTeach    15 年前

    对。在erm-ref光标上进行谷歌搜索,你应该看到你想做什么的例子。