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

w1e3prcc  于 2023-08-03  发布在  Oracle
关注(0)|答案(1)|浏览(95)

我已经给出了一个任务,创建一个从表中复制数据的过程,并将复制的数据插入同一个表中,并更改列数据之一。例如,我有一个表,其中有列(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.


我试图弄清楚我的代码的哪一部分是错误的,但仍然无法弄清楚。很抱歉我的英语不是很好。谁能给予我一些提示或解决我的问题?- 谢谢-谢谢

0yycz8jy

0yycz8jy1#

我想它一定和这个差不多。

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 LOOP; 

END copy_data;

字符串
但是,您只能在最新的Oracle 12.1版本中使用PL/SQL类型。旧版本不支持它们。
另请查看EXECUTE IMMEDIATE语句的文档:* 如果数据类型是集合或记录类型,则必须在包规范中声明。*

相关问题