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 回答