我们尝试在删除/更新之前使用触发器将表的当前行复制到镜像表。以下是工作查询
BEFORE UPDATE OR DELETE
ON CurrentTable FOR EACH ROW
BEGIN
INSERT INTO MirrorTable
( EMPFIRSTNAME,
EMPLASTNAME,
CELLNO,
SALARY
)
VALUES
( :old.EMPFIRSTNAME,
:old.EMPLASTNAME,
:old.CELLNO,
:old.SALARY
);
END;
但问题是我们在当前表中有超过50个coulmns,并且不想提及所有这些列名。有没有办法选择像所有的coulmns :老*
SELECT * INTO MirrorTable FROM CurrentTable
任何建议都会有所帮助。
谢谢,
答案 0 :(得分:2)
实际上,没有。您需要列出所有列。
DBA_TAB_COLUMNS
中提取列名称。但是,与简单地键入50个列名称相比,这将要大得多。:new
将是该对象的一个实例,因此您可以插入该对象。但是拥有一个对象表是相当罕见的。答案 1 :(得分:1)
如果您的“当前”和“镜像”表格具有完全相同的结构,您可以使用类似
的内容INSERT INTO MirrorTable
SELECT *
FROM CurrentTable
WHERE CurrentTable.primary_key_column = :old.primary_key_column
老实说,我认为这是一个糟糕的选择,不会这样做,但它是一个或多或少的自由世界,你可以自由(或多或少:-)做出自己的选择。
分享并享受。
答案 2 :(得分:0)
为了它的价值,我一直在编写相同的东西并用它来生成代码:
SQL>设置pagesize 0
SQL>选择':old。'|| COLUMN_NAME ||','来自all_tab_columns,其中table_name ='BIGTABLE'和owner ='BOB';
:old.COL1,
:old.COL2,
:old.COL3,
:old.COL4,
:old.COL5,
...
如果您提供所有列,则无需提及它们两次(并且您可以对空列使用NULL):
INSERT INTO bigtable VALUES(
:old.COL1,
:old.COL2,
:old.COL3,
:old.COL4,
:old.COL5,
NULL,
NULL);