Oracle - create_error_log - 带 blob
这是一个小问题,我们有表:
CREATE TABLE "SCHEMA_OLD"."DOCUMENT_DATA" (
"ID" NUMBER(19,0) NOT NULL ENABLE,
"DATE_ALTERED" TIMESTAMP (6),
"USER_ALTERED" VARCHAR2(50 CHAR),
"DATE_CREATED" TIMESTAMP (6),
"USER_CREATED" VARCHAR2(50 CHAR),
"VERSION_ID" NUMBER(19,0) NOT NULL ENABLE,
"DATA" BLOB,
"IS_MIGR" NUMBER(1,0),
"MIGRT_KEY" VARCHAR2(60 CHAR)
CONSTRAINT "data_pk" PRIMARY KEY ("ID")
)
我们还实现了 oracle 错误日志记录,跳过 BLOB 列
exec dbms_errlog.create_error_log(dml_table_name => 'schema_old.document_data', skip_unsupported => true);
在另一个模式上,我们有相同的表 schema_new.document_data 在复制数据时,插入时出现重复主键错误“ORA-00001:违反唯一约束”。
begin
insert /*+ append parallel(8) */ into schema_old.document_data
(ID, DATE_ALTERED, USER_ALTERED, DATE_CREATED, USER_CREATED, VERSION_ID, DATA, IS_MIGR, MIGRT_KEY)
select /*+ parallel(8) */ ID, DATE_ALTERED, USER_ALTERED, DATE_CREATED, USER_CREATED,
VERSION_ID, DATA, IS_MIGR, MIGRT_KEY
from schema_new.document_data
log errors into schema_old.err$_document_data reject limit unlimited;
exception
when others then
schema_old.log#write('Script_document_data ERROR:' || sqlerrm);
raise;
end;
但是运行插入后表 schema_old.err$_document_data 为空
我们通过从两个表中删除“Blob”列来确保这种类型的日志记录有效,运行插入后我们在表中出现错误,但如何使其与“blob”一起工作“ 专栏存在吗?
Here is small problem, we have table:
CREATE TABLE "SCHEMA_OLD"."DOCUMENT_DATA" (
"ID" NUMBER(19,0) NOT NULL ENABLE,
"DATE_ALTERED" TIMESTAMP (6),
"USER_ALTERED" VARCHAR2(50 CHAR),
"DATE_CREATED" TIMESTAMP (6),
"USER_CREATED" VARCHAR2(50 CHAR),
"VERSION_ID" NUMBER(19,0) NOT NULL ENABLE,
"DATA" BLOB,
"IS_MIGR" NUMBER(1,0),
"MIGRT_KEY" VARCHAR2(60 CHAR)
CONSTRAINT "data_pk" PRIMARY KEY ("ID")
)
We also implemented oracle err logging, with skipping BLOB column
exec dbms_errlog.create_error_log(dml_table_name => 'schema_old.document_data', skip_unsupported => true);
On the other schema we have identical table schema_new.document_data
during copy data, we get error of duplicate primary key "ORA-00001: unique constraint violated" while inserting.
begin
insert /*+ append parallel(8) */ into schema_old.document_data
(ID, DATE_ALTERED, USER_ALTERED, DATE_CREATED, USER_CREATED, VERSION_ID, DATA, IS_MIGR, MIGRT_KEY)
select /*+ parallel(8) */ ID, DATE_ALTERED, USER_ALTERED, DATE_CREATED, USER_CREATED,
VERSION_ID, DATA, IS_MIGR, MIGRT_KEY
from schema_new.document_data
log errors into schema_old.err$_document_data reject limit unlimited;
exception
when others then
schema_old.log#write('Script_document_data ERROR:' || sqlerrm);
raise;
end;
But table schema_old.err$_document_data is empty after running insert
We made sure that this type of logging works, by removing "Blob" column from both tables, after running insert we get error in table, but how to make it work with "blob" column existing?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
您正在执行直接路径插入,这是针对唯一约束违规的 DML 错误日志记录的限制
https://docs.oracle.com/en/database/oracle/oracle-database/21/sqlrf/INSERT.html#GUID-903F8043-0254-4EE9-ACC1-CB8AC0AF3423
You are doing a direct path insert, this is a documented restriction for DML error logging for unique constraint violations
https://docs.oracle.com/en/database/oracle/oracle-database/21/sqlrf/INSERT.html#GUID-903F8043-0254-4EE9-ACC1-CB8AC0AF3423