[Dica] Execute Immediate - SQL Dinâmico

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
  

Mensagemem Sex, 25 Fev 2005 2:23 pm

SQL Dinâmico - Declaração Execute Immediate
-------------------------------------------

Oque é SQL Dinâmico?
--------------------

- Muitos programas PL/SQL fazem um trabalho específico. Por exemplo uma Stored
Procedure pode aceitar um número de empregado e um aumento de salário, então,
atualizar a coluna de salário na tabela. Neste caso todo o comando UPDATE
é conhecido em tempo de compilação. Como eles não mudam de execução para execução,
são chamados de SQL Stático.
Entretanto, alguns programas podem montar e executar SQL em tempo de execução.
Por exemplo, um rlatório de propostas pode construir diferentes consultas SQL
para os vários relatórios gerados. Eles são chamaos de SQL Dinâmicos.
SQl Dinâmico são armazenados em strings construídas pelo seu programa em tempo
de execução.
Desta maneira strings podem conter o texto de um SQl válido ou de um bloco PL/SQL
podendo conter espaços reservados para os argumentos de ligação. Estes espaços são
identificadores não declarados, portanto seus nomes não importam. Por exemplo
o PL/SQL não faz distinção entre as seguintes strings:

’DELETE FROM emp WHERE sal > :meu_sal AND com < :minha_comm’
’DELETE FROM emp WHERE sal > :s AND comm < :c’

Para processar muitos SQL Dinâmicos, usa-se o EXECUTE IMMEDIATE. Entretanto
para processar consultas de múltipolas linhas usamos OPEN-FOR, FETCH e CLOSE.


UTILIZANDO O EXECUTE IMMEDIATE
------------------------------

Ele prepara e imediatamente executa um SQL dinâmico ou um bloco PL/SQl anônimo.

Sintaxe:

EXECUTE IMMEDIATE dynamic_string
[INTO {define_variable[, define_variable]... | record}]
[USING [IN | OUT | IN OUT] bind_argument
[, [IN | OUT | IN OUT] bind_argument]...]
[{RETURNING | RETURN} INTO bind_argument[, bind_argument]...];

onde dynamic_string é a string da expressão que representa o SQL ou o bloco
PL/SQL, define_variable é a variável que armazena o valor da coluna selecionada,
e record refere-se ao registro ou %ROWTYPE que armazena a linha selecionada, os
INPUT bind_arguments é a expressão que passa o valor à string de SQL ou bloco
PL/SQL.
Os OUTPUT bind_arguments é o valor que armazena o retorno do SQL ou PL/SQL.

Exceto para consultas de múltiplas linhas, a string dinâmica pode conter qualquer
declaração SQL (sem o terminador [.]) ou qualquer PL/SQL com o terminador [.].
A string pode conter espaço reservado para os argumentos de ligação. Entretanto,
você não pode usar estes argumentos para passar nomes de ojetos de schemas para
um SQL Dinâmico.

Usado apenas para consultas de linha simples, a cláusula INTO especifica que
as variáveis ou registros retornados pela consulta devem ter um tipo compatível
na cláusula INTO.

Usado apenas para comandos DML que possuem a cláusula RETURNING, o
RETURNING INTO especifica as variáveis dos valores das colunas retornadas.
Para cada valor retornado pelo comando DML, devemos ter um tipo correspondente
na cláusula RETURNING INTO.


Exemplo:

CREATE PROCEDURE delete_rows (
table_name IN VARCHAR2,
condition IN VARCHAR2 DEFAULT NULL) AS
where_clause VARCHAR2(100) := ’ WHERE ’ || condition;

BEGIN

IF condition IS NULL THEN
where_clause := NULL;
END IF;

EXECUTE IMMEDIATE ’DELETE FROM ’ || table_name || where_clause;

EXCEPTION

...


END;

[]'s galera

:-o
MuLtAnI
Localização: Videira - SC



  • Veja também
    Respostas
    ExibiÇões
    Última mensagem