Passare parametri a sottoprogrammi PL/SQL

lunedì 31 dicembre 2007 alle 31:25 | Pubblicato su Diario, PL/SQL | 1 commento

Sotto titolo: Errore nella documentazione del package UTL_FILE

Ultimo post dell’anno. Oggi è toccato a me presidiare l’ufficio nell’eventualità di emergenze dell’ultimo giorno dell’anno. Sperando non accada nulla trovo il tempo per quest’ultimo post. Recentemente non sono riuscito a scrivere molto a causa di lavori di manutenzione edilizia a casa che mi hanno impegnato notevolmente.

Pochi giorni fa, scrivendo una procedure in PL/SQL mi sono scontrato con una mia carenza che però mi pare anche una carenza della documentazione Oracle. Stando alla documentazione un sotto-programma PL/SQL, fra cui dovrebbero rientrare procedure e funzioni, si può invocare passando i parametri i tre modalità:

  1. secondo l’ordine,
  2. per nome (uso di =>)
  3. mista .

Ora, non ne ho ancora trovato riscontro nella documentazione, ma nel caso di funzioni pare che l’unica modalità valida sia la prima, ovvero quella posizionale. Se si prova la modalità per nome si riceve l’errore:

ERRORE alla riga 2:
ORA-00907: parentesi chiusa mancante

Devo precisare che il problema che ho riscontrato è stato con la versione 9iR2 di Oracle.

Per farla breve dovevo fare una procedura di caricamento dati da un file di testo, a tal scopo ho usato le “External Tables”, però non volendo modificarne la definizione dinamicamento ho scritto una procedura che riceve in input il nome del file come viene passato (ogni volta il file ha un nome diverso) e come fase preliminare lo copia con il nome usato nella definizione della tabella esterna. Per fare ciò ho utilizzato il “sotto-programma” FCOPY del package UTL_FILE. Ho scritto “sotto-programma” perchè mentre nella documentazione 9iR2 si parla di funzione, in 10gR2 FCOPY è diventato procedura. In realtà in 9iR2 andando a vedere la definzione del package di scopre che si tratta di procedura. Stando alla documentazione attuale della versione 10gR2 la procedura è così definita:



UTL_FILE.FCOPY (
   location   IN VARCHAR2,
   filename   IN VARCHAR2,
   dest_dir   IN VARCHAR2,
   dest_file  IN VARCHAR2,
   start_line IN PLS_INTEGER DEFAULT 1,
   end_line   IN PLS_INTEGER DEFAULT NULL);
 
Se però si va a vedere la definizione del package UTL_FILE nello schema SYS, si trova:
 
/*
** FCOPY - Copy all or part of a file to a new file.
**
** IN  location     - source directory of file
** IN  filename     - source file name (including extention)
** IN  dest_dir     - destination directory of file
** IN  dest_file    - destination file name (including extention)
** IN  start_line   - line number from which to begin copying, default is
**                         1 referring to the first line in the file
** IN  end_line     - line number from which to end copying, default is NULL
**                         referring to end-of-file
** EXCEPTIONS
**   invalid_path      - not a valid file handle
**   invalid_filename  - file not found or file name is NULL
**   invalid_lineno    - bad start_line or end_line value
*/
PROCEDURE fcopy(src_location  IN VARCHAR2,
src_filename  IN VARCHAR2,
dest_location IN VARCHAR2,
dest_filename IN VARCHAR2,
start_line    IN BINARY_INTEGER DEFAULT 1,
end_line      IN BINARY_INTEGER DEFAULT NULL);
PRAGMA RESTRICT_REFERENCES(fcopy, WNDS, RNDS, TRUST);
 

 

E in 9iR2 è identica. Quindi i nomi dei parametri nella documentazione sono sbagliati e se si cerca di usare tale procedura passando i parametri con la notazione per nome (utl_file.fcopy(location=>’DIR’ ….) si otterrà l’errore:



ERRORE alla riga 1:
ORA-06550: riga 1, colonna 22:
PLS-00201: l'identificativo 'LOCATION' deve essere dichiarato
ORA-06550: riga 1, colonna 7:
PL/SQL: Statement ignored

 

Devo precisare che grazie alla decisione di documentare qui questo errore della documentazione Oracle mi sono accorto che non avevo del tutto capito quanto c’era di sbagliato. In un primo momento avevo pensato che veramente FCOPY in 9iR2 fosse una funzione poi trasformata in procedura nella 10gR2. Invece si è trattato solo di una correzione (parziale) della documentazione.

1 commento »

RSS feed for comments on this post. TrackBack URI

  1. Direi proprio che Oracle ha “cannato” la documentazione. Comunque per curiosità sono andato a vedere il discorso della modalità di chiamata delle funzioni, e mi pareva strano che mancasse la specifica esatta sulle funzioni.
    L’ho trovata nella documentazione di Oracle9i (c’è la stessa frasetta anche nella documentazione di Oracle10g) nell’ebook: “Application Developer’s Guide – Fundamentals (A96590-01)”, a pag. 9-53:

    “Arguments
    To pass any number of arguments to a function, supply the arguments within the parentheses. You must use positional notation; named notation is not currently supported. For functions that do not accept arguments, use ().”

    Bisogna dire tuttavia che il compito svolto da UTLFILE.FCOPY non è propriamente da funzione; le funzioni devono ritornare un valore e sono utilizzabili all’interno di normali SQL (non necessariamente da PL/SQL).


Lascia un commento

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...

Blog su WordPress.com.
Entries e commenti feeds.

%d blogger cliccano Mi Piace per questo: