SQL Dinâmico usando DBMS_SQL
Olá Sergio, tudo bem ?
Você teria um exemplo de como criar uma rotina usando SQL Dinâmico com a DBMS_SQL ? Tentei algumas vezes aqui sem sucesso… :/
Obrigado de antemão
Coutinho
Olá Coutinho, tudo bem ?
Como eu tinha prometido no e-mail, estou respondendo através do meu blog, e assim compartilhando também com a comunidade.
Abaixo um pequeno exemplo BEM SIMPLES, que executa instruções SQLs diferentes de acordo com uma condição, que é o que você tinha me dito que precisava.
DECLARE
--
-- Variáveis
--
cCursor INTEGER DEFAULT DBMS_SQL.open_cursor;
eCursor INTEGER;
vDescr VARCHAR2(2000);
vSQL VARCHAR2(2000);
vRowID ROWID;
p_rows NUMBER := 10;
BEGIN
-- Dynamic SQL
IF p_rows = 1
THEN
vSQL := 'SELECT table_name FROM all_tables WHERE rownum = :p_rows';
ELSE
vSQL := 'SELECT table_name FROM all_tables WHERE rownum <= :p_rows';
END IF;
-- Parse no SQL
DBMS_SQL.parse(cCursor,vSQL,DBMS_SQL.native);
-- Implementa o Bind
DBMS_SQL.bind_variable(cCursor, 'p_rows', p_rows);
-- Define a coluna e o tamanho
DBMS_SQL.define_column(cCursor, 1,'table_name',30);
-- Executa o cursor
eCursor := DBMS_SQL.execute(cCursor);
-- Laço
LOOP
EXIT WHEN DBMS_SQL.fetch_rows(cCursor) = 0;
-- Busca a informação na coluna
DBMS_SQL.column_value(cCursor, 1, vDescr);
DBMS_OUTPUT.put_line('Table Name: ' || vDescr);
END LOOP;
-- Não se esqueça de sempre fechar o seu cursor 🙂
DBMS_SQL.close_cursor(cCursor);
END;
Observe que de acordo com o contéudo da variável p_rows, ele pode executar instruções diferentes. Se precisar de maiores informações sobre o DBMS_SQL, acesse esse link.
Lembre-se que é um exemplo bem simplista, e você tem que implementar entre outras coisas, o tratamento de exceptions.
Espero ter ajudado ! 🙂
Abraço