Pergunta

Eu tenho dois esquemas: A e B (Oracle 9). No A há uma dblink para B. No B existe um pacote, que chama de A. Procedimentos no pacote B retornos podem diferentes resultados de contagem e eu acho que retornar uma coleção é uma maneira melhor por este motivo.

create type B.tr_rad as object (
  name     varchar2(64)
 ,code     number
 ,vendor   number
 ,val      varchar2(255)
 ,num      number
);

create type B.tt_rad as varray(256) of B.tr_rad;

Mas a partir de um esquema que não posso usar tipo tt_rad porque usar SQL-tipos por dblink não é suportado. DBMS_SQL não é suportado cursores. Criar tipos com o mesmo OID é impossível.

Eu acho que usar tabelas temporárias. Mas em primeiro lugar não é tão boa (após a função remota retorna o valor, chamando lado deve selecionar coleção de tabela remota). E há temores de uma desaceleração do trabalho com tabelas temporárias.

Talvez quem sabe a interação alternativa?

Foi útil?

Solução

Eu tive problemas semelhantes no passado. Então eu cheguei à conclusão de que as ligações db fundamentalmente da Oracle são "quebrados" para nada, mas tipos SQL simples (especialmente da UDT, CLOBS pode ter problemas, XMLType pode muito bem). Se você pode obter a solução OID funcionando, então boa sorte para você.

A solução que eu recorreu a era usar um procedimento armazenado Java, em vez do DB link.

Características do procedimento armazenado Java:

  1. Pode retornar um "rico conjunto de tipos", quase todos os tipos complexos (da UDT, tabelas / matrizes / varrays) veja a Oracle documentação on-line para mais detalhes. A Oracle faz um trabalho muito melhor de triagem tipos complexos (ou ricos) de java, do que de um DBLink.
  2. Armazenado Java pode adquirir a "conexão padrão" (corre na mesma sessão como a conexão SQL ao db - sem problemas de autenticação).
  3. Armazenado Java chama o PL / SQL proc no DB remoto, e a camada JDBC java faz o empacotamento do DB remoto.
  4. pacotes Java armazenado o resultado e retorna os resultados para o SQL ou camada PL / SQL.

É um pouco de trabalho, mas se você tiver um pouco de java, você deve ser capaz de "cortar e colar" uma solução em conjunto da documentação e amostra Oracle.

Espero que isso ajude.

Outras dicas

Uma interação alternativa é ter um banco de dados com esquemas A e B, em vez de duas bases de dados com um link de banco de dados.

A minha solução. No lado B i criar a tabela temporária como o registro de coleção. No A lado eu tenho um DBMS_SQL invólucro que procedimento chamadas sobre dblink. Este procedimento escreve coleta de resultados na tabela temporária. Depois de procedimento remoto conclusão bem sucedida eu selecionar os resultados de tabela remota temporária e transformá-lo para o tipo de recolha local.

Limitações 1. a necessidade de sincronização objeto permanente. procedimento 2. impossibilidade utilização A-side (que chamada de procedimento remoto) em consulta SQL. 3. a complexidade do uso.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top