A linguagem de banco de dados SQL permite que você retorne um resultado de dados completo de uma única vez, mas as vezes precisamos manipular este resultado em tempo de execução, uma linha de cada vez, deste modo podemos utilizar um recurso chamado Cursor para realizar este procedimento.
Basicamente todos os bancos de dados possuem este recurso, entretanto cada um deles possui também suas peculiaridades e funcionalidades diferenciadas, mas no geral funcionam da seguinte maneira: a instrução DECLARE CURSOR define os atributos de um cursor do servidor SQL, como o seu comportamento de rolagem e a consulta usada para construir o conjunto de resultados no qual o cursor funciona. A instrução OPEN popula o conjunto de resultados e FETCH retorna uma linha do conjunto de resultados. A instrução CLOSE libera o conjunto de resultados atual associado ao cursor. A declaração DEALLOCATE libera os recursos usados pelo cursor.
O Native SQL possui uma sintaxe simplificada apesar de nos permitir uma conexão direta sem utilizar o dicionário de dados ABAP. No banco de dados, geralmente um cursor é criado dentro de uma Stored Procedure, mas algumas linguagens de programação possuem instruções para cria-los utilizando a sintaxe da própria língua, em ABAP esta sintaxe é bem parecida com a sintaxe utilizada pelo Open SQL.
Sintaxe:
- OPEN <cursor name> FOR <statement>
- FETCH NEXT <cursor name> INTO <target(s)>.
- CLOSE <cursor name>
Exemplo:
Neste exemplo criamos uma cursor SQL direto sem utilizar uma procedure.
Abap
*&---------------------------------------------------------------------* *& Report ZCURSOR *& *&---------------------------------------------------------------------* *& Desenvolvimento Aberto *& Native SQL - Open Cursor *&---------------------------------------------------------------------* REPORT ZCURSOR. * Cria parametro de pesquisa DATA : parametro1 TYPE spfli-carrid VALUE 'AZ'. DATA : parametro2 TYPE spfli-carrid VALUE 'LH'. * Cria variáveis do cursor DATA: BEGIN OF cur, variavel1 TYPE spfli-CONNID, variavel2 TYPE spfli-CITYFROM, variavel3 TYPE spfli-CITYTO, variavel4 TYPE spfli-DISTANCE, variavel5 TYPE spfli-DISTID, END OF cur. * Declara e Abre um cursor * ------------------------- * * Atente-se que estamos utilizando o SAP MaxDB para este exemplo. * O Native SQL possui sua própria sintaxe e não utiliza * a sintaxe do banco de dados, neste caso a sintaxe para o banco seria: * * --SAP MaxDB ANSI 92 SQL * * DECLARE db1 CURSOR FOR * SELECT * FROM TABELA * WHERE X = 1 * * Em vez disto, utiliza o comando NATIVE SQL: * OPEN nome do cursor FOR clausula sql * este comando declara e abre um cursor no banco de dados. EXEC SQL. OPEN db1 FOR SELECT CONNID, CITYFROM, CITYTO, DISTANCE, DISTID FROM spfli WHERE MANDT = '200' AND CARRID = :parametro1 UNION SELECT CONNID, CITYFROM, CITYTO, DISTANCE, DISTID FROM spfli WHERE MANDT = '200' AND CARRID = :parametro2 ENDEXEC. * Executa Fetch e alimenta as variáveis do cursor DO. EXEC SQL. FETCH NEXT db1 INTO :cur-variavel1, :cur-variavel2, :cur-variavel3, :cur-variavel4, :cur-variavel5 ENDEXEC. IF sy-subrc <> 0. EXIT. ELSE. WRITE : / cur-variavel1, cur-variavel2, cur-variavel3, cur-variavel4, cur-variavel5. ENDIF. ENDDO. * Fecha o cursor EXEC SQL. CLOSE db1 ENDEXEC.