O que é cursor no oracle
Oracle Usa uma área de trabalho chamada áreas SQL Privadas para executar Instruções SQL e armazenar informações. Um Cursor Oracle é uma construção PL/SQL que permite nomear essas áreas de trabalho e acessar suas informações armazenadas
Tipos de cursor no Oracle
- Cursor implícito no Oracle
- Cursor explícito no Oracle
Cursores explícitos
Os cursores explícitos têm os seguintes estágios
1) Declare:Declaramos o nome do cursor e definimos a estrutura da consulta
2) Open: A instrução open executa a consulta e vincula qualquer variável referenciada. As linhas identificadas pela consulta são chamadas de conjuntos ativos. E agora que está disponível para buscar
O que é Conjunto Ativo: O conjunto de linhas retornado por uma consulta de várias linhas
Seu tamanho é o número de linhas que atende aos seus critérios de pesquisa
3) Busca:Nesta etapa, as linhas são buscadas do cursor e, após cada busca, você testa o cursor para quaisquer linhas restantes, se não houver linhas, você continua fechando o cursor
4) Fechar:A instrução close libera o conjunto ativo de linhas e podemos abrir novamente o cursor para buscar atualizar o conjunto ativo
Etapas em detalhes
Declarando um cursor
- Nome do cursor
- Estrutura da consulta
Syntax: CURSOR IS : It includes most of the usual clauses, but INTO Clause is not allowed Example: DECLARE CURSOR cur1 is SELECT address,salary,emp_no,emp_name FROM emp WHERE region=’US’; ……………………………… BEGIN ……………………………… END;
Abrindo um cursor
Aqui a execução de análise e consulta é feita. Após abrir o cursor as linhas retornadas pela consulta ficam disponíveis para busca.
Syntax: Open <cursor name> This statement is used within the executable section of the block. It also establishes an active set of the rows Example: OPEN cur1; DECLARE v_salary number; CURSOR cur1 is SELECT salary FROM emp WHERE region=’US’; BEGIN OPEN cur1; LOOP FETCH cur1 into v_salary; EXIT WHEN cur1%NOTFOUND; DBMS_OUTPUT.PUT_LINE (v_salary); END LOOP; CLOSE cur1; END; /
O cursor agora apontará para a primeira linha no conjunto ativo.
Buscando as linhas
Depois que o cursor é aberto, a linha atual é carregada em variáveis. A linha actualéa linha para a qual o cursor está a apontar de momento A obtenção de dados para a variável ou máquina PL/SQL
A variável é feita através da instrução FETCH
Syntax: FETCH INTO ;
- Para cada valor de coluna retornado pela consulta associada ao cursor, deve haver um
variável correspondente na lista INTO.
- TAMBÉM seus tipos de dados devem ser compatíveis
FECHAR UM CURSOR
Ele fecha explicitamente o cursor, permitindo que ele seja reaberto, se necessário.
Syntax: CLOSE <cursor-name>; Example: CLOSE cur1 Example of Using CLOSE <Cursor Name> DECLARE v_address emp.address%TYPE; CURSOR cur1 is select address from emp; BEGIN OPEN cur1; LOOP FETCH cur1 into v_address; EXIT WHEN cur1%NOTFOUND; DBMS_OUTPUT.PUT_LINE(v_address); END LOOP; CLOSE cur1; END; /
Atributos explícitos do cursor
Atributo | Tipo | Descrição |
%ISOPEN | Booleano | Avalia como TRUE se o cursor estiver aberto |
%NOTFOUND | Booleano | Avalia como TRUE se a busca mais recente não retornar uma linha |
%FOUND | Booleano | Avalia como TRUE se a busca mais recente retornar uma linha |
%ROWCOUNT | NÚMERO | Avalia o número total de linhas retornadas até agora |
Conceito avançado com cursor Oracle
Cursor e registros do Oracle
1) Já lemos sobre registros PLSQL.
2) Podemos processar as linhas do conjunto ativo buscando valores em um registro PL/SQL também
3) Também podemos definir um registro plsql com base na lista selecionada das colunas nos cursores explícitos também
Exemplo
DECLARE CURSOR dept_cursor is Select deptno,dept_name FROM dept; dept_record dept_cursor%rowtype; BEGIN OPEN dept_cursor; LOOP FETCH dept_cursor INTO dept_record; Insert into dept_temp (deptno, deptname) values (dept_record.deptno, dept_record.dept_name); EXIT WHEN dept_cursor%notfound; END LOOP; Commit; CLOSE dept_cursor; END; /
Cursor com Parâmetros/cursor parametrizado no oracle
Syntax: CURSOR cursor_name(parameter_name datatype, ) IS Select_statement;
1) Passar valores de parâmetro para um cursor quando o cursor é aberto e a consulta é executada
2) Abra um cursor explícito várias vezes com diferentes conjuntos ativos a cada vez
Open cursor_name(parameter_value , ……);
Exemplo
DECLARE CURSOR cur1(v_deptno number) is Select deptname,dept_loc,dept_pincode from dept where deptno=v_deptno; Dept_record cur1%rowtype; l_deptno number:=111; BEGIN OPEN cur1(112); LOOP FETCH cur1 into dept_record; IF cur1%FOUND THEN Dbms_output.put_line(dept_record.deptname); ELSE Exit; END IF; END LOOP; CLOSE cur1; OPEN cur1(l_deptno); LOOP FETCH cur1 into dept_record; IF cur1%FOUND THEN Dbms_output.put_line(dept_record.deptname); ELSE Exit; END IF; END LOOP; CLOSE cur1; END; /
Artigos relacionados
Como trabalhar com data no Oracle sql
Tabelas Oracle PLSQL
Tudo sobre registros Oracle PLSQL
25 perguntas mais comuns em entrevistas com Oracle PLSQL
Estrutura de Blocos Oracle PLSQL e Variável Oracle PLSQL
Atributos do cursor