Avalados por :

Comparação entre o uso de cursores abertos e SELECT no Open SQL

  • Creado 01/03/2024
  • Modificado 01/03/2024
  • 12 Vistas
0
Cargando...

Entre "OPEN CURSOR" e Open SQL (SELECT)

Se eu usar um cursor aberto com uma declaração de seleção paralela e normal, qual é melhor?

Pedro Pascal
Se unió el 07/03/2018
Pinterest
Telegram
Linkedin
Whatsapp

4 Respuestas

0
Cargando...

hi,

Uma instrução OPEN CURSOR gera a tabela de resultados definida sob o nome especificado com uma instrução DECLARE CURSOR.

<open_cursor_statement> ::= OPEN <result_table_name>

A instrução DECLARE CURSOR define uma tabela de resultados nomeada (ver tabela de resultados nomeada/sem nome) com o nome result_table_name.

<declare_cursor_statement> ::= DECLARE <result_table_name> CURSOR FOR <select_statement>

Uma instrução SELECT (select_statement) define e cria uma tabela de resultados sem nome (ver tabela de resultados nomeada/sem nome).

Sintaxe

<select_statement> ::= <query_expression> [<order_clause>] [<update_clause>] [<lock_option>] [FOR REUSE]

expressão de consulta, cláusula de ordem, cláusula de atualização, opção de bloqueio

Não é permitida uma instrução OPEN CURSOR para tabelas de resultados criadas com esta instrução SELECT.

A instrução SELECT (select_statement) está sujeita às regras especificadas para a instrução DECLARE CURSOR e aquelas especificadas para a instrução OPEN CURSOR.

Dependendo da estratégia de busca, todas as linhas na tabela de resultados são pesquisadas quando a instrução SELECT (select_statement) é executada e a tabela de resultados é gerada fisicamente, ou cada linha seguinte da tabela de resultados é pesquisada quando uma instrução FETCH é executada, sem ser armazenada fisicamente. Isso deve ser considerado para o comportamento temporal das instruções FETCH.

Open SQL consiste em um conjunto de instruções ABAP que realizam operações na base de dados central em SAP Web AS ABAP. Os resultados das operações e quaisquer mensagens de erro são independentes do sistema de base de dados em uso. Portanto, o Open SQL fornece uma sintaxe e semântica uniforme para todos os sistemas de base de dados suportados pela SAP. Programas ABAP que utilizam apenas instruções Open SQL funcionarão em qualquer sistema SAP, independentemente do sistema de base de dados em uso. As instruções Open SQL só podem trabalhar com tabelas de base de dados criadas no Dicionário ABAP.

open sql

No Dicionário ABAP, você pode combinar colunas de diferentes tabelas de base de dados em uma visão de base de dados (ou visão abreviada). Nas instruções Open SQL, as visões são tratadas exatamente da mesma maneira que as tabelas de base de dados. Qualquer referência a tabelas de base de dados nas seções seguintes pode ser aplicada igualmente a visões.

A instrução Open SQL para ler dados de tabelas de base de dados é:

SELECT resultado

INTO objetivo

FROM fonte

[WHERE condição]

[GROUP BY campos]

[HAVING cond]

[ORDER BY campos].

A instrução SELECT é dividida em uma série de cláusulas simples, cada uma com uma função diferente na seleção, colocação e disposição dos dados da base de dados.

Por favor, recompense pontos se for útil,

shylaja

Respondido el 15/04/2024
LUCIANO RIOJA GHIOTTO
Se unió el 13/07/2019
0
Cargando...

Olá Veera, por favor, revise também esta declaração SQL dinâmica.

Abaixo está o código que utilizei para uma consulta SQL dinâmica e funcionou para mim.

DATA where_tab(25) OCORRE 5 COM CABEÇALHO DE LINHA.

DATA p_kunnar like vbak-kunnr.

CONDENSE p_kunnar NO-GAPS.

IF p_kunnar NE ''.

APPEND 'vbak~kunnr = p_kunnar' A where_tab.

ENDIF.

