sábado, 29 de agosto de 2015

Oracle - Como uso SQL Dinâmico com PL/SQL ?




Como uso SQL Dinâmico com PL/SQL ?

A partir do PL/SQL V2.1 utilize a package DBMS_SQL para executar SQL´s Dinâmicos. Exemplo:

CREATE OR REPLACE PROCEDURE DYNSQL AS
   cur integer;
   rc integer;
BEGIN
   cur := DBMS_SQL.OPEN_CURSOR;
   DBMS_SQL.PARSE(cur, 'CREATE TABLE X (Y DATE)', DBMS_SQL.NATIVE);
   rc := DBMS_SQL.EXECUTE(cur);
   DBMS_SQL.CLOSE_CURSOR(cur);
END;

Outro Exemplo:

CREATE OR REPLACE PROCEDURE DEPARTMENTS(NO IN DEPT.DEPTNO%TYPE) AS
   v_cursor integer;
   v_dname char(20);
   v_rows integer;
BEGIN
   v_cursor := DBMS_SQL.OPEN_CURSOR;
   DBMS_SQL.PARSE(v_cursor, 'select dname from dept where deptno > :x', DBMS_SQL.V7);    DBMS_SQL.BIND_VARIABLE(v_cursor, ':x', no);
   DBMS_SQL.DEFINE_COLUMN_CHAR(v_cursor, 1, v_dname, 20);
   v_rows := DBMS_SQL.EXECUTE(v_cursor);
   loop
      if DBMS_SQL.FETCH_ROWS(v_cursor) = 0 then
         exit;
      end if;
      DBMS_SQL.COLUMN_VALUE_CHAR(v_cursor, 1, v_dname);
      DBMS_OUTPUT.PUT_LINE('Deptartment name: '||v_dname);
   end loop;
   DBMS_SQL.CLOSE_CURSOR(v_cursor);
   EXCEPTION
      when others then
         DBMS_SQL.CLOSE_CURSOR(v_cursor);
         raise_application_error(-20000, 'Unknown Exception Raised: '||sqlcode||' '||sqlerrm);
END;