Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Chamando uma função armazenada (que retorna uma matriz de um tipo definido pelo usuário) no oracle em um link de banco de dados


O que você está tentando é a sintaxe correta até onde eu sei, mas em qualquer caso não funcionaria devido ao tipo de retorno ser definido pelo usuário, como você suspeita.

Aqui está um exemplo com uma função de pipeline integrada. Chamá-lo localmente funciona, é claro:
SELECT * FROM TABLE(dbms_xplan.display_cursor('a',1,'ALL'));

Devoluções:
SQL_ID: a, child number: 1 cannot be found 

Chamando-o através de um link de banco de dados:
SELECT * FROM TABLE([email protected]('a',1,'ALL'));

falha com este erro:
ORA-30626: function/procedure parameters of remote object types are not supported

Possivelmente você está recebendo o ORA-904 porque o link vai para um esquema específico que não tem acesso ao pacote. Mas de qualquer forma, isso não funcionará, mesmo se você definir um tipo idêntico com o mesmo nome em seu esquema local, porque eles ainda não são do mesmo tipo do ponto de vista da Oracle.

É claro que você pode consultar uma visualização remotamente, portanto, se houver um conjunto bem definido de parâmetros possíveis, você poderá criar uma visualização para cada combinação de parâmetros e, em seguida, consultar isso, por exemplo:
CREATE VIEW display_cursor_a_1_all AS
  SELECT * FROM TABLE(dbms_xplan.display_cursor('a',1,'ALL'))
  ;

Se o intervalo de valores de parâmetros possíveis for muito grande, você poderá criar um procedimento que crie a visualização necessária dinamicamente, de acordo com qualquer conjunto de parâmetros. Então você tem um processo de duas etapas toda vez que deseja executar a consulta:
EXECUTE  [email protected](parameters)

SELECT * FROM [email protected];

Você deve então pensar se várias sessões podem chamar isso em paralelo e, em caso afirmativo, como impedir que elas pisem umas nas outras.