Erro Package

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
Avatar do usuário
MuLtAnI
Moderador
Moderador
Mensagens: 90
Registrado em: Ter, 01 Jun 2004 9:21 am
Localização: Videira - SC
Contato:

Olá pessoal....

primeiramente gostaria de desejar um feliz natal e ano novo a todos vocês, atrasado mas "dá nada' hehehehe

também de me desculpar por ficar um tempo sem postar aqui no fórum pois tava fo*a, eu começei os estudos em C# e tive que deixar algumas coisas meio de lado...meu tenho que começar a pensar no meu trabalho de conclusão de curso da faculdade e acho que alguns de vocês sabem doq estou falando...

mas vamos direto ao ponto...seguinte galera, precisei criar um 'emaranhado' de funções para escrever números por extenso, isso em português, pois essa rotina é utilizada para preencher cheques, impressão e tal...oque acontece é o seguinte, criei uma classe que contém os métodos de escrita e compilei em um Package, isso naversão 9i, funcionou supimpa, chamo o pelo

package.funcao(param1, param2) funciona que é uma tetéia, porém esse mesmo código compilei na versão 8.0.5 (usando o TOAD) e quando vou chamar o método ele me retorna o seguinte erro

Selecionar tudo

ORA-06571: A função CHEQUE não garante que a base de dados não seja atualizada
eu procurei nos manuais de erro da Oracle e não encontrei registros...gostaria de saber se alguém de vocês já viu algo do gênero?

vale lembrar que em momento algum do processo eu gravo, ou leio algum valor armazenado no BD eu apenas leio os números e retorno Varchar2.

grato pela atenção!!

[]'s
Avatar do usuário
MuLtAnI
Moderador
Moderador
Mensagens: 90
Registrado em: Ter, 01 Jun 2004 9:21 am
Localização: Videira - SC
Contato:

Dae galera....descobri já o bagulho...

é só trabalhar com os parâmetros

Selecionar tudo

PRAGMA RESTRICT_REFERENCES
que trabalha direto com o compilador do PL

se alguém quiser mais detalhes...

http://www.unix.org.ua/orelly/oracle/ad ... h02_01.htm


[]'s
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Fala meu velho!
Cara, as versões mais antigas do Oracle tinham algumas restrições. Talvez você esteja fazendo alguma coisa que não pode!!!

(por exemplo, antes do 8, não podia dar um RAISE_APPLICATION_ERROR dentro duma stored-procedure...

Veja esse link, talvez te ajude:
http://www.unix.org.ua/orelly/oracle/prog2/ch17_04.htm
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Aqui vai mais umas explicações do Chiappa sobre a tal PRAGMA RESTRICT_REFERENCES:

Selecionar tudo

Bom, o manual "PL/SQL User's Guide and Reference", no cap. 11 - Language Elements, nos diz :

"RESTRICT_REFERENCES Pragma
To be callable from SQL statements, a stored function must obey certain "purity" rules, which are meant to control side effects. (See "Controlling Sides Effects".) If any SQL statement inside the function body violates a rule, you get an error at run time (when the statement is parsed). To check for violations of the rules, you can use the pragma (compiler directive) RESTRICT_REFERENCES. The pragma asserts that a function does not read and/or write database tables and/or package variables. For more information, see Oracle8i Application Developer's Guide - Fundamentals."

numa tradução livre dos pontos principais (grifos a adicionais meus) :

"para ser chamado do SQL a função deve obedecer à algumas regras... Para checar por violações, você pode usar a diretiva...". Ou seja : você só a usa em stored PL/SQLs, e ** SE ** o PL/SQL em questão for chamado a partim de um SQL (ie, de um SELECT). Como ele diz, o objetivo é CHECAR POR VIOLAÇÕES da proibição de leitura/escrita de tabelas, que se ocorrerem você recebe um aviso. Evidentemente , o código-fonte ** NÃO ** será corrigido por sio só automaticamente, esse pragma é um CHECK a mais pro compilador fazer, para você receber msg adicional, mais específica, em tempo de run-time, se ocorrer a violação.

Nos links indicados (e nos manuais de Concepts) reside a explicação : o banco Oracle é quem abre automaticamente a transação quando você faz o primeiro DML, e um SELECT , não abre transação. Se fosse permitido que um PL/SQL chamado de um SELECT fizesse DML de qualquer tipo, haveria a chance inconsistência interna : o SELECT não registrou status de transação mas o PL/SQL por ele chamado fez alteração de status no banco - pau lógico. Em http://asktom.oracle.com/pls/ask/f?p=4950:8:::::F4950_P8_DISPLAYID:503221940653 você acha uma boa discussão a respeito, com vários casos.

Quanto ao tal "erro" que você está recebendo, se você montar no sql*plus um caso SIMPLES, dizendo a versão de banco, dando um programinha de uma dúzia de linhas que faça o que você precisa(e provavelmente usando as tabelas de demo do usuário SCOTT), posso tentar reproduzir e te dizer mais.
Responder
  • Informação