Você está na página 1de 13

Oracle Database 11g: PL/SQL

SQL Dinâmico
Objetivos
 Descrever o fluxo de execução de instruções SQL;

 Construir e executar instruções SQL dinâmicas usando SQL


Nativo Dinâmico (NDS).
Fluxo de execução do SQL
 Toda instrução SQL segue um ou mais dos seguintes passos:
 Parse;
 Bind;
 Execute;
 Fetch.

 Alguns passos podem não ser relevantes para as instruções:


 A fase de busca é aplicável para as queries;
 Instruções SQL como SELECT, DML, MERGE, COMMIT,
SAVEPOINT e ROLLBACK, o parse e bind são fases executadas
em tempo de compilação;
 Para SQL dinâmico, todas as fase são executadas em tempo de
execução.
Trabalhando com SQL dinâmico
 Use SQL dinâmico para criar uma instrução SQL, cuja estrutura
pode mudar durante o tempo de execução:
 É construída e armazenada como string de caracteres, string de
variáveis ou string de aplicação;
 É uma instrução com variação de coluna de dados ou
diferentes condições com ou sem variáveis de bind;
 Executar DDL, DCL ou instrução de controle de sessão para ser
escrita e executadas a partir do PL/SQL;
 É executada com instrução Native Dynamic SQL ou pacote
DBMS_SQL.
Usando SQL dinâmico
 Use SQL dinâmico quando o texto completo do SQL dinâmico é
desconhecido até o tempo de execução. Contudo a sintaxe é
verificado em tempo de execução ao invés de em tempo de
compilação.
 Use SQL dinâmico quando um dos seguintes itens são
desconhecidos:
 Texto da instrução SQL semelhante a comandos e cláusulas;
 O número e tipo de dados das variáveis de host;
 Referenciar objetos do banco de dados semelhantes a tabelas,
colunas, índices, sequences, nome de usuário e views.
 Use SQL dinâmico para fazer seu PL/SQL dinâmico mais geral e
flexível.
SQL Dinâmico Nativo (NDS)
 Prover suporte nativo para SQL dinâmico direto na linguagem
PL/SQL;

 Prover a habilidade para executar instruções SQL com estruturas


desconhecidas até o tempo de execução;

 Se o SQL dinâmico é uma instrução SELECT que retorna múltiplas


linhas, NDS oferece as seguintes opções:
 Uso da instrução EXECUTE IMMEDIATE com BULK COLLECT
INTO;
 Uso da instrução OPEN-FOR, FETCH e CLOSE.
Usando a instrução EXECUTE IMMEDIATE
 Usar a instrução EXECUTE IMMEDIATE para NDS e bloco
anônimo PL/SQL.

 INTO é usado para instruções de única linha e especifica


variáveis ou registros dentro de cada valor de coluna que é
retornado;
 USING usado para manipular todos o argumentos bind. O padrão
é o parâmetro IN.
SQL Dinâmico com instruções DDL: Exemplos
CREATE OR REPLACE PROCEDURE create_table (
p_table_name VARCHAR2,
p_col_specs VARCHAR2) IS
BEGIN
EXECUTE IMMEDIATE 'CREATE TABLE ' || p_table_name
|| ' (' || p_col_specs || ')';
END;

BEGIN
create_table('employees_names', 'id NUMBER(4)
PRIMARY KEY, name VARCHAR2(40)');
END;
SQL Dinâmico com instruções DML: Exemplos
CREATE FUNCTION del_rows(p_table_name VARCHAR2)
RETURN NUMBER IS
BEGIN
EXECUTE IMMEDIATE 'DELETE FROM '|| p_table_name;
RETURN SQL%ROWCOUNT;
END;
/
BEGIN
DBMS_OUTPUT.PUT_LINE(del_rows('EMPLOYEES_NAMES')|| ' linhas
deletadas.');
END;

CREATE PROCEDURE add_row(p_table_name VARCHAR2,


p_id NUMBER, p_name VARCHAR2) IS
BEGIN
EXECUTE IMMEDIATE 'INSERT INTO '|| p_table_name||
' VALUES (:1, :2)' USING p_id, p_name;
END;
SQL Dinâmico com consulta de linha simples
CREATE OR REPLACE FUNCTION get_emp(p_emp_id NUMBER)
RETURN employees%ROWTYPE IS
v_stmt VARCHAR2(200);
v_emprec employees%ROWTYPE;
BEGIN
v_stmt := 'SELECT * FROM employees ' ||
'WHERE employee_id = :id';
EXECUTE IMMEDIATE v_stmt INTO v_emprec USING p_emp_id;

RETURN v_emprec;
END;
/
DECLARE
v_emprec employees%ROWTYPE := get_emp(100);
BEGIN
DBMS_OUTPUT.PUT_LINE('Emp: '|| v_emprec.last_name);
END;
Executando bloco anônimo
CREATE OR REPLACE FUNCTION annual_sal( p_emp_id NUMBER)
RETURN NUMBER IS
v_plsql varchar2(200) :=
'DECLARE '||
' rec_emp employees%ROWTYPE; '||
'BEGIN '||
' rec_emp := get_emp(:empid); ' ||
' :res := rec_emp.salary * 12; ' ||
'END;';
v_result NUMBER;
BEGIN
EXECUTE IMMEDIATE v_plsql
USING IN p_emp_id, OUT v_result;
RETURN v_result;
END;
/
EXECUTE DBMS_OUTPUT.PUT_LINE(annual_sal(100))
Usando SQL Nativo para compilar PL/SQL
 Compilação de código PL/SQL com a instrução ALTER:
 ALTER PROCEDURE name COMPILE;
 ALTER FUNCTION name COMPILE;
 ALTER PACKAGE name COMPILE SPECIFICATION;
 ALTER PACKAGE name COMPILE BODY.
Usando SQL Nativo para compilar PL/SQL:
Exemplo
CREATE OR REPLACE PROCEDURE compile_plsql(p_name VARCHAR2,
p_plsql_type VARCHAR2, p_options VARCHAR2 := NULL) IS
v_stmt varchar2(200) := 'ALTER '|| p_plsql_type ||
' '|| p_name || ' COMPILE';
BEGIN
IF p_options IS NOT NULL THEN
v_stmt := v_stmt || ' ' || p_options;
END IF;
EXECUTE IMMEDIATE v_stmt;
END;

Você também pode gostar