SELECT DISTINCT vbeln

FROM vbak

INTO CAMPOS CORRESPONDENTES DA TABELA gi_vtab

WHERE vbak-vkorg = p_vkorg E

vbak-vtweg = p_vtweg E

vbak-auart = 'LP' E

(where_tab).

Saudações,

Hema.

Respondido el 15/04/2024
LUCIANO RIOJA GHIOTTO
Se unió el 13/07/2019
0
Cargando...

Olá Veera,

ABRIR CURSOR

ABRIR CURSOR COM HOLD dbcur PARA

SELECIONAR resultado

DE fonte

[PARA TODOS OS ITENS EM itab] ONDE sql_cond

AGRUPAR POR grupo TENDO group_cond

ORDENAR POR chave_ordenacao.

Adição: ... COM HOLD

Esta declaração abre um cursor de banco de dados para a seleção definida após FOR e vincula uma variável de cursor dbcur a este cursor de banco de dados. Para dbcur, uma variável declarada com o tipo de dados cursor predefinido específico deve ser inserida. Um cursor de banco de dados dbcur que já foi aberto não pode ser aberto novamente. Uma linha do conjunto resultante é sempre atribuída a um cursor de banco de dados aberto como uma posição de cursor. Após a declaração OPEN CURSOR, o cursor de banco de dados é posicionado na frente da primeira linha do conjunto resultante.

Após FOR, a sintaxe de uma declaração SELECT pode ser inserida, que contém todas as adições da declaração SELECT normal, exceto INTO e APPENDING. Na adição resultado, a adição ÚNICO também não pode ser usada após SELECT.

Apenas um número limitado de cursores de banco de dados pode estar aberto ao mesmo tempo. Um cursor de banco de dados aberto pode ser fechado usando a declaração CLOSE CURSOR. Além disso, um cursor de banco de dados aberto é fechado para um commit de banco de dados ou um rollback de banco de dados.

Se uma variável de cursor dbcur de um cursor de banco de dados aberto for atribuída a outra variável de cursor, esta última será vinculada ao mesmo cursor de banco de dados na mesma posição. Uma variável de cursor de um cursor de banco de dados aberto também pode ser transferida para procedimentos chamados externamente, para permitir o acesso ao cursor de banco de dados a partir de lá.

Não é recomendado atribuir variáveis de cursor entre si, mas sim defini-las exclusivamente usando as declarações OPEN CURSOR e CLOSE CURSOR.

Adição ... COM HOLD

:

Se a adição COM HOLD for especificada, o cursor de banco de dados não é fechado em um commit de banco de dados acionado explicitamente ou rollback de banco de dados, por exemplo, SQL nativo. A adição COM HOLD não pode ser especificada se o cursor deve ser aberto para uma conexão de banco de dados secundária.

*****************************************************

Usando um Cursor para Ler Dados

Na declaração SELECT normal, os dados da seleção são sempre lidos diretamente na área de destino especificada na cláusula INTO durante a declaração SELECT. Quando você usa um cursor para ler dados, desvincula o processo da declaração SELECT. Para fazer isso, você deve abrir um cursor para uma declaração SELECT. Depois, você pode colocar as linhas da seleção em uma área de destino plana.

Abrir e Fechar Cursores

Para abrir um cursor para uma declaração SELECT, use o seguinte:

ABRIR CURSOR COM HOLD <c> PARA SELECIONAR <resultado>

DE <fonte>

ONDE <condição>

AGRUPAR POR <campos>

TENDO <cond>

ORDENAR POR <campos>.

Você deve primeiro ter declarado o cursor <c> usando a declaração DATA e o tipo de dados especial CURSOR. Você pode usar todas as cláusulas da declaração SELECT, exceto a cláusula INTO. Além disso, você só pode formular a cláusula SELECT de modo que a seleção consista em mais de uma linha. Isso significa que você não pode usar a adição ÚNICO e que a seleção de colunas não pode conter apenas expressões agregadas.

