segunda-feira, 27 de janeiro de 2014

ORACLE-Executar procedure do Oracle com o ADVPL

Como executar uma function e uma procedure do Oracle através de comandos ADVPL

Muitas vezes temos programas que são compilados no Oracle e surge a necessidade de compartilhar no Protheus.

Também por questão de performance podemos utilizar procedures ou functions rodando diretamente pelo banco.

Principais vantagens :

  • Compartilhamento de programas entre o Protheus e outras rotinas do banco
  • Melhor performance do processamento, o Protheus não acessa o banco diretamente, ele utiliza o Top Connect.
Então vamos lá.

Primeiramente precisamos de uma função compilada no Protheus retornando algum resultado. Exemplo de uma função siga o link. Como criar function e procedures.

No Protheus, chamar desta forma :

User function xRNbs(IdeProduto)
Local cQuery        :=""
Local rNbs          :=""

// Preenche a Query
cQuery := "SELECT MINHAFUNCAO(" + AllTrim(IdeProduto) + ") CODNBS FROM DUAL"

If Select("QRY") > 0
       QRY->( dbCloseArea() )
EndIf

dbUseArea( .T., "TopConn", TCGenQry(,,cQuery), "QRY", .F., .F. ) /// Abre a conexao

rNbs   := QRY->CODNBS
If Select("QRY") > 0
       QRY->( dbCloseArea() )
EndIf

// Retorna o custo do produto

Return rNbs

Esta não é a única forma de chamar o resultado de uma função no Protheus, é a que mais utilizo. Por questão de performance um excesso de chamadas na tabela DUAL, pode fazer aparecer esta tabela em seus relatórios de estatísticas do ORACLE como o AWR. Mas isso digo em um excesso, como deixar esta função dentro de um laço ou um for.

Executando uma procedure

TCSPEXEC("SF7_EXCECAO",QPED->C6_FILIAL,AllTrim(QPED->C6_PRODUTO),QPED->C5_TIPOCLI,QPED->C5_CLIENTE,QPED->C5_LOJACLI)

No exemplo acima, o Protheus chama a procedure SF7_EXCECAO que já esta compilada no banco de dados.
O primeiro parâmetro, é o nome da procedure, os demais são parâmetros da própria função compilada.

Limitações

Não é possível chamar uma function ou procedure dentro de uma Package.
Caso for necessário, crie uma function ou procedure chamando sua Package.

Verifique também os acessos e todos os grants para o usuário do Protheus dentro do ORACLE

EXEMPLO :
GRANT EXECUTE ON MICROSIGA.SF7_EXCECAO TO USUARIO_QUE_RODA_O_PROTHEUS;

2 comentários:

  1. Bom dia Aleksandro. Parabens pelo blog.
    As procedures que são sinonimos de outro banco eu consigo executar via ADVPL ou elas entram dentro do que você chamou de PACKGES?

    Grato

    Jorge H

    ResponderExcluir
    Respostas
    1. Na versão do Oracle 11.2 com o TopConnect atual consegui executar normalmente.
      Vai depender muito da configuração desse sinonimo, se é publico ou privado.
      Tem algum exemplo de como você esta rodando ?

      Excluir