我不是程序员,但是有一个任务是自动将表中的一个字段复制到同一个表中的另一个字段(这是一个很长的故事...... :-))。这应该在更新和插入时完成,我真的不知道如何去做。 我应该指出,数据是通过我们没有源代码的用户界面输入到数据库的,因此我们希望在数据库级别上使用触发器或类似物进行此更改。 我已经尝试创建一个简单的触发器来复制值,但是会出现一条错误消息。在谷歌搜索错误后,我发现我需要创建一个将用作变量的包。现在我真丢了!!!! : - )
我还想指出,我需要一个从现在开始自动更新此字段的解决方案,但不会覆盖列中已存在的任何数据。
有人能告诉我完成整个程序的最简单最简单的方法吗?我真的需要一个“傻瓜指南”的方法。
谢谢, 大卫
答案 0 :(得分:1)
如果两个字段都在同一个表中,那么简单的触发器就足够了。
考虑:
SQL> CREATE TABLE t (ID NUMBER, source_col VARCHAR2(10), dest_col VARCHAR2(10));
Table created
SQL> CREATE OR REPLACE TRIGGER trg_t
2 BEFORE INSERT OR UPDATE OF source_col ON t
3 FOR EACH ROW
4 BEGIN
5 IF :old.dest_col IS NULL THEN
6 :NEW.dest_col := :NEW.source_col;
7 END IF;
8 END;
9 /
Trigger created
我们检查触发器是否适用于插入然后更新(我们插入的值将被保留):
SQL> INSERT INTO t(ID, source_col) VALUES (1, 'a');
1 row inserted
SQL> SELECT * FROM t;
ID SOURCE_COL DEST_COL
---------- ---------- ----------
1 a a
SQL> UPDATE t SET source_col = 'b';
1 row updated
SQL> SELECT * FROM t;
ID SOURCE_COL DEST_COL
---------- ---------- ----------
1 b a
编辑:我更新了触发器,以考虑到要保留dest_col上现有数据的要求。
答案 1 :(得分:0)
如果您只需要新列来显示与我认为的旧列完全相同的数据(如果您使用的是Oracle 11g),则可以创建虚拟列。
有一个例子here。