Utilizando NOCOPY no Oracle
[ad#texto]
Já comentei sobre o modo como o PL/SQL lida com os parâmetros enviados, ele simplesmente movimenta todo o conteúdo ao invés de apenas acessar a instancia daquele objeto (parâmetro) em memória, em consequência temos uma gradativa perda de performance quando passamos parâmetros maiores como um CLOB ou até mesmo uma PL Table.
Uma das soluções que apresentei foi definir a variável de forma global, assim tanto o objeto chamador como o objeto chamado teriam acesso a variável sem a necessidade que o conteúdo da mesmo transitasse como parâmetro, mas e se por questões técnicas não pudéssemos trabalhar desta forma?
Teríamos então que utilizar a cláusula NOCOPY na definição dos parâmetros, isso iria instruir ao PL/SQL para não movimentar todo o conteúdo do parâmetro, o mesmo seria somente “pontuado”, veja um exemplo:
Movimentando todo o conteúdo:
PROCEDURE pc_teste(varNome IN VARCHAR2) IS
...
Apenas apontoando para o parâmetro:
PROCEDURE pc_teste(varNome IN OUT NOCOPY VARCHAR2) IS
...
Porém é preciso tomar cuidado com alguns detalhes:
- É obrigatório o uso de parâmetros no formato IN OUT, somente IN ou somente OUT irá reportar erros de compilação;
- Parâmetros com NOCOPY não podem ser debugados o que pode dificultar no momento de detectar possíveis bugs na sua aplicação.