在 Oracle 中,我想将数据从另一个数据库服务插入到数据库服务的表中,而不使用数据库链接。两个数据库服务位于同一数据库实例上。
insert into dm2m.iotCharge@BFDOCUMENTDATA(documentId, name, descr, quantity, balance_amount, total_amount)
select documentID, tariff, Description, quantity, amount, total_amount
from dm2m.fn_getIotCharges_pkg.fn_getIotCharges(100);
上面的查询dm2m.iotCharge
表是在BF_DocumentData
数据库服务中的。该软件包dm2m.fn_getIotCharges_pkg.fn_getIotCharges(100)
位于XMLDB
数据库服务上。两个数据库服务都位于同一个数据库实例上。dm2m
我们在这两个数据库服务中都有一个指定的用户。
包和包体定义如下,
create or replace PACKAGE dm2m.fn_getIotCharges_pkg
AS
TYPE tt_fn_getIotCharges_type IS TABLE OF tt_fn_getIotCharges%ROWTYPE;
FUNCTION fn_getIotCharges(v_documentID IN NUMBER) RETURN tt_fn_getIotCharges_type PIPELINED;
END;
create or replace PACKAGE BODY dm2m.fn_getIotCharges_pkg AS
FUNCTION fn_getIotCharges(v_documentId IN NUMBER) RETURN tt_fn_getIotCharges_type PIPELINED
AS
v_temp SYS_REFCURSOR;
v_temp_1 tt_fn_getIotCharges%rowtype;
BEGIN
OPEN v_temp FOR
SELECT v_documentId documentID, EVB.PROFILE_NAME AS Tariff,EVB.NAME AS Description,EVB.QUANTITY, EVB.AMOUNT,
ET.AMOUNT AS TOTAL_AMOUNT FROM
dm2m.AR_ITEMS_EVENTS_VFQ_BALANCE EVB
INNER JOIN
dm2m.AR_ITEMS_EVENTS_TOTAL ET ON ET.EVENTS_ID = EVB.EVENTS_ID;
LOOP
FETCH v_temp INTO v_temp_1;
EXIT WHEN v_temp%notfound;
PIPE ROW ( v_temp_1 );
END LOOP;
RETURN;
END fn_getIotCharges;
END fn_getIotCharges_pkg;
表 (tt_fn_getIotCharges) 具有以下几列,
当我运行上面的插入查询时,出现以下错误。
ORA-22804: 不允许对对象表或用户定义类型列进行远程操作
我在这里有一些问题,
- 为什么上面的插入查询在这里抛出错误?
- 在不使用数据库链接的情况下如何实现这一目标?
- 使用数据库链接会导致任何性能问题吗?
错误 ORA-22804 特别是由于该函数的使用而导致,该函数返回自定义数据类型。您不能使用该数据类型通过数据库链接将数据发送到未定义该数据类型的实例。
无论如何,管道功能的使用是问题的根源。
相反,为什么不使用普通视图:
然后使用相同的插入:
如果不使用数据库链接(即将数据插入同一实例中的不同模式),只需将目标表上的插入权限授予执行插入的用户:
然后使用相同的插入: