Oracle:由于执行立即命令而导致未实现的错误

时间:2016-01-27 03:06:53

标签: oracle plsql

我已经完成了一项任务,即创建一个从表中复制数据的过程,并将复制的数据插入到同一个表中并更改其中一个列数据。例如,我有一个带有列的表(ID,C1,C2 ...... C20),“ID”列中的数据具有相同的值,我想在复制后更改为另一个值。  我尝试使用游标和记录,因为它返回了大量数据,以下是我的程序代码:

  create or replace procedure copy_data(tab_name varchar2 ,column_to_change  varchar2, change_value varchar2, rowcount number)
is
  stmt varchar2(100);
  stmt2 varchar2(100);
  type test_cursor is REF CURSOR ;
  cur_cv test_cursor;
  v_test_rec job%rowtype;
begin
  stmt := 'v_test_rec.'||column_to_change;
  stmt2 := 'insert into ' || tab_name || ' values v_test_rec ';
  open cur_cv for 'select * from ' || tab_name;
  loop
  fetch cur_cv into v_test_rec;
  stmt := change_value;    
  execute immediate (stmt2);
  exit when cur_cv%rowcount > (rowcount - 1); 
  end loop;
  close cur_cv;
end;
/

tab_name是要复制数据的表,column_to_change是我要更改其中的数据的列,change_value是我要从column_to_change更改为的值,rowcount是列的总计数。

当我编译它时,它是成功的,但是当我执行它时:

execute copy_data ('job', 'ccn_cd', 'ITUE02', 112);

我收到错误,错误如下:

ORA-03001: 
ORA-06512: "HR.COPY_DATA", 行16
ORA-06512: 行1
03001. 00000 -  "unimplemented feature"
*Cause:    This feature is not implemented.
*Action:   None.

我试图了解我的代码的哪一部分是错的,但仍然无法弄明白。对不起,我的英语不太好。谁能给我一些提示或解决方案来解决我的问题? 谢谢。

1 个答案:

答案 0 :(得分:1)

我认为它必须像这样。

CREATE OR REPLACE PACKAGE ... AS

SUBTYPE test_rec_type IS job%rowtype;
PROCEDURE copy_data(tab_name varchar2 ,column_to_change  varchar2, change_value varchar2, rowcount number);
END;

CREATE OR REPLACE PACKAGE BODY ... AS

PROCEDURE copy_data(tab_name varchar2 ,column_to_change  varchar2, change_value varchar2, rowcount number) is

  stmt varchar2(100);
  stmt2 varchar2(100);
  cur_cv SYS_REFCURSOR;
  v_test_rec test_rec_type;

  begin
      stmt2 := 'insert into ' || tab_name || ' values :v_test_rec ';
      open cur_cv for 'select * from ' || tab_name;
      loop
      fetch cur_cv into v_test_rec;
      execute immediate stmt2 USING v_test_rec;
      ...
  end copy_data;


END;

但是,您只能在最新的Oracle 12.1发行版中使用PL / SQL类型。旧版本不支持它们。

另请参阅EXECUTE IMMEDIATE Statement的文档:如果数据类型是集合或记录类型,则必须在包规范中声明它。