0
create or replace
PROCEDURE PROMOLOG1 AS
CURSOR rule IS SELECT * FROM business_rules; --this table had where conditions to use
TYPE r_cursor IS REF CURSOR;
ruleMatch r_cursor;
row_id VARCHAR2(20);
query_test VARCHAR2(400);

BEGIN
  FOR a IN rule LOOP
    IF a.rule_name != 'Rule1' THEN
      OPEN rulematch FOR 'SELECT rowid FROM cold_promo_log_dup P WHERE EXISTS( SELECT   1 FROM cold_promo_log_dup C WHERE ' || a.condition || ' AND rowid < P.rowid)';
      dbms_output.put_line('matching completed for ' || a.rule_name);
      LOOP
         FETCH ruleMatch INTO row_id;
         EXIT WHEN rulematch%notfound;
         query_test := 'INSERT INTO cold_promo_log_duplicate SELECT * FROM cold_promo_log_dup WHERE rowid = ''' || row_id ||'''' ;
         dbms_output.put_line(query_test);
         --EXECUTE IMMEDIATE 'INSERT INTO cold_promo_log_duplicate SELECT * FROM cold_promo_log_dup WHERE rowid = ''' || row_id || '''';
         INSERT INTO cold_promo_log_duplicate SELECT * FROM cold_promo_log_dup WHERE rowid = row_id ;
         EXECUTE IMMEDIATE 'DELETE FROM cold_promo_log_dup WHERE rowid = ' || row_id;
      END LOOP;
    END IF;
  END LOOP;
END PROMOLOG1;

oracle で上記の手順を実行すると、次のエラーがスローされます。

    Connecting to the database dedupe_preprod.
    ORA-00904: "AAALJBABVAANSZDAAA": invalid identifier
    ORA-06512: at "DEDUPE.PROMOLOG1", line 23
    ORA-06512: at line 2
    matching completed for Rule2
    INSERT INTO cold_promo_log_duplicate SELECT * FROM cold_promo_log_dup WHERE rowid =   'AAALJBABvAANsZDAAA'
    Process exited.
    Disconnecting from the database dedupe_preprod.

行 ID を印刷すると、小文字 (AAALJBABvAANsZDAAA) がほとんどありませんが、エラーにはすべての文字が大文字 (AAALJBABVAANSZDAAA) で表示されます。DBに大文字のrowidがないため、エラーの無効な識別子が表示されています。
どんな助けでも大歓迎です。

4

2 に答える 2

3

まず、row_id 変数は varchar2 ではなく ROWID 型である必要があります。

第二に、これはエラーです:

 EXECUTE IMMEDIATE 'DELETE FROM cold_promo_log_dup WHERE rowid = ' || row_id;

あなたはそれを引用しませんでした(したがって、rowidを識別子として扱いました)。しかし、なぜこれを動的 SQL で実行しているのですか?

Ps このダイナミックを離れる場合は、バインド変数を使用する必要があるため、共有プールを破棄してパフォーマンスを向上させないでください。

于 2013-01-23T18:07:21.353 に答える
0

行 ID でループを実行しないでください。行を削除して、別の場所に挿入できます。これDELETE ... RETURNING BULK COLLECT ...により、行 ID を使用する必要がなくなり、行ごとに動作する for ループを使用する代わりにセットを操作できます。

于 2013-01-23T19:34:25.497 に答える