Pergunta

Estou tentando criar um procedimento armazenado externo em um IBM I (V5R4), mas estou recebendo um erro quando tento executá -lo.

Tudo o que quero fazer é ligar para um programa de RPG, sem passar por parâmetros ou se preocupar em devolver quaisquer dados. Desculpe, eu não sou um programador de RPG ou um especialista no IBM I, para que eu possa estar perdendo algo muito simples.

O SQL para criar o procedimento:

CREATE PROCEDURE SOMELIB.SOMEPROC ( ) 

    LANGUAGE RPGLE 

    NOT DETERMINISTIC 

    NO SQL
    EXTERNAL NAME 'OTHERLIB/SOMERG' 

    PARAMETER STYLE GENERAL; 

O erro que recebo ao executar ligue para Somelib.omeproc () é:

Estado SQL: 38501
Código do fornecedor: -443
Mensagem: [CEE9901] Erro do aplicativo. RNX1216 Não monitorado pelo BB1002RG na declaração 2100000001, instrução x'0000 '. Causa . . . . . : O aplicativo terminou de forma anormal porque ocorreu uma exceção e não foi tratada. O nome do programa ao qual a exceção não tratada é enviada é Somerg Somerg. O programa foi interrompido no (s) número (s) de declaração de idiomas de alto nível no momento em que a mensagem foi enviada. Se mais de um número de declaração for mostrado, o programa será um programa de ILE otimizado. A otimização não permite que um único número de declaração seja determinado. Se *n é mostrado como um valor, significa que o valor real não estava disponível. Recuperação . . . : Consulte as mensagens de baixo nível listadas anteriormente para localizar a causa da exceção. Corrija todos os erros e tente a solicitação novamente.

Foi útil?

Solução

Seu procedimento está chamando o programa de RPG sem o conjunto de listas de bibliotecas. Você pode fazer uma das duas coisas:

1) Altere a especificação F no programa RPG para qualificar a biblioteca usando a palavra-chave extfile.

2) Ligue para um programa CL do procedimento armazenado que adiciona a biblioteca apropriada à lista da biblioteca, certificando -se de permitir o fato de que a biblioteca já pode estar lá de uma chamada anterior. Em seguida, peça ao programa CL que ligue para o programa RPG.

Outras dicas

(Solução um pouco mais rude) Identifique o usuário que inicia o procedimento armazenado. Altere a descrição do JobDescription para ter a lista de biblioteca correta.

Mas na minha experiência é o programa CL a solução mais pragmática também.

Supondo que o arquivo esteja na mesma biblioteca que o programa, adicione EXTFILE(variablename) e USROPN para o F-Spec. Pegue o nome da biblioteca dos PSDs e construa o variablename valor antes de você OPEN o arquivo.

Se o arquivo e o programa estiverem em diferentes bibliotecas, você poderá criar uma área de dados na biblioteca do programa para manter o nome da biblioteca de dados. Recupere a área de dados (usando o PSDS) em vez de usar o PSDS (para a biblioteca de arquivos). Se o programa e o arquivo não forem mantidos juntos, pode ser uma boa idéia manter o nome da biblioteca de dados em um objeto externo que pode ser alterado em vez de recompilar.

(Na verdade, raramente usei áreas de dados nos últimos dez anos. Em vez disso, crio um índice de usuário. Cada entrada no *USRIDX substitui uma área de dados. As entradas são digitadas por um valor que costumava ser uma área de dados Nome. Um objeto substitui muitos outros e um procedimento pode gerenciar todas as entradas. Um objeto para possuir e autorizar reduz algumas despesas gerais do sistema.)

Uma sugestão para se livrar desse problema: faça o perfil do usuário Jobd contém todas as bibliotecas necessárias pelo procedimento armazenado.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top