Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/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_Plsql_Triggers_Oracle11g_Xmltype - Fatal编程技术网

Oracle 在同一行上插入后更新的触发器

Oracle 在同一行上插入后更新的触发器,oracle,plsql,triggers,oracle11g,xmltype,Oracle,Plsql,Triggers,Oracle11g,Xmltype,我有一个函数my_func,这个函数的输入是插入后同一行的一列,如何实现 我使用 create table sample_trigger_hash ( INDEXID number(19,0) , XMLCOLUMN XMLTYPE , CHECKFIELD RAW(30) ) XMLTYPE COLUMN XMLCOLUMN STORE AS BINARY XML; 我想到的是perl中DBD::Oracle的插入语句,其中只有前两个字段 以下是我的触发器 CREATE

我有一个函数
my_func
,这个函数的输入是插入后同一行的一列,如何实现

我使用

create table sample_trigger_hash ( INDEXID number(19,0) ,
     XMLCOLUMN XMLTYPE ,
     CHECKFIELD RAW(30)
) XMLTYPE COLUMN XMLCOLUMN STORE AS BINARY XML;
我想到的是perl中DBD::Oracle的插入语句,其中只有前两个字段

以下是我的触发器

CREATE OR REPLACE
TRIGGER hash_trigger
AFTER INSERT ON sample_trigger_hash
REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW
BEGIN
   SELECT my_hash(EXTRACT(:OLD.XMLCOLUMN ,''))
         INTO :NEW.CHECKFIELD
     FROM dual;
END hash_trigger;
我得到了错误

ORA-04084: cannot change NEW values for this trigger type
04084. 00000 -  "cannot change NEW values for this trigger type"
*Cause:    New trigger variables can only be changed in before row
           insert or update triggers.
*Action:   Change the trigger type or remove the variable reference.

但我的要求是在插入后获得XMLType值,如何实现这一点。如果对XMLType使用CLOB存储选项,则在存储之前和存储之后都会得到相同的散列值。但当我将其存储为二进制XML时,情况并非如此。(二进制版本中添加了XSI部分)中的更多详细信息。

您的要求没有意义。您希望在新插入的行中包含散列值,因此将函数放在插入前触发器中。

我使用的是二进制xmltype,散列值在存储前和存储后是不同的,这就是我希望在插入后使用的原因。如果插入之前对我来说足够了,我宁愿在插入时直接调用函数,而不是选择触发器。为什么不同?在插入的哪一点上它会改变?如果我对xmltype使用clob存储选项,那么在存储之前和存储之后,我会得到相同的哈希值。但当我将其存储为二进制xml时,情况并非如此;是这样的,还是您真的想要
新的
值?显示任何变量的表定义、insert语句和数据类型可能会有所帮助。例如,可能存在可以避免的隐式转换。如果
CHECKFIELD
是一个虚拟列,您是否也会遇到同样的问题?@AlexPoole我已经添加了表创建查询。如果我创建了该表,请在插入之前将触发器更改为
:NEW.CHECKFIELD:=my_hash(:NEW.XMLCOLUMN),然后插入一个值。。。然后我在插入后得到相同的散列值。无法在小提琴中显示,因为它不支持dbms_加密。您的11.2.0.1版本可能存在此问题,但很难说-能够复制它会很有用。@AlexPoole是的,我使用11.2.0.1,如果我在11.2.0.1中将存储选项指定为clob,哈希值是相同的,但当我将其存储为二进制xml时,哈希值是不同的。