Pular para o conteúdo

PL/SQL – SQL Dinâmico usando DBMS_SQL

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

Sergio Willians

Sergio Willians

Sergio Willians é o fundador do GPO (Grupo de Profissionais Oracle) e possui quase 30 anos de experiência em tecnologias Oracle, sendo especialista em desenvolvimento Forms/Reports, PL/SQL e EBS (E-Business Suite) nos módulos Receivables, Payables e General Ledger. Atualmente trabalha na Scania Latin America, onde se dedica à área de integração de dados com Confluent Kafka. Sua paixão é compartilhar conhecimento com a comunidade Oracle, contribuindo para o crescimento e a excelência da plataforma.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

plugins premium WordPress