ORA-22992 在远程 table 问题中删除对 LOB 的引用
ORA-22992 Remove references to LOB in remote table issue
我正在尝试使用多个 select CAPTURED_DATA_01 插入 table statement.I 我能够插入值 EVENT_ID,ENV_ID ,BRAND_ID,BP_ID 但现在我还想插入 SUBSCRIPTION_ID 值,我将通过在远程 table 中使用 select 语句获得该值。我测试过的查询运行良好,可以获取 SUBSCRIPTION_ID。但是,当我尝试使用此 select 语句将 SUBSCRIPTION_ID 的值插入到我的插入查询中时,我收到错误消息,其中我对 SUBSCRIPTION_ID 内部使用了强制转换函数我的子查询为
SQL Error: ORA-22992: cannot use LOB locators selected from remote tables
22992. 00000 - "cannot use LOB locators selected from remote tables"
*Cause: A remote LOB column cannot be referenced.
*Action: Remove references to LOBs in remote tables
这是我的查询:
Insert into CAPTURED_DATA_01(SUBSCRIPTION_ID)
select WF.SUBSCRIPTION_ID
from
(select WF.SUBSCRIPTION_ID from WF_WORKFLOW@FONIC_RETAIL WF,CAPTURED_DATA_01 CP
where WF.SUBSCRIPTION_ID > CP.SUBSCRIPTION_ID and
WF.SUBSCRIPTION_ID IN
(
select iw.SUBSCRIPTION_ID
from (
SELECT TO_NUMBER(REPLACE(REPLACE(REGEXP_SUBSTR(RESPONSE_XML, '<ax2147:subscriptions xsi:type="ax2127:SubscriptionDTO"><ax2130:id>\d+</ax2130:id>'),
'<ax2147:subscriptions xsi:type="ax2127:SubscriptionDTO"><ax2130:id>', ''), '</ax2130:id>', ''))
AS SUBSCRIPTION_ID ,
CAST(REPLACE(REPLACE(
REGEXP_SUBSTR(REQUEST_XML, '<ns7:orderType>.+</ns7:orderType>'),
'<ns7:orderType>', ''), '</ns7:orderType>', '')
AS VARCHAR(100)) AS order_type,
TO_NUMBER(REPLACE(REPLACE(REGEXP_SUBSTR(RESPONSE_XML, '<ax2147:orderNumber>\d+</ax2147:orderNumber> '),
'<ax2147:orderNumber>', ''), '</ax2147:orderNumber> ', ''))
AS ORDER_NUMBER,
CREATE_DATE
FROM
SOAP_MONITORING@FONIC_RETAIL
where WEB_SERVICE_NAME='RatorWebShopService' and WEB_METHOD_NAME='placeShopOrder'
) iw
where iw.order_type='SELF_REGISTRATION'
)and WF.NAME='INITIATE_MANDATE'
and WF.STATUS_ID=0)
据我了解,问题是 insert
在本地数据库上总是 运行。
当您 运行 时 select
Oracle 可以自行决定(或被提示)在远程数据库上完成一些工作;在这种情况下,它将 CLOB 值转换为数字和 varchar2 类型,只有那些非 LOB 值必须通过网络传输到本地数据库以进行进一步处理。
对于插入,它将尝试检索整个 LOB 以在本地对其进行转换,并阻止这种情况发生 - 可能是由于涉及的潜在数据量。插入的 driving_site
提示被忽略,因此您不能像 select.
那样调整该行为
要解决此问题,您可以执行 select 并分两步插入,通过 PL/SQL 块中的光标。一般模式为:
declare
type cp_tab_type is table of CAPTURED_DATA_01%ROWTYPE;
cp_tab cp_tab_type;
cur sys_refcursor;
begin
open cur for
select ... -- some value for every column in the table you're inserting
-- into, in the same order they appear in the DDL
loop
fetch cur bulk collect into cp_tab;
exit when cp_tab.count = 0;
forall i in 1..cp_tab.count
insert into CAPTURED_DATA_01 values cp_tab(i);
end loop;
end;
/
Read more关于批量收集和forall to do batch query/inserts。
如果您有可以用于 on
子句的内容,您也可以按照您的建议使用 merge
;例如,如果 event-id
根本不存在:
merge into CAPTURED_DATA_01 cp
using (
select ..
) data
on (cp.event_id = data.event_id)
when not matched then
insert (EVENT_ID,SUBSCRIPTION_ID,EVENT_TIMESTAMP,ENV_ID,BRAND_ID,BP_ID)
values (data.event_id, data.subscription_id, data.start_date,
data.env_id, data.brand_id, data.bp_id);
您 post 每个问题都会使您的查询变得更加复杂,并且可能会简化很多。
我正在尝试使用多个 select CAPTURED_DATA_01 插入 table statement.I 我能够插入值 EVENT_ID,ENV_ID ,BRAND_ID,BP_ID 但现在我还想插入 SUBSCRIPTION_ID 值,我将通过在远程 table 中使用 select 语句获得该值。我测试过的查询运行良好,可以获取 SUBSCRIPTION_ID。但是,当我尝试使用此 select 语句将 SUBSCRIPTION_ID 的值插入到我的插入查询中时,我收到错误消息,其中我对 SUBSCRIPTION_ID 内部使用了强制转换函数我的子查询为
SQL Error: ORA-22992: cannot use LOB locators selected from remote tables
22992. 00000 - "cannot use LOB locators selected from remote tables"
*Cause: A remote LOB column cannot be referenced.
*Action: Remove references to LOBs in remote tables
这是我的查询:
Insert into CAPTURED_DATA_01(SUBSCRIPTION_ID)
select WF.SUBSCRIPTION_ID
from
(select WF.SUBSCRIPTION_ID from WF_WORKFLOW@FONIC_RETAIL WF,CAPTURED_DATA_01 CP
where WF.SUBSCRIPTION_ID > CP.SUBSCRIPTION_ID and
WF.SUBSCRIPTION_ID IN
(
select iw.SUBSCRIPTION_ID
from (
SELECT TO_NUMBER(REPLACE(REPLACE(REGEXP_SUBSTR(RESPONSE_XML, '<ax2147:subscriptions xsi:type="ax2127:SubscriptionDTO"><ax2130:id>\d+</ax2130:id>'),
'<ax2147:subscriptions xsi:type="ax2127:SubscriptionDTO"><ax2130:id>', ''), '</ax2130:id>', ''))
AS SUBSCRIPTION_ID ,
CAST(REPLACE(REPLACE(
REGEXP_SUBSTR(REQUEST_XML, '<ns7:orderType>.+</ns7:orderType>'),
'<ns7:orderType>', ''), '</ns7:orderType>', '')
AS VARCHAR(100)) AS order_type,
TO_NUMBER(REPLACE(REPLACE(REGEXP_SUBSTR(RESPONSE_XML, '<ax2147:orderNumber>\d+</ax2147:orderNumber> '),
'<ax2147:orderNumber>', ''), '</ax2147:orderNumber> ', ''))
AS ORDER_NUMBER,
CREATE_DATE
FROM
SOAP_MONITORING@FONIC_RETAIL
where WEB_SERVICE_NAME='RatorWebShopService' and WEB_METHOD_NAME='placeShopOrder'
) iw
where iw.order_type='SELF_REGISTRATION'
)and WF.NAME='INITIATE_MANDATE'
and WF.STATUS_ID=0)
据我了解,问题是 insert
在本地数据库上总是 运行。
当您 运行 时 select
Oracle 可以自行决定(或被提示)在远程数据库上完成一些工作;在这种情况下,它将 CLOB 值转换为数字和 varchar2 类型,只有那些非 LOB 值必须通过网络传输到本地数据库以进行进一步处理。
对于插入,它将尝试检索整个 LOB 以在本地对其进行转换,并阻止这种情况发生 - 可能是由于涉及的潜在数据量。插入的 driving_site
提示被忽略,因此您不能像 select.
要解决此问题,您可以执行 select 并分两步插入,通过 PL/SQL 块中的光标。一般模式为:
declare
type cp_tab_type is table of CAPTURED_DATA_01%ROWTYPE;
cp_tab cp_tab_type;
cur sys_refcursor;
begin
open cur for
select ... -- some value for every column in the table you're inserting
-- into, in the same order they appear in the DDL
loop
fetch cur bulk collect into cp_tab;
exit when cp_tab.count = 0;
forall i in 1..cp_tab.count
insert into CAPTURED_DATA_01 values cp_tab(i);
end loop;
end;
/
Read more关于批量收集和forall to do batch query/inserts。
如果您有可以用于 on
子句的内容,您也可以按照您的建议使用 merge
;例如,如果 event-id
根本不存在:
merge into CAPTURED_DATA_01 cp
using (
select ..
) data
on (cp.event_id = data.event_id)
when not matched then
insert (EVENT_ID,SUBSCRIPTION_ID,EVENT_TIMESTAMP,ENV_ID,BRAND_ID,BP_ID)
values (data.event_id, data.subscription_id, data.start_date,
data.env_id, data.brand_id, data.bp_id);
您 post 每个问题都会使您的查询变得更加复杂,并且可能会简化很多。