Um cursor aberto aponta para um manipulador interno, de forma semelhante a uma variável de referência apontando para um objeto. Você pode reatribuir cursores para que mais de um aponte para o mesmo manipulador. Em uma declaração MOVE, o cursor de destino adota todos os atributos do cursor de origem, ou seja, sua posição e todas as cláusulas na declaração OPEN CURSOR.

Você também pode abrir mais de um cursor em paralelo para uma única tabela de banco de dados. Se um cursor estiver aberto, você não pode reabri-lo. Para fechar um cursor explicitamente, use a seguinte declaração:

FECHAR CURSOR <c>.

Você deve usar esta declaração para fechar todos os cursores que não são mais necessários, pois apenas um número limitado de cursores pode estar aberto simultaneamente. Com uma exceção, uma LUW de banco de dados é concluída quando você fecha um cursor, seja explicitamente ou implicitamente. A adição COM HOLD na declaração OPEN CURSOR permite que você evite que um cursor seja fechado quando ocorre um commit de banco de dados em SQL nativo.

Lendo Dados

Um cursor aberto está vinculado a uma seleção de várias linhas na tabela de banco de dados. Para ler os dados em uma área de destino no programa ABAP, use o seguinte:

BUSCAR PRÓXIMO CURSOR <c> EM <destino>.

Isso escreve uma linha da seleção na área de destino <destino> e o cursor avança uma linha na seleção. A instrução de busca desvincula a cláusula INTO das outras cláusulas na declaração SELECT. Todas as cláusulas INTO da declaração SELECT podem ser usadas. A declaração lê as linhas necessárias para preencher a área de destino da cláusula INTO e move o cursor para a próxima linha a ser lida.

SY-SUBRC é definido como 0 até que todas as linhas da seleção tenham sido lidas; caso contrário, é 4. Após uma instrução de BUSCA, o campo de sistema SY-DBCNT contém o número de todas as linhas lidas até agora para o cursor correspondente.

RELATÓRIO demo_select_cursor_1.

Respondido el 15/04/2024
LUCIANO RIOJA GHIOTTO
Se unió el 13/07/2019
0
Cargando...

Olá Veera,

ABRIR CURSOR

ABRIR CURSOR COM HOLD dbcur PARA

SELECIONE resultado

DE origem

[PARA TODOS OS ITENS EM itab] ONDE sql_cond

AGRUPAR POR grupo TENDO group_cond

ORDENAR POR chave_ordenacao.

Adição: ... COM HOLD

Esta instrução abre um cursor de banco de dados para a seleção definida após PARA e vincula uma variável de cursor dbcur a este cursor de banco de dados. Para dbcur, uma variável declarada com o tipo de dados cursor pré-definido específico deve ser inserida. Um cursor de banco de dados dbcur que já foi aberto não pode ser aberto novamente. Uma linha do conjunto resultante é sempre atribuída a um cursor de banco de dados aberto como uma posição do cursor. Após a instrução ABRIR CURSOR, o cursor de banco de dados é posicionado na frente da primeira linha do conjunto resultante.

Após PARA, a sintaxe de uma instrução SELECT pode ser inserida, que contém todas as adições da instrução SELECT normal, exceto INTO e APPENDING. Na adição resultado, a adição SINGLE também não pode ser usada após SELECT.

Apenas um número limitado de cursores de banco de dados pode estar aberto ao mesmo tempo. Um cursor de banco de dados aberto pode ser fechado usando a instrução FECHAR CURSOR. Além disso, um cursor de banco de dados aberto é fechado para um commit de banco de dados ou um rollback de banco de dados.

Se uma variável de cursor dbcur de um cursor de banco de dados aberto for atribuída a outra variável de cursor, esta última é vinculada ao mesmo cursor de banco de dados na mesma posição. Uma variável de cursor de um cursor de banco de dados aberto também pode ser transferida para procedimentos que foram chamados externamente, para permitir o acesso ao cursor de banco de dados a partir de lá.

Não é recomendado atribuir variáveis de cursor entre si, mas sim defini-las exclusivamente usando as instruções ABRIR CURSOR e FECHAR CURSOR.

