【发布时间】:2016-05-12 14:57:49
【问题描述】:
我正在尝试从存储函数中打开的游标变量中获取数据,但我总是收到“提取乱序”错误消息。
这里是存储的函数:
CREATE OR REPLACE FUNCTION test_function RETURN SYS_REFCURSOR AS
p_recordset SYS_REFCURSOR;
BEGIN
OPEN p_recordset FOR SELECT '1' FROM DUAL UNION SELECT '2' FROM DUAL;
RETURN p_recordset;
END TEST_FUNCTION;
还有 Pro*C 代码:
int myfunction()
{
...
EXEC SQL BEGIN DECLARE SECTION;
SQL_CURSOR sql_cursor_pl;
VARCHAR string_field[20];
EXEC SQL END DECLARE SECTION;
EXEC SQL ALLOCATE :sql_cursor_pl;
// It is not possible to use embedded PL/SQL block as seen in other
// examples because it requieres a compilation time access to database
// that I don't have, so as far as I know I have to use EXEC SQL CALL
EXEC SQL CALL sch.test_function() INTO :sql_cursor_pl;
EXEC SQL WHENEVER NOT FOUND DO break;
//for ( ; ; )
while (sqlca.sqlcode == '\0')
{
EXEC SQL FETCH :sql_cursor_pl INTO :string_field;
...
}
EXEC SQL CLOSE :sql_cursor_pl;
...
}
如果我在下面的其他 PL 块中使用存储的函数,它可以正常工作,所以我认为问题应该出在 Pro*C 代码中。
DECLARE
mycursor sys_refcursor;
string_field VARCHAR(20)
BEGIN
mycursor := sch.test_function();
LOOP
FETCH mycursor INTO string_field;
EXIT WHEN mycursor%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(string_field);
END LOOP;
CLOSE mycursor;
END;
【问题讨论】:
标签: c++ plsql oracle-pro-c