2

おやすみ。オラクルのEXECUTE IMMEDIATEに問題があります。他のトピックを調べましたが、役に立たなかった回答がありました。これはコードです: まず、トリガーの中に挿入する必要があるテーブル...

create global temporary table TEMP_PK (COL_NAME VARCHAR(100), COL_TYPE VARCHAR(100), ROW_VALUE VARCHAR(100)) on commit preserve rows;

さあ、私の引き金

CREATE OR REPLACE TRIGGER ICidade AFTER
  INSERT ON Cidade FOR EACH ROW DECLARE TYPE EmpCurTyp IS REF CURSOR;
  emp_cv EmpCurTyp;
  col_name_aux VARCHAR(100);
  col_type_aux VARCHAR(100);
  stm          VARCHAR(4000):='';
  BEGIN
    -- Pegando as PKS
    FOR j IN
    (SELECT d.Column_Name coluna,
        d.DATA_TYPE tipo
      FROM user_cons_columns ucc,
        user_constraints uc,
        (SELECT COLUMN_NAME,DATA_TYPE FROM ALL_TAB_COLUMNS WHERE TABLE_NAME='CIDADE'
        ) d
      WHERE uc.constraint_name=ucc.constraint_name
      AND uc.constraint_type  ='P'
      AND uc.table_name       = 'CIDADE'
      AND d.COLUMN_NAME       =ucc.Column_Name
    )
    LOOP
      stm := concat
      (
        stm, 'INSERT INTO TEMP_PK VALUES ('
      )
      ;
      stm := concat(stm, j.coluna);
      stm := concat(stm,', ');
      stm := concat(stm, j.tipo);
      stm := concat(stm,', ');
      stm := concat(stm, ':NEW.');
      stm := concat(stm,j.coluna);
      stm := concat(stm,')');

      EXECUTE IMMEDIATE stm;
      stm:='';
    END LOOP;


  END ICidade;
  /

コンパイルは良好です。問題は、テーブル「Cidade」にエントリを追加するときです。たとえば、次のように挿入しようとします。

Insert into Cidade Values (11,'Alegre','ES');

印刷機能を使用して、即時実行なしで実行すると、次の結果が得られます。

TEMP_PK 値に挿入 (CODCIDADE、NUMBER、:NEW.CODCIDADE);

EXECUTE IMMEDIATE を使用すると、次のエラーが発生します。

行から始まるエラー: コマンドの 62 - Cidade 値 (11,'Alegre','ES') に挿入 エラー レポート - SQL エラー: ORA-00936: 式がありません ORA-06512: "PAULA.ICIDADE"、行 34 ORA -04088: トリガー 'PAULA.ICIDADE' 00936 の実行中にエラーが発生しました。00000 - 「式がありません」

おそらくばかげたエラーですが、見つかりません。

誰でも私を助けることができますか?これから、よろしくお願いします。

4

2 に答える 2

1

stm実行する前にDBMS_OUTPUT.PUT_LINE を使用して出力することをお勧めします。これにより、実行しているものと、間違った SQL を生成した理由を簡単に確認できます。

まず、あなたは何もバインドしていません:NEW

于 2014-06-03T02:13:54.773 に答える