gpt4 book ai didi

database - 插入行前大写

转载 作者:搜寻专家 更新时间:2023-10-30 23:14:58 27 4
gpt4 key购买 nike

我需要以大写形式插入所有数据。我正在使用 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”。这样我认为表中的所有字段都可以被替换。

我希望有人能帮助我,或者建议我另一种方法。

谢谢。

最佳答案

您希望您的代码工作的方式显然是低效的。想象一下,对于每个修改的行,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 缓冲区可能会变满。我更愿意将代码插入到临时表中。

关于database - 插入行前大写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15537153/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com