Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有没有办法只在Oracle表中查找更新的列_Oracle - Fatal编程技术网

有没有办法只在Oracle表中查找更新的列

有没有办法只在Oracle表中查找更新的列,oracle,Oracle,我有一个oracle表,有将近800列和500k数据。我有一个要求,即我只需要获取记录的更新列,而不是更新记录的800列。有没有办法只提取记录中更新的列?谢谢你的帮助 谢谢, 迪亚800列有点疯狂,但我不知道。。。我想这样一张桌子可能存在 你可以从一个触发器开始。在触发器中,您可以比较“:new.col_name”和“:old.col_name”,但要写出其中的800个是很麻烦的。“如果更新(“COL_NAME”)”可以使用;但是,即使值没有更改,也会返回true。update函数是一个测试,用

我有一个oracle表,有将近800列和500k数据。我有一个要求,即我只需要获取记录的更新列,而不是更新记录的800列。有没有办法只提取记录中更新的列?谢谢你的帮助

谢谢,
迪亚800列有点疯狂,但我不知道。。。我想这样一张桌子可能存在

你可以从一个触发器开始。在触发器中,您可以比较“:new.col_name”和“:old.col_name”,但要写出其中的800个是很麻烦的。“如果更新(“COL_NAME”)”可以使用;但是,即使值没有更改,也会返回true。update函数是一个测试,用于查看列是否是update语句的一部分(它可能包含也可能不包含与旧值不同的值)

因此,要测试是否实际发生了更改,必须使用:new和:old对象并进行比较。甲骨文并没有提供一种灵活的反射方式来将它们作为一个集合进行比较,所以必须使用好的ol蛮力

你能做的就是用代码生成代码。针对所有_tab_列编写一个包含select语句的脚本,该脚本将生成每个列所需的比较语句和其他代码行,然后将输出转储到触发器中。使用dbms_output.put_行输出所需的代码

像这样写一个光标选择(这是即兴的,你必须计算出编码):


把这些都放在光标循环中。不,这段代码还不完整,也不实用,但考虑到您有限的需求描述,这是我可能使用的方法。尝试将其中一些放在一起,我可以添加更多。

表或数据字典中没有固有的内容。您必须创建自己的审计/日志机制(读:更新触发时),您需要检查历史的多久?如果一个列在“审核期”内被多次更新怎么办?此外,一个包含800列的表暗示(未经验证)其设计相当糟糕。这许多列通常是由于没有设计为3d标准格式。请定义“更新记录”的含义谢谢您的回复EdStevens。我不需要再查了。我只需要检查表上的更新。最重要的是,对于任何更新,我必须集中在800个列中的80个列上,并提取更新的列。@Diya看起来需要首先规范化表,这可能会提高性能,并更容易跟踪结果表中的更改。您是否使用任何ETL工具加载此表?大多数ETL工具都有CDC(变更数据捕获)机制,可以在您的案例中使用。非常感谢!我想试试这个。
SELECT 
  'IF (:new.'||column_name||' <> :old.'||atc.column_name||') THEN' as my_ifstmt 
FROM
  all_tab_columns atc
WHERE
  atc.owner = 'MYSCHEMA'
  AND atc.table_name = 'MY_TABLE'
dbms_output.put_line(my_cursor.my_ifstmt);
dbms_output.put_line('INSERT INTO my_audit_table... bla bla bla');
dbms_output.put_line("END IF;")