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 :
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 :
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;
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;
Bom dia Aleksandro. Parabens pelo blog.
ResponderExcluirAs 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
Na versão do Oracle 11.2 com o TopConnect atual consegui executar normalmente.
ExcluirVai depender muito da configuração desse sinonimo, se é publico ou privado.
Tem algum exemplo de como você esta rodando ?