我正在尝试在Oracle中创建一个存储过程,并使动态查询工作以获取一堆记录。我已经阅读了很多例子,但到目前为止,除非我这样做,否则我无法解决这个问题:
CREATE OR REPLACE PROCEDURE GiveMeResultSet(
v_par1 IN CHAR,
v_par2 IN CHAR,
v_par3 IN CHAR,
v_par4 IN VARCHAR2,
v_par5 IN VARCHAR2,
v_par6 IN VARCHAR2,
cur_typ OUT SYS_REFCURSOR)
IS
BEGIN
OPEN cur_typ FOR 'select * from complex_query';
--CLOSE cur_typ;
END;
我正在以这种方式执行:
var c refcursor;
execute GiveMeResultSet(null,null,null,null,null,null,:c);
print c;
这样我从查询中获取标题名称和记录,但我没有关闭获取结果的游标。如果我关闭它然后我一无所获。我想让它保持打开可能会在某些时候引起某种内存泄漏问题。
我在Oracle文档中看到类似的情况,他们会这样做:
sql_stmt := 'SELECT * FROM emp';
OPEN emp_cv FOR sql_stmt;
LOOP
FETCH emp_cv INTO emp_rec;
EXIT WHEN emp_cv%NOTFOUND;
-- process record
END LOOP;
CLOSE emp_cv;
但是我不知道代码的"process record"
部分会发生什么,这些部分允许最后得到整套记录,而且我的记录有一个不适合的复杂结构固定的字段集,如表中所示。
你能告诉我正确的方法吗?
非常感谢。
答案 0 :(得分:1)
ok CodeRoller,这是我未指定引用游标的示例代码:
返回引用游标的函数代码:
create or replace function test_ref_cursor(pi_sql_statement in varchar2) return SYS_REFCURSOR is
result_cursor SYS_REFCURSOR;
begin
open result_cursor for pi_sql_statement;
return result_cursor;
end;
现在,在下一步中,我使用此函数从v $ parameter:
获取数据declare
type t_my_cursor is ref cursor;
my_cursor t_my_cursor;
l_rec v$parameter%rowtype;
begin
my_cursor := test_ref_cursor('select * from v$parameter');
loop
fetch my_cursor into l_rec;
exit when my_cursor%notfound;
dbms_output.put_line(l_rec.name || ' = ' || l_rec.value);
end loop;
close my_cursor;
end;
小心,关闭参考光标!