Olá! Hoje vamos aprender sobre cursores parametrizados no Oracle PL/SQL. Este é um tópico essencial para quem quer criar consultas mais dinâmicas e flexíveis.
O que são Cursores Parametrizados?
Imagine que você tem uma biblioteca digital e quer criar listas de livros baseadas em diferentes critérios, como gênero ou ano de publicação. Com cursores parametrizados, você pode “pedir” ao banco de dados listas específicas de dados, apenas mudando o “parâmetro” da sua consulta. Isso torna seu código mais eficiente e adaptável a diferentes necessidades.
Declarando um Cursor com Parâmetros
Vamos ver como declarar um cursor com parâmetros:
1 2 3 |
CURSOR nome_do_cursor [lista_de_parametros] IS INSTRUCAO_SELECT;</code><code> |
Parece simples, não é? Vamos ver um exemplo prático:
1 2 3 4 5 |
DECLARE CURSOR c_zip (p_state zipcode.state%TYPE) IS SELECT zip, city, state FROM zipcode WHERE state = p_state; |
Neste exemplo, nosso cursor c_zip aceita um parâmetro p_state. Este parâmetro é usado na cláusula WHERE para limitar os resultados a um estado específico. É como se você estivesse dizendo ao banco de dados: “Me dê todos os CEPs, cidades e estados, mas apenas para o estado que eu especificar”.
Cursores com Valores Padrão
Às vezes, você quer que seu cursor tenha um valor padrão caso nenhum seja passado. É como ter um prato do dia no restaurante. Veja como fazer isso:
1 2 3 4 5 |
DECLARE CURSOR c_zip_ny (p_state zipcode.state%TYPE DEFAULT 'NY') IS SELECT zip, city, state FROM zipcode WHERE state = p_state; |
Neste caso, se ninguém especificar um estado, o cursor c_zip_ny vai usar ‘NY' como padrão. É como dizer: “Se ninguém pedir nada específico, me traga os dados de Nova York”.
Abrindo e Processando Cursores Parametrizados
Depois de declarar um cursor com parâmetros, você precisa passar valores específicos ao abri-lo. É como ligar a TV e escolher um canal. Vamos ver alguns exemplos:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
-- Abre o cursor c_zip e passa o valor 'CT' OPEN c_zip ('CT'); -- Usando um loop FOR para abrir o cursor c_zip FOR rec IN c_zip ('CT') LOOP -- Processamento aqui END LOOP; -- Abre o cursor c_zip_ny e passa 'GA' FOR rec IN c_zip_ny ('GA') LOOP -- Processamento aqui END LOOP; -- Abre o cursor c_zip_ny sem passar valor (usa padrão) FOR rec IN c_zip_ny LOOP -- Processamento aqui END LOOP; |
Código Completo com Cursores Parametrizados
Vamos analisar um exemplo completo para entender como processar cursores parametrizados:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
DECLARE CURSOR c_zip (p_state IN zipcode.state%TYPE DEFAULT 'GA') IS SELECT zip, city, state FROM zipcode WHERE state = p_state; BEGIN DBMS_OUTPUT.PUT_LINE('Processando c_zip com valor de parâmetro'); FOR rec IN c_zip ('MA') LOOP DBMS_OUTPUT.PUT_LINE(rec.city||', '||rec.zip); END LOOP; DBMS_OUTPUT.PUT_LINE('Processando c_zip sem valor de parâmetro'); FOR rec IN c_zip LOOP DBMS_OUTPUT.PUT_LINE(rec.city||', '||rec.zip); END LOOP; END; |
Neste exemplo, estamos processando o cursor duas vezes. Na primeira vez, passamos ‘MA' como parâmetro, então ele vai mostrar cidades de Massachusetts. Na segunda vez, não passamos nenhum parâmetro, então ele usa o valor padrão ‘GA' e mostra cidades da Geórgia.
Importância dos Valores Iniciais em Variáveis
Ao passar valores de variáveis para cursores parametrizados, é crucial inicializar as variáveis corretamente. É como preparar os ingredientes antes de começar a cozinhar. Veja este exemplo:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
DECLARE CURSOR c_course (p_prereq IN course.prerequisite%TYPE) IS SELECT course_no, description FROM course WHERE prerequisite = p_prereq; v_prereq course.prerequisite%TYPE; BEGIN v_prereq := 20; -- Inicializa a variável antes do loop FOR rec IN c_course (v_prereq) LOOP DBMS_OUTPUT.PUT_LINE(rec.course_no||', '||rec.description); END LOOP; END; |
Aqui, v_prereq é inicializado antes do loop. Isso garante que o cursor funcione corretamente.
Erros Comuns
Um erro comum é não inicializar a variável que passamos para o parâmetro do cursor. É como tentar fazer um bolo sem os ingredientes. Veja o que acontece:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
DECLARE CURSOR c_course (p_prereq IN course.prerequisite%TYPE) IS SELECT course_no, description FROM course WHERE prerequisite = p_prereq; v_prereq course.prerequisite%TYPE; BEGIN -- Não inicializa v_prereq; permanece NULL FOR rec IN c_course (v_prereq) LOOP -- Retorna 0 linhas devido ao NULL em v_prereq DBMS_OUTPUT.PUT_LINE(rec.course_no||', '||rec.description); END LOOP; END; |
Neste caso, como v_prereq não foi inicializado, o cursor não retorna nenhuma linha.
Conclusão
Usar cursores parametrizados em PL/SQL é como ter um chef particular que pode preparar qualquer prato que você pedir, apenas mudando os ingredientes. Eles permitem consultas mais dinâmicas e eficientes. Lembre-se sempre de inicializar suas variáveis e entender que os valores dos parâmetros são fixados quando o cursor é aberto.
Pratique esses conceitos e veja como eles podem simplificar seu trabalho com bancos de dados Oracle. Com o tempo, você se tornará um mestre em manipular dados de forma eficiente e flexível.