1

すべてのデータを大文字で挿入する必要があります。私は Oracle データベースを使用しており、その作業を実行できるトリガーを作成しました。問題は、:NEW をオーバーライドできるかどうかわからないことです。

これは私のコードです。

CREATE OR REPLACE TRIGGER my_trigger
    BEFORE INSERT OR UPDATE ON MY_TABLE
    FOR EACH ROW
        DECLARE
          CURSOR fields IS
                SELECT COLUMN_NAME FROM user_tab_columns WHERE table_name='MY_TABLE';
           field  user_tab_columns%ROWTYPE;
    BEGIN
       FOR field IN fields LOOP
            DECLARE
                theField VARCHAR2(100) := field.COLUMN_NAME;
                newValue NVARCHAR2(1000) := :NEW."MY_FIELD";
                BEGIN
                    :NEW."MY_FIELD" := UPPER(nValor);
                END;
        END LOOP;
    END;
/

これはフィールド「MY_FIELD」で機能しますが、代わりに変数「theField」を使用する必要があります。そうすれば、テーブル内のすべてのフィールドを置き換えることができると思います。

誰かが私を助けてくれるか、別の方法を提案してくれることを願っています。

ありがとうございました。

4

1 に答える 1

2

コードを機能させる方法は、非常に非効率的です。変更された行ごとに、Oracle がテーブル内のすべての列をループする必要があると想像してください。

次のように、通常の方法でトリガーを記述します。

:NEW.FIRST_NAME = UPPER(:NEW.FIRST_NAME);
:NEW.LAST_NAME = UPPER(:NEW.LAST_NAME);

ここで、これをすべてのテーブルに書き込むという課題に直面します。そのために、コードを生成する PL/SQL コードを作成することをお勧めします。テーブル名を指定すると、コードによって CREATE TRIGGER コードが生成されます。それはこのようなものかもしれません

FOR C IN ( SELECT COLUMN_NAME AS CNAME FROM user_tab_columns WHERE table_name='MY_TABLE')
 DBMS_OUTPUT.PUT_LINE(':NEW.'||CNAME || ':=UPPER(:NEW.'||CNAME ||')' );
END LOOP;

列とテーブルが多すぎると、DBMS_OUT バッファがいっぱいになることがあります。コードを一時テーブルに挿入したいと思います。

于 2013-03-21T06:18:22.903 に答える