No Oracle, quero inserir dados em uma tabela em um serviço de banco de dados de outro serviço de banco de dados sem usar o link do banco de dados. Ambos os serviços de banco de dados estão na mesma instância de banco de dados.
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);
Na dm2m.iotCharge
tabela de consulta acima está no BF_DocumentData
serviço de banco de dados. E o pacote dm2m.fn_getIotCharges_pkg.fn_getIotCharges(100)
está no XMLDB
serviço de banco de dados. Ambos os serviços de banco de dados estão na mesma instância de banco de dados. Temos um usuário nomeado dm2m
em ambos os serviços de banco de dados.
a definição do pacote e do corpo do pacote é a seguinte,
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;
A tabela (tt_fn_getIotCharges) possui as colunas abaixo,
Quando executei a consulta de inserção acima, recebo o erro abaixo.
ORA-22804: operações remotas não permitidas em tabelas de objetos ou colunas de tipo definido pelo usuário
Eu tenho algumas perguntas aqui,
- Por que a consulta de inserção acima está gerando um erro aqui?
- Como posso conseguir isso sem usar o link do banco de dados?
- Usar o link do banco de dados causa algum problema de desempenho?
O erro ORA-22804 ocorre especificamente sobre o uso dessa função, que retorna um tipo de dados personalizado. Você não pode usar esse tipo de dados para enviar dados por meio de um link de banco de dados para uma instância onde esse tipo de dados não está definido.
Independentemente disso, o uso da função pipeline está na raiz do seu problema.
Em vez disso, por que não usar uma visualização normal:
Em seguida, use a mesma inserção:
Se não estiver usando um link de banco de dados (ou seja, inserindo dados em esquemas diferentes na mesma instância), apenas conceda privilégios de inserção na tabela de destino ao usuário que executa a inserção:
Em seguida, use a mesma inserção: