Pergunta

Suponha que eu tenho alguns tipos de dados definidos no PL / SQL:

TYPE foo_t IS RECORD (...);
TYPE foo_table_t IS TABLE OF foo_t INDEX BY BINARY_INTEGER;

TYPE bar_t IS RECORD (...);
TYPE bar_table_t IS TABLE OF bar_t INDEX BY BINARY_INTEGER;

É possível para mim escrever um procedimento capaz de aceitar qualquer tipo de dados provenientes da tabela (por exemplo, quer um foo_table_t ou um bar_table_t) como um parâmetro? O procedimento não tem necessidade de conhecimento de tipos de linha da tabela. Um exemplo trivial:

PROCEDURE remove_last(some_table ...) IS
BEGIN
    some_table.DELETE(some_table.LAST);
END;
Foi útil?

Solução

Não diretamente. Do guia do programador PL / SQL:

"O parâmetro real e seu parâmetro formal correspondente deve ter tipos de dados compatíveis."

PL / SQL faz uma conversão implícita de tipos de dados de parâmetros reais para tipos de dados de parâmetros formais. Assim, você pode passar um valor numérico para um procedimento que quer uma corda, e ele iria trabalhar porque você pode fazer uma conversão implícita.

O melhor que você poderia fazer seria escrever procedimentos sobrecarregados:

PROCESSO genérico (foo IN OUT foo_t);

PROCESSO genérico (bar IN OUT bar_t);

Em seguida, você pode chamar genérico com qualquer tipo de registro. Este perde atratividade na proporção do número de tipos de registro para lidar com :-D

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