2016-01-27 80 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