0

2つのテーブル間のデータを比較し、違いがある場合はそれを出力するPL / SQLプロシージャを作成しましたが、プロシージャへのテーブル名は動的です。手順は次のとおりです

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 Database 11gEnterpriseEditionリリース11.2.0.3.0およびPL/SQLリリース11.2.0.3.0を使用するOracleApexOnlineツールを使用しています

4

2 に答える 2

2

テストとして、最後の行に移動し、セミコロンの後に Enter キーを押します。特に Pro*C では、ファイルの末尾に行末記号がないとギャグになることがわかっています。あなたはその問題に遭遇しているかもしれません。

あなたの質問の範囲外で検討してください

SELECT columns 
FROM TABLE1

MINUS

SELECT columns
FROM TABLE2

SELECT columns
FROM TABLE2

MINUS

SELECT columns
FROM TABLE1
于 2013-02-16T13:48:20.907 に答える
0

用途: cur_tab_name.table_name. 変数CUR_TAB_NAMEのタイプはUSER_TABLE%ROWTYPEであるため、いくつかのフィールドがあります。

于 2013-02-16T14:55:52.237 に答える