P. 1
Apostila Completa Oracle 9i

Apostila Completa Oracle 9i

4.0

|Views: 3,585|Likes:
Published by Willian

More info:

Published by: Willian on Jul 22, 2009
Copyright:Attribution Non-commercial

Availability:

Read on Scribd mobile: iPhone, iPad and Android.
download as DOC, PDF, TXT or read online from Scribd
See more
See less

11/30/2012

pdf

text

original

Como vimos, apenas instruções DML podem ser incluídas diretamente em
blocos PL/SQL. Porém, isso pode ser retificado por meio da SQL dinâmica. Em vez de
ser analisada sintaticamente junto com o bloco PL/SQL, a SQL dinâmica é analisada
sintaticamente e é subseqüentemente executada em tempo de execução. Há duas
técnicas para executar a SQL dinâmica. A primeira é o pacote DBMS_SQL, a
segunda, introduzida no Oracle8i, é a SQL dinâmica nativa através da instrução
EXECUTE IMMEDIATE. Esta segunda técnica é uma parte integrante da própria
linguagem PL/SQL, e conseqüentemente é significativamente mais simples e rápida
que utilizar o pacote DBMS_SQL.

Exemplo:

SQL> set serveroutput on
SQL>
SQL> DECLARE
2 v_SQLString VARCHAR2(200);
3 v_PLSQLBlock VARCHAR2(200);
4 BEGIN
5
EXECUTE IMMEDIATE
6 'CREATE TABLE execute_table (col1 VARCHAR(10))';

7
8 FOR v_Counter IN 1..10 LOOP
9 v_SQLString :=
10 'INSERT INTO execute_table
11 VALUES (''Row ' || v_Counter || ''')';
12
EXECUTE IMMEDIATE v_SQLString;
13 END LOOP;
14
15 v_PLSQLBLock :=
16 'BEGIN
17 FOR v_Rec IN (SELECT * FROM execute_table) LOOP
18 DBMS_OUTPUT.PUT_LINE(v_Rec.col1);
19 END LOOP;
20 END;';
21
22
EXECUTE IMMEDIATE v_PLSQLBlock;
23
24
EXECUTE IMMEDIATE 'DROP TABLE execute_table';
25 END;
26 /
Row 1
Row 2
Row 3

157

Row 4
Row 5
Row 6
Row 7
Row 8
Row 9
Row 10

PL/SQL procedure successfully completed.

Podemos também utilizar EXECUTE IMMEDIATE com instruções utilizando

variáveis de vinculação.

Exemplo:

DECLARE

v_SQLString VARCHAR2(1000);
v_PLSQLBlock VARCHAR2(1000);

CURSOR c_EconMajor IS
SELECT *
FROM students
WHERE major = 'Economics';

BEGIN

v_SQLString :=

'INSERT INTO CLASSES (department, course, description,
max_students, current_students,
num_credits)
VALUES (:dep, :course, :descr, :max_s, :cur_s,

:num_c)';

EXECUTE IMMEDIATE v_SQLString USING
'ECN', 103, 'Economics 103', 10, 0, 3;

FOR v_StudentRec IN c_EconMajor LOOP

EXECUTE IMMEDIATE
'INSERT INTO registered_students
(student_ID, department, course, grade)
VALUES (:id, :dep, :course, NULL)'
USING v_StudentRec.ID, 'ECN', 103;

v_PLSQLBlock :=
'BEGIN

UPDATE classes SET current_students =

current_students + 1

WHERE department = :d and course = :c;

END;';

158

EXECUTE IMMEDIATE v_PLSQLBlock USING 'ECN', 103;

END LOOP;

END;
/

You're Reading a Free Preview

Download
scribd
/*********** DO NOT ALTER ANYTHING BELOW THIS LINE ! ************/ var s_code=s.t();if(s_code)document.write(s_code)//-->