2010-06-11 26 views
3

我在PL/SQL中定义了一个游标,我想知道从Pro C中使用它的最佳方式是什么。通常在临 C中定义游标你会做:从Pro * C使用PL/SQL包游标的最佳方法C

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

+0

该标签应该是pro-c吗?否则它与“/ proc”“重叠”;我见过'pro-c'作为标签,但似乎我强制使用它 – ShinTakezou 2010-07-20 10:54:20

+0

@ShinTakezou:Fixed per http://meta.stackexchange.com/questions/107791/how-should-the-proc-tag-被拆分 – 2011-10-23 22:11:23

回答

1

它实际上不会比你的第一个例子有太大的不同,只要确保你的游标定义在package spec而不是package body中。不要 “声明”,并只是像去:

数据库对象:

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调用中不需要。

+0

谢谢你 - 这几乎是我最终选择的选项。这是一个令人沮丧的Pro * C限制! – 2010-07-03 15:30:49

0

是的。对REF CURSOR这个术语进行谷歌搜索,你应该看到你想要做的事情的例子。

+0

这并不完全是我之后 - 然后我需要有功能/存储过程来打开参考游标。我的游标不是一个游标,据我所知,你不能将一个非游标作为游标。如果不可能,那就没问题 - 嵌入式PL/SQL似乎工作正常。 – 2010-06-14 11:26:13