SAP – Native SQL – Stored Procedure – Parameters IN and OUT – Abap

Publicado: 25 de junho de 2014 em Abap

Stored Procedures são procedimentos de código SQL armazenados no banco de dados, as stored procedures são mais rápidas do que o código tradicional, o que significa que elas estão se tornando cada vez mais populares. Com código da aplicação se mudando dos programas externos para o motor de banco de dados, Os DBAs precisam entender os requisitos de memória relacionados para procedimentos armazenados e saber como gerenciar estes procedimentos para o ideal desempenho do banco de dados. Isto muda de banco para banco, cada um deles possui suas recomendações de melhores praticas para atingir um melhor desempenho.

Uma palavra sobre o Dicionário de Dados SAP

Como sabemos Native SQL nos permite utilizar código SQL direto, ignorando a camada de banco de dados do SAP R/3, isto significa que o Native SQL é o método mais rápido para manipular grande quantidade de dados em ABAP, apesar do desenvolvedor estar sozinho nesta empreitada e não poder utilizar nenhum recurso do dicionário ABAP, incluindo os tipos de campos compatíveis entre banco e linguagem de programação, manipulação automática do campo MANDT do cliente, escrita SQL única para qualquer banco de dados (Open SQL) entre outras facilidades.

Apesar dos contras este conceito nos permite utilizar Stored Procedures como métodos para extrair ou manipular dados utilizando o ABAP, podendo até exercer a mesma função do RFC em termos de manuseio de dados entre diferentes servidores e aplicações não R/3.

Por exemplo algumas tabelas contendo dados massivos como o caso da tabela de notas fiscais ou lançamentos contábeis entre outras que necessitam de algum tipo de auditoria de algum sistema não R/3 que pretende importar os dados do sistema R/3, podem obter método de extração da própria empresa detentora do sistema R/3 utilizando procedures obtendo a melhor performance possível na extração e importação de dados aplicando técnicas de Bulk dos bancos de dados(importação em massa) ao invés de utilizar as próprias funções de RFC disponíveis pela SAP, cujo criam um set de dados na memoria e necessitam de um looping para extrair linha a linha da tabela alocada por um sistema não R/3.

SAP MaxDB SQL Studio

Utilizaremos neste post o banco de dados MaxDB da própria SAP, mas escreveremos as Stored Procedures para os bancos de dados Oracle, IBM DB2 e Microsoft SQL Server.

Este tipo de técnica necessita que o desenvolvedor tenha um conhecimento avançado do banco de dados a ser utilizado e do próprio banco de dados SAP, suas tabelas e seus conceitos por traz do dicionário de dados.

1- Entre no SAP MaxDB e utilize o script SQL completo encontrado abaixo.

SQL Studio

SQL Studio

2 – Crie um programa no SAP e utilize o código correspondente.

Stored Procedure - Abap

Stored Procedure – Abap

Exemplo:

Neste exemplo criamos uma tabela que não está declarada no dicionário de dados ABAP e criamos uma Stored Procedure com parâmetros de entrada e saída, e a utilizamos como um método para extrair dados diretamente em um programa ABAP.

Obs: Visto que no campo de valor flutuante da imagem acima, o mesmo foi extraído diretamente do banco de dados, ele não pode ser formatado pela linguagem ABAP por seus tipos nativos, mas você pode criar seu próprio tipo de dado para mostra-lo corretamente usando o dicionário de dados após a operação no banco de dados, utilizando o tipo de valor padrão para números flutuantes com casas decimais, que compõe o conceito padrão da linguagem ABAP ou seja, utilizando um Data Object.

SAP MaxDB

-- Cria tabela no schema SAPNSP
CREATE TABLE SAPNSP.ZFUNCIONARIO
(
            ID_FUNCIONARIO INT,
            NOME VARCHAR (30),
            SOBRENOME VARCHAR(70),
            CARGO VARCHAR(30),
            SALARIO DECIMAL(9,2)
)

-- Insere dados na tabela
Insert into SAPNSP.ZFUNCIONARIO values (1,'Steve','Gates','Programador',2550.56)
Insert into SAPNSP.ZFUNCIONARIO values (2,'Bill','Jobs','Diretor',5143.71)

-- Visualiza dados
select * from SAPNSP.ZFUNCIONARIO

