Você está na página 1de 13

Oracle Database 11g: PL/SQL

SQL Dinâmico
Objetivos
 Descrever o fuxo 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 é verifcado 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 fexí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 especifca 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;