如何构建动态PLSQL查询来获取记录?

时间:2015-07-14 09:43:50

标签: oracle plsql

我正在尝试在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"部分会发生什么,这些部分允许最后得到整套记录,而且我的记录有一个不适合的复杂结构固定的字段集,如表中所示。

你能告诉我正确的方法吗?

非常感谢。

1 个答案:

答案 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;

小心,关闭参考光标!