Adição ... COM HOLD

:

Se a adição COM HOLD for especificada, o cursor de banco de dados não é fechado em um commit de banco de dados acionado explicitamente ou em um rollback de banco de dados, por exemplo, SQL Nativo. A adição COM HOLD não pode ser especificada se o cursor for aberto para uma conexão de banco de dados secundária.

*****************************************************

Usando um Cursor para Ler Dados

Na instrução SELECT normal, os dados da seleção são sempre lidos diretamente na área de destino especificada na cláusula INTO durante a instrução SELECT. Quando você usa um cursor para ler dados, desvincula o processo da instrução SELECT. Para fazer isso, você deve abrir um cursor para uma instrução SELECT. Em seguida, você pode colocar as linhas da seleção em uma área de destino plana.

Abrir e Fechar Cursores

Para abrir um cursor para uma instrução SELECT, use o seguinte:

ABRIR CURSOR COM HOLD <c> PARA SELECIONAR <resultado>

DE <fonte>

ONDE <condição>

AGRUPAR POR <campos>

TENDO <cond>

ORDENAR POR <campos>.

Você deve primeiro ter declarado o cursor <c> usando a instrução DATA e o tipo de dados especial CURSOR. Você pode usar todas as cláusulas da instrução SELECT, exceto a cláusula INTO. Além disso, você só pode formular a cláusula SELECT para que a seleção consista em mais de uma linha. Isso significa que você não pode usar a adição SINGLE e que a seleção de colunas não pode conter apenas expressões agregadas.

Um cursor aberto aponta para um manipulador interno, de forma semelhante a uma variável de referência apontando para um objeto. Você pode reatribuir cursores para que mais de um aponte para o mesmo manipulador. Em uma instrução MOVE, o cursor de destino adota todos os atributos do cursor de origem, ou seja, sua posição e todas as cláusulas na instrução ABRIR CURSOR.

Você também pode abrir mais de um cursor em paralelo para uma única tabela de banco de dados. Se um cursor já estiver aberto, você não pode reabri-lo. Para fechar um cursor explicitamente, use a seguinte instrução:

FECHAR CURSOR <c>.

Você deve usar esta instrução para fechar todos os cursores que não são mais necessários, pois apenas um número limitado de cursores pode estar aberto simultaneamente. Com uma exceção, uma LUW de banco de dados é concluída quando você fecha um cursor explicitamente ou implicitamente. A adição WITH HOLD na instrução ABRIR CURSOR permite que você evite que um cursor seja fechado quando ocorre um commit de banco de dados no SQL Nativo.

Lendo Dados

Um cursor aberto está vinculado a uma seleção de várias linhas na tabela de banco de dados. Para ler os dados em uma área de destino no programa ABAP, use o seguinte:

BUSCAR PRÓXIMO CURSOR <c> EM <destino>.

Isso escreve uma linha da seleção na área de destino <destino> e o cursor avança uma linha na série de seleção. A instrução de busca desvincula a cláusula INTO das outras cláusulas na instrução SELECT. Todas as cláusulas INTO da instrução SELECT podem ser usadas. A instrução lê as linhas necessárias para preencher a área de destino da cláusula INTO e move o cursor para a próxima linha a ser lida.

SY-SUBRC é definido como 0 até que todas as linhas da seleção tenham sido lidas; caso contrário, é 4. Após uma instrução FETCH, o campo do sistema SY-DBCNT contém o número de todas as linhas lidas até agora para o cursor correspondente.

RELATÓRIO demo_select_cursor_1.

Respondido el 15/04/2024
LUCIANO RIOJA GHIOTTO
Se unió el 13/07/2019

contacto@primeinstitute.com

(+51) 1641 9379
(+57) 1489 6964

© 2024 Copyright. Todos los derechos reservados.

Desarrollado por Prime Institute

¡Hola! Soy Diana, asesora académica de Prime Institute, indícame en que curso estas interesado, saludos!
Hola ¿Puedo ayudarte?