-- Cria Stored Procedure
CREATE DBPROC SAPNSP.ZFUNCIONARIOS    (
           IN PID_FUNCIONARIO INT,
           OUT  PNOME VARCHAR (30),
           OUT PSOBRENOME VARCHAR(70),
           OUT PCARGO VARCHAR(30),
           OUT PSALARIO FLOAT      )  

    AS
           SELECT NOME, SOBRENOME, CARGO, SALARIO
           INTO :PNOME, :PSOBRENOME, :PCARGO, :PSALARIO
           FROM SAPNSP.ZFUNCIONARIO
           WHERE ID_FUNCIONARIO = :PID_FUNCIONARIO;

-- Testa Stored Procedure
  CALL SAPNSP.ZFUNCIONARIOS (1, :PNOME , :PSOBRENOME , :PCARGO , :PSALARIO)

Oracle

create or replace PROCEDURE SAPNSP.ZFUNCIONARIOS
- Cria parametros
(pid_funcionario IN FUNCIONARIOS.ID_FUNCIONARIO%TYPE,
 p_nome OUT FUNCIONARIOS.NOME%TYPE,
 p_sobrenome OUT FUNCIONARIOS.SOBRENOME%TYPE,
 p_cargo OUT FUNCIONARIOS.CARGO%TYPE,
 p_salario OUT FUNCIONARIOS.SALARIO%TYPE
 )
AS
BEGIN
-- Insere dados da query dentro dos parametros de saida
  SELECT NOME, SOBRENOME, CARGO, SALARIO
  INTO p_nome, p_sobrenome, p_cargo, p_salario
  FROM SAPNSP.ZFUNCIONARIO
  WHERE ID_FUNCIONARIO = pid_funcionario;

END;

DB2

-- Cria procedure
CREATE PROCEDURE SAPNSP.ZFUNCIONARIOS
( IN pid_funcionario INTEGER,
  OUT p_nome VARCHAR(30),
  OUT p_sobrenome VARCHAR(70),
  OUT p_cargo VARCHAR(30),
  OUT p_salario DECIMAL(9,2)
 )

P1: BEGIN

  SELECT NOME, SOBRENOME, CARGO, SALARIO
  INTO p_nome, p_sobrenome, p_cargo, p_salario
  FROM SAPNSP.ZFUNCIONARIO
  WHERE ID_FUNCIONARIO = pid_funcionario;

END P1

MSSQL

CREATE PROCEDURE SAPNSP.ZFUNCIONARIOS
   @pfuncionario INT,
   @pnome		 NVarchar(30) OUTPUT,
   @psobrenome	 NVarchar(70) OUTPUT,
   @pcargo	     NVarchar(30) OUTPUT,
   @psalario	 Decimal(9,2) OUTPUT
AS
BEGIN
   SELECT @pnome = Nome,
		  @psobrenome = Sobrenome,
		  @pcargo = Cargo,
		  @psalario = Salario
   FROM SAPNSP.ZFUNCIONARIO
   WHERE ID_Funcionario = @pfuncionario
END

Abap

*&---------------------------------------------------------------------*
*& Report  ZSTOREDPROCEDURE
*&
*&---------------------------------------------------------------------*
*& Desenvolvimento Aberto
*& Native SQL - Stored Procedures - Abap
*&---------------------------------------------------------------------*

REPORT  ZSTOREDPROCEDURE.

* Declara parametros de saida para a procedure
DATA :  pnome      TYPE c LENGTH 30,
        psobrenome TYPE c LENGTH 70,
        pcargo     TYPE c LENGTH 30,
        psalario   TYPE f.

* Declara parametro de entrada para a procedure
PARAMETERS id_func TYPE i.

* Executa Native SQL utilizando os parametros
EXEC SQL.

 EXECUTE PROCEDURE SAPNSP.ZFUNCIONARIOS (IN :id_func, OUT :PNOME , OUT :PSOBRENOME , OUT :PCARGO , OUT :PSALARIO)

ENDEXEC.

* Exibe resultado dos parâmetros
WRITE: / 'Dados Retornados direto do banco SAP MaxDB' Color 5.

skip 2.

WRITE: / 'Código:'    Color 1, id_func,
       / 'Nome:'      Color 1, pnome,
       / 'Sobrenome:' Color 1, psobrenome,
       / 'Cargo:'     Color 1, pcargo,
       / 'Salário:'   Color 1, psalario .
Anúncios

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s