使用cursor作为参数创建一个过程

时间:2016-01-29 04:01:43

标签: plsql oracle11g

我写了这段代码并且工作正常:

declare 
  cursor c_emp is 
  select last_name, first_name from employees;
  type c_list is table of employees.last_name%type index by binary_integer;
  type c_list2 is table of employees.first_name%type index by binary_integer;
  last_list c_list;
  first_list c_list2;
  counter integer := 0;
begin
  for i in c_emp loop
    counter := counter + 1;
    last_list(counter) := i.last_name;
    first_list(counter) := i.first_name;
    dbms_output.put_line('Employee(' || counter || '): ' || last_list(counter) || ' ' || first_list(counter));
  end loop;
end;
/

这次我尝试使用参数创建过程,我可以将表名和列插入游标。我试过这个:

create or replace procedure show_data(tab_name in varchar2, data_list in varchar2)
is 
  str varchar2(100);
  str2 varchar2(100);
  column_name varchar2(100);
begin
  str := 'select ' || data_list || ' from ' || tab_name;
  for vRec in str loop
    dbms_output.put_line(str);
  end loop;
end;
/

它给出了一个错误,其中str不是游标。我不确定如果光标可以这种方式完成,但是从错误看它似乎不能。

我的代码中哪一部分错了,或者因为我没有声明我的光标?但是,如果我声明我的光标,我不能通过使用动态sql方式获取参数。

1 个答案:

答案 0 :(得分:0)

下面应该产生与原始PL / SQL块相同的结果。请注意,table_name可以是动态的,data_list也可以是动态的,但您需要知道data_list中的列名才能从光标中fetch,然后打印它们。

create or replace procedure show_data(tab_name in varchar2
                                , data_list in varchar2)
is 
  str varchar2(100);
  str2 varchar2(100);
  column_name varchar2(100);
  TYPE cursor_ref IS REF CURSOR;
  vRec_cursor cursor_ref;
  counter integer = 0;
  last_name employee.last_name%TYPE;
  first_name employee.first_name%TYPE;
begin
  str := 'select ' || data_list || ' from ' || tab_name;
  open vRec_cursor for str;
  loop
    FETCH vRec_cursor INTO last_name, first_name;
    EXIT WHEN vRec_cursor%NOTFOUND;
    dbms_output.put_line('Employee(' || counter || '): ' || last_name || ' ' || first_name;
    counter = counter + 1;
  end loop;
end;
/

注意:尚未运行上述代码