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.
2 – Crie um programa no SAP e utilize o código correspondente.
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 .