2016-01-27 52 views
0

我已经给出了一个任务,用于创建从表中复制数据的过程,并将复制的数据插入同一个表内并更改列数据之一。例如,我有一个带有列(ID,C1,C2 .... C20)的表格,“ID”列中的数据具有相同的值,我想在复制后更改为另一个值。 我试图用光标和记录,因为它会返回大量的数据和下面是我的程序代码:Oracle:由于立即执行命令而未实现的错误

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. 

我想了解哪一部分我的代码是错误的,但仍然无法弄清楚。我很抱歉我的英文不太好。任何人都可以给我一些提示或解决我的问题吗? 谢谢。

+0

选中此项:http://www.orafaq.com/forum/t/137567/ - 也可能是您的问题。 – Aganju

回答

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的文档:如果数据类型是集合或记录类型,则必须在包规范中声明它。

+0

嗨Wernfried, 感谢您的答复。我试图改变我的代码,但我得到了这样的错误: pls-00457 因为我使用的是日语版的dql developer,所以在翻译中我认为它会是“语句必须是sql表单”。 – nicklowkc

+0

总体代码: 创建或替换过程copy_data(tab_name varchar2,column_to_change varchar2,change_value varchar2,rowcount number) is stmt varchar2(100); stmt2 varchar2(100); 类型test_cursor是REF CURSOR; cur_cv test_cursor; v_test_rec作业%rowtype; begin stmt2:='insert into'|| tab_name || 'values:v_test_rec'; open'cur_cv'select * from'|| TAB_NAME; 循环 将cur_cv提取到v_test_rec中; 立即执行stmt2 USING v_test_rec;当cur_cv%rowcount>(rowcount - 1)时退出; end loop; close cur_cv; 结束; / – nicklowkc

+0

@nicklowkc:v_test_rec是一条记录。 USING中的表达式必须是SQL数据类型。记录是非SQL类型的。 – Nitish