2013-02-16 32 views
0

我已經編寫了一個PL/SQL過程,它比較兩個表之間的數據並打印差異(如果有),但扭曲是過程的表名是動態的。下面是該過程pl/sql中的ROWTYPE定義

create or replace PROCEDURE compareTables(
tabA IN VARCHAR2, tabB IN VARCHAR2) AS 
    cur_tab_name USER_TABLES%ROWTYPE; 
    lv_sql varchar2(4000); 
    lv_sql2 varchar2(4000); 
BEGIN 
--SELECT TABLE_NAME INTO cur_tab_name FROM USER_TABLES WHERE TABLE_NAME = tabA; 
lv_sql2 := 'SELECT TABLE_NAME FROM USER_TABLES WHERE TABLE_NAME = :b_tabA'; 
EXECUTE IMMEDIATE lv_sql2 INTO cur_tab_name USING tabA; 
    <<child>> 
    DECLARE 
     TYPE cursor_ref IS REF CURSOR; 
     cur_comp_result cursor_ref; 
     rec_comp_result cur_tab_name.TABLE_NAME%rowtype; 
    BEGIN 
      lv_sql := 'SELECT * FROM '||tabA||' MINUS SELECT * FROM '||tabB; 
      OPEN cur_comp_result FOR lv_sql; 
     LOOP 
      FETCH cur_comp_result INTO rec_comp_result; 
      EXIT WHEN cur_comp_result%NOTFOUND; 
      DBMS_OUTPUT.PUT_LINE(rec_comp_result.empid || '' || rec_comp_result.name); 
     END LOOP; 
      CLOSE cur_comp_result; 
    Exception 
     When others then 
       dbms_output.put_line('The Problem is '||sqlerrm); 

    END; 
END compareTables; 

現在的問題是,當我編寫這個程序,我收到以下錯誤

Error at line 14: PLS-00310: with %ROWTYPE attribute, 'CUR_TAB_NAME.TABLE_NAME' must name a table, cursor or cursor-variable 

線14:rec_comp_result cur_tab_name.TABLE_NAME%ROWTYPE;

我該如何解決它?

*注:我的系統中沒有安裝oracle。我使用Oracle Apex Online tool它採用 Oracle數據庫11g企業版發佈11.2.0.3.0和 PL/SQL版本11.2.0.3.0

+0

在你的代碼中,哪一行是31? – Plouf 2013-02-16 13:38:27

+0

程序的最後一行 – 2013-02-16 13:41:23

+0

嘗試刪除'' <>',但肯定是在開始時刪除'declare'。 – Plouf 2013-02-16 13:48:23

回答

2

作爲測試,到最後一行,和分號後,按下回車鍵。 我知道,特別是Pro * C會在文件末尾沒有行結束符的情況下發呆。 您可能會遇到該問題。

外面你的問題的範圍考慮

SELECT columns 
FROM TABLE1 

MINUS 

SELECT columns 
FROM TABLE2 

SELECT columns 
FROM TABLE2 

MINUS 

SELECT columns 
FROM TABLE1 
+0

感謝@EvilTeach,現在沒有顯示錯誤,我也刪除了<>,並在Plouf建議的開頭聲明,但是現在顯示的錯誤是 錯誤在第14行:PLS-00310:with %ROWTYPE屬性,'CUR_TAB_NAME.TABLE_NAME'必須命名錶,光標或光標變量 第14行:rec_comp_result cur_tab_name.TABLE_NAME%rowtype; 我知道,cur_tab_name.TABLE_NAME是數據類型varchar2的表名,但如果我把 rec_comp_result cur_tab_name%rowtype; 其中cur_tab_name是遊標變量,則顯示錯誤 – 2013-02-16 14:06:59

+0

錯誤在第14行:PLS-00310:具有%ROWTYPE屬性,'CUR_TAB_NAME.TABLE_NAME'必須命名錶,遊標或遊標變量 第14行:rec_comp_result cur_tab_name。 TABLE_NAME%ROWTYPE; 什麼是解決方案? 另外,感謝您的建議,但我的要求是獲得A-B。不是(A-B)U(B-A) – 2013-02-16 14:16:10

+0

我認爲,rec_comp_result沒有正確聲明,cur_tab_name不是遊標變量,但問題將如何解決? – 2013-02-16 14:28:46

0

用途:cur_tab_name.table_name。變量CUR_TAB_NAME的類型爲USER_TABLE%ROWTYPE,因此它有幾個字段。

+0

抱歉,我沒有收到您。我在第14行使用了cur_tab_name.table_name%rowtype。我應該使用什麼? – 2013-02-16 15:03:12