Newsgroup: it.comp.software.database
Titolo: [Oracle9i] prima esperienza con un package... problema nell'eseguire una sua funzione

Sto definendo un package con un metodo che dovrebbe controllare se esiste
qualche record in una tabella I_RUOLO con l'attributo CODICE che corrisponde
ad un codice dato in input.
create package DATABANKER_RUOLI AS
  function esisteRuolo(codRuolo in NUMBER) return INTEGER;
end DATABANKER_RUOLI;
create package body DATABANKER_RUOLI AS
 
   function esisteRuolo(codRuolo in NUMBER) return INTEGER IS
      valBool INTEGER;  
   BEGIN
      select count(CODICE) INTO valBool
      from I_RUOLO
      where CODICE = codRuolo;
      RETURN(valBool);
   END esisteRuolo;
end DATABANKER_RUOLI;
Nello schema/account compare il package sia come specifica che come 
corpo ma ho problemi ad eseguirlo.
Per esempio provo a vedere se in I_RUOLO esiste qualche ruolo che 
ha per codice il valore 1...
SQL> execute DATABANKER_RUOLI.esisteRuolo(1);
BEGIN DATABANKER_RUOLI.esisteRuolo(1); END;
      *
ERRORE alla riga 1:
ORA-06550: riga 1, colonna 7:
PLS-00221: 'ESISTERUOLO' non č una procedura oppure non č definita
ORA-06550: riga 1, colonna 7:
PL/SQL: Statement ignored
Da cosa dipende l'errore che mi viene segnalato? Mi dice che 
'ESISTERUOLO' non č una procedura ma a me sembra di aver definito
una funzione, non riesco a venirne fuori, come posso risolvere?


sei il proprietario dello schema, giri all'interno del tuo schema ?
l'exec l'hai fatto con lo stesso user che possiede l'oggetto pkg ?
felice_pago
--------------------------------
Inviato via 
http://usenet.libero.it

grant execute on DATABANKER_RUOLI to "nomeSchema"
"Gil-galad" <gilgalad@eldar_valar.invalid> wrote in message
news:7_3Fa.74273$lK4.2...@twister1.libero.it...


 grant execute on DATABANKER_RUOLI to "nomeSchema"
ho sia il privilegio create procedure che quello
execute any procedure
Pero' se provo ad inserire la chiamata in un blocco PL/SQL 
in questo modo...
declare
   val INTEGER;
begin
   val := DATABANKER_RUOLI.esisteRuolo(1);
end;
/
mi risponde: Procedura PL/SQL completata correttamente.
A questo punto pero' vorrei visualizzare il valore che assume val,
come posso fare?
Ho provato ad inserire il valore di val in una tabella ad hoc e
mi sono assicurato che il valore restituito dalla funzione e'
proprio quello che mi aspettavo, ma vorrei evitare di usare una
tabella per visualizzare un valore ^_^
Ancora una domanda...
PL/SQL non prevede un tipo Boolean vero?

 l'exec l'hai fatto con lo stesso user che possiede l'oggetto pkg ?
si

Ciao,
Oracle ti risponde correttamente; ogni volta che esegui una funzione DEVI
necessariamente memorizzarne il valore in qualche modo; non si tratta di un
problema relativo a grant, visibilità del package o simile.
La parte di errore che ti riguarda è "non è una procedura".
Che senso ha lanciare una funzione che restituisce un dato se poi non lo
usi?
Lanciarla in un blocco plsql (come hai scritto in un messaggio successivo)
invece ha più senso, perchè con quel valore poi potrai fare altri calcoli.
Un piccolo esempio (riscrivo anche una parte del package per comodità, anche
se non avendo Oracle a tiro non posso provarlo - scusa gli eventuali errori
insomma):
create package DATABANKER_RUOLI AS
  function DATABANKER_RUOLI.esisteRuolo(codRuolo in NUMBER) return BOOLEAN;
end DATABANKER_RUOLI;
create package body DATABANKER_RUOLI AS
   function esisteRuolo(codRuolo in NUMBER) return BOOLEAN IS
      valBool INTEGER;
   BEGIN
      select count(CODICE) INTO valBool
      from I_RUOLO
      where CODICE = codRuolo;
      RETURN(valBool = 1);
   END esisteRuolo;
end DATABANKER_RUOLI;
---
declare
  iRuolo NUMBER;
begin
  iRuolo := 5;
  dbms_output.enable(500);
  if DATABANKER_RUOLI.esisteRuolo(iRuolo) then
    dbms_output.put_line('Il ruolo ' || to_char(iRuolo) || ' risulta essere
presente sul database');
  else
    dbms_output.put_line('Il ruolo ' || to_char(iRuolo) || ' non risulta
essere presente sul database.');
  end if;
  dbms_output.disable;
end;
Nota: a meno che tu non esegua la procedura da un tool che cattura il
dbms_output (tipo pl/sql developer o toad, anche se ti consiglio caldamente
il primo dei due) il blocco di esecuzione alla fine ti riporterà soltanto un
"procedura terminata correttamente", senza scrivere nulla.
Saluti,
Ender

 dbms_output
Era quello che cercavo, ti ringrazio.