Escolar Documentos
Profissional Documentos
Cultura Documentos
DELETE . . . RETURNING
Esta opo do comando DELETE permite ler valores de linhas deletadas, eliminando a necessidade de fazer um SELECT antes do DELETE.
Exemplo : DECLARE my_empno emp.empno%TYPE; my_ename emp.ename%TYPE; my_job emp.job%TYPE; BEGIN ... DELETE FROM emp WHERE empno = my_empno RETURNING ename, job INTO my_ename, my_job; END;
UPDATE . . . RETURNING
Esta opo do comando UPDATE permite ler o valor modificado das linhas alteradas, eliminando a necessidade de fazer um SELECT aps o UPDATE.
Exemplo :
DECLARE my_sal emp.sal%TYPE; my_ename emp.ename%TYPE; BEGIN ... UPDATE emp SET sal = sal + 500 WHERE ename = MILLER RETURNING sal, ename INTO my_sal, my_ename; ... END;
Abrindo Cursores
possvel abrir um cursor sem que ele esteja declarado, definindo a query diretamente no comando OPEN ou no FOR LOOP.
Exemplo : DECLARE bonus number(7,2); TYPE tipo_cursor IS REF CURSOR; emp_cv tipo_cursor; BEGIN FOR reg IN (SELECT cd_empr, vl_salario, vl_comissao FROM empregados) LOOP bonus := (reg.vl_salario * 0.05) + (reg.vl_comissao * 0.25); INSERT INTO bonus VALUES (reg.cd_empr, bonus); END LOOP; COMMIT; OPEN emp_cv FOR SELECT * FROM emp WHERE comm IS NOT NULL; ... END;
DBMS_SQL
A package DBMS_SQL permite executar qualquer comando DML ou DDL de maneira dinmica.
Exemplo : declare v_cursor v_sql v_vl_pedido vl_total v_linhas
begin v_cursor := dbms_sql.open_cursor; v_sql := 'select vl_pedido from pedido'; dbms_sql.parse(v_cursor, v_sql, dbms_sql.native); dbms_sql.define_column(v_cursor, 1, v_vl_pedido); v_linhas := dbms_sql.execute(v_cursor); loop if dbms_sql.fetch_rows(v_cursor)>0 then dbms_sql.column_value(v_cursor, 1, v_vl_pedido); vl_total := vl_total + v_vl_pedido; else exit; end if end loop; dbms_sql.close_cursor(v_cursor); end;
Execute Immediate
O comando EXECUTE IMMEDIATE compila e executa um comando SQL dinmico.
Exemplo :
DECLARE sql_stmt VARCHAR2(200); plsql_block VARCHAR2(500); emp_id NUMBER(4) := 7566; salary NUMBER(7,2); dept_id NUMBER(2) := 50; dept_name VARCHAR2(14) := PERSONNEL; location VARCHAR2(13) := DALLAS; emp_rec emp%ROWTYPE; BEGIN EXECUTE IMMEDIATE CREATE TABLE bonus (id NUMBER, amt NUMBER); sql_stmt := INSERT INTO dept VALUES (:1, :2, :3); EXECUTE IMMEDIATE sql_stmt USING dept_id, dept_name, location; sql_stmt := SELECT * FROM emp WHERE empno = :id; EXECUTE IMMEDIATE sql_stmt INTO emp_rec USING emp_id; (cont...)
Execute Immediate
Exemplo (cont.) :
... plsql_block := BEGIN emp_pkg.raise_salary(:id, :amt); END;; EXECUTE IMMEDIATE plsql_block USING 7788, 500; sql_stmt := UPDATE emp SET sal = 2000 || WHERE empno = :1 RETURNING sal INTO :2; EXECUTE IMMEDIATE sql_stmt USING emp_id RETURNING INTO salary; EXECUTE IMMEDIATE DELETE FROM dept WHERE deptno = :num USING dept_id; EXECUTE IMMEDIATE ALTER SESSION SET SQL_TRACE TRUE; END;
nmero especificado pelo usurio, entre -20000 e -20999 mensagem do erro especificada pelo usurio
UTL_FILE
A package UTL_FILE permite que programas PL/SQL leiam e gravem arquivos TXT no servidor Oracle.
Example : declare cursor c_produto is select nm_produto from produto order by 1; v_arq_destino v_buffer utl_file.file_type; varchar2(2000) := '' ;
begin
v_arq_destino := utl_file.fopen('c:\temp\', 'produto.txt', 'w'); for reg in c_produto loop utl_file.put_line(v_arq_destino,reg.nm_produto); end loop; utl_file.fclose(v_arq_destino); end;