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

Como usar o Execute Immediate com a cláusula INTO no banco de dados Oracle

Executar imediatamente com a cláusula INTO


SQL dinâmico nativo ou NDS está ajudando os desenvolvedores fornecendo flexibilidade, melhorando o desempenho e simplificando as sintaxes de programação. Hoje, neste tutorial, vamos aprender como escrever uma consulta SQL dinâmica no banco de dados Oracle usando a instrução Execute Immediate.

Então, o que é uma declaração de execução imediata no banco de dados Oracle?


Usando Execute Immediate podemos analisar e executar qualquer instrução SQL ou um bloco PL/SQL dinamicamente no Banco de Dados Oracle. E por dinamicamente quero dizer em tempo de execução.

Execute imediato leva apenas um argumento. Pode ser uma instrução SQL ou um bloco PL/SQL. O compilador trata os argumentos da instrução Execute Immediate como a cadeia de tipos de dados VARCHAR2. Portanto, certifique-se de colocar sua consulta SQL ou bloco PL/SQL entre aspas simples ( ‘ ’ ).

Podemos usar qualquer instrução SQL com Execute Immediate?


Qualquer instrução SQL ou bloco PL/SQL que retorne uma única linha de resultados pode ser usado com Execute Immediate. Além disso, se sua instrução retornar mais de uma linha de resultados, existem outras maneiras. Além disso, discutiremos em tutoriais futuros.

Qual ​​é a sintaxe de Execute Immediate Statement?


A sintaxe da instrução Execute Immediate é bastante simples. Vamos dar uma olhada nisso.
EXECUTE IMMEDIATE dynamic_query
[INTO user_defined_variable-1, user_defined_variable-2…]
[USING bind_argument-1, bind_argument-2…]
[RETURNING|RETURN-INTO clause];  

Onde:

Executar imediatamente :Execute Immediate é uma frase reservada.

Dynamic_query :Seguido da frase reservada, temos que escrever nossa consulta dinâmica. Essa consulta pode ser uma instrução SQL ou um bloco PL/SQL. Além disso, o compilador trata a consulta dinâmica como uma string do tipo de dados VARCHAR2. Portanto, você deve certificar-se de incluir sua consulta em um par de aspas simples.

cláusula INTO :Usando a cláusula INTO, especificamos a lista de variáveis ​​definidas pelo usuário. Além disso, eles conterão os valores retornados pela instrução SELECT dinâmica. É muito semelhante à instrução SELECT-INTO. Além disso, é uma cláusula opcional, portanto, se você não precisar, poderá omiti-la.

cláusula USING :Caso você tenha usado uma variável de ligação em sua consulta dinâmica, esta cláusula permitirá que você especifique os valores para essa variável de ligação. Estes, por sua vez, serão substituídos adequadamente durante o tempo de execução. Novamente, é uma cláusula opcional.

RETORNANDO ou VOLTAR PARA Cláusula:A cláusula Return into é oposta à cláusula USING. Considerando que na cláusula using fornecemos os valores para a consulta dinâmica aqui na cláusula RETURNING INTO obtemos os valores retornados pela consulta dinâmica. E armazene-os na lista especificada de argumentos de ligação. Novamente, é uma cláusula opcional.

Você também pode assistir à explicação detalhada da sintaxe acima no vídeo correspondente aqui.

Exemplo de instrução Executar Imediato.


Fazer uma demonstração de executar imediato usando todas as cláusulas mencionadas acima aumentará a complexidade e tornará o exemplo difícil de entender. O que é exatamente o oposto do que queremos.

Assim para manter o conceito simples e fácil de aprender vamos fazer o exemplo de Execute Immediate usando a primeira cláusula que é INTO.

Execute imediatamente com cláusula INTO.

SET SERVEROUTPUT ON;
DECLARE
    sql_qry     VARCHAR2 (150);
    emp_tot     NUMBER(3);
BEGIN
    
    sql_qry:= ‘SELECT count (*) FROM employees';
    EXECUTE IMMEDIATE sql_qry INTO emp_tot;
    DBMS_OUTPUT.PUT_LINE ('Total employees are: '||emp_tot);

END;
/

Aqui está um exemplo muito simples demonstrando como usar executar imediato com INTO cláusula no banco de dados Oracle. Vamos ver o que fizemos aqui.

Seção de declaração


Na seção de declaração declaramos duas variáveis. A primeira variável é sql_qry do tipo VARCHAR 2. Usaremos esta variável para armazenar a instrução SELECT que queremos executar com nossa instrução EXECUTE IMMEDIATE. Como essa variável vai conter uma instrução DML, temos que garantir que ela tenha uma largura de dados suficiente.

A segunda é a variável definida pelo usuário emp_tot. Estaremos usando esta variável com cláusula INTO para armazenar os dados retornados por nossa instrução SELECT.

Seção de Execução


Nesta seção, temos apenas três declarações. Esses são:

Declaração 1 :


Na primeira instrução estamos atribuindo uma consulta SQL válida à variável sql_qry.

Declaração 2


A segunda instrução é a instrução EXECUTE IMMEDIATE – INTO. Nesta declaração logo após escrever a frase reservada execute imediato escrevemos o nome da variável sql_qry. A mesma variável na qual armazenamos a instrução SELECT.

Na execução, o mecanismo de tempo de execução substituirá essa variável pelo conteúdo que ela contém, que no nosso caso é uma instrução SELECT. Se não houver erro, o mecanismo de tempo de execução executará a instrução SELECT subjacente. Em seguida, retorne seu resultado, se houver.

Enquanto isso, nossa instrução SELECT retornará um valor que é o número total de linhas da tabela de funcionários. Usando a cláusula INTO da instrução EXECUTE IMMEDIATE, armazenaremos esse valor de retorno na variável emp_tot.

Declaração 3 :


A terceira instrução é uma instrução de saída usando a qual estamos exibindo o valor da variável emp_tot de volta ao usuário.

Informações:
No caso de transação DML, é necessário um commit explícito, pois o Execute Immediate não confirmará automaticamente uma transação DML.

Uma maneira alternativa de escrever esta seção de execução é:
BEGIN
    EXECUTE IMMEDIATE 'SELECT count (*) FROM employees' INTO emp_tot;
    DBMS_OUTPUT.PUT_LINE ('Total employees are: '||emp_tot); 
END;
/

Se desejar, você pode pular a primeira instrução completamente. Basta escrever a consulta SQL diretamente após a frase reservada EXECUTE IMMEDIATE.

Assista ao vídeo no meu canal do YouTube para saber qual é a maneira correta de escrever a consulta para Executar Imediato.

O que vocês acham?


Pessoalmente, gosto da maneira anterior em que usamos a variável para armazenar a consulta. E mais tarde usei essa variável com Execute Immediate. Porque isso faz com que nosso código pareça limpo e organizado. Além disso, nos ajuda a manter um controle sobre nossa consulta, caso queiramos alterá-la ou modificá-la.

O que é que vocês acham? Qual forma de escrever Execute Immediate você mais gosta? O primeiro ou o último. Conte-me suas opiniões na minha página do Facebook ou no meu Twitter.

Se você acha muito conveniente aprender assistindo a vídeos, assista ao vídeo no meu canal do YouTube. E saiba mais sobre a cláusula Execute Immediate com INTO.



Até agora neste tutorial aprendemos o que é a instrução Execute Immediate e como usar a mesma para executar uma consulta SQL dinamicamente usando a cláusula INTO no banco de dados Oracle. Acho que é o suficiente para este tutorial. Vamos mantê-lo simples, não esticando ainda mais.

Certifique-se de se inscrever no meu canal do YouTube para mais tutoriais interessantes.

Obrigado e tenha um ótimo dia!