2012-07-01 13 views
6

In PL/SQL, il codice riportato di seguito non funzionerà. Non consente la definizione della dimensione per il parametro varchar2. Sai perché? Come lo aggiusto?Parametro funzione PL/SQL

create or replace function logMessage(msg varchar2(2000)) 
return number as 
begin 
    null;  
    return 1; 
end logMessage; 
/

messaggio di errore è

1/33 PLS-00103: incontrato il simbolo "(" quando prevedono una delle seguenti opzioni:

:. =), Carattere @% di default il simbolo ": =", sostituito da "(" per continuare

risposta

9

a risolvere il problema rimuovendo il vincolo di dimensioni non è ne.. eded:

create or replace function logMessage (msg in varchar2) 
return number is 
begin 
    null;  
    return 1; 
end logMessage; 
/

Immagino che la tua funzione sia leggermente più complicata di questa?

La sintassi completa per il create function dichiarazione from the documentation è:

CREATE [OR REPLACE] FUNCTION [Owner.]FunctionName 
    [(arguments [IN|OUT|IN OUT][NOCOPY] DataType [DEFAULT expr][,...])] 
    RETURN DataType [InvokerRightsClause] [DETERMINISTIC] 
    {IS|AS} 

C'è un sacco di informazioni in tutto the specifics se siete interessati, ma si possono trovare TECH on the Net più utile.


In risposta alla tua prima domanda di perché non so e non riesce a trovare una risposta. Ma to quote APC:

Questo è fastidioso, ma è il modo in PL/SQL funziona così dobbiamo vivere con esso.

In parole povere, si dovrebbe sapere a run-time per quanto tempo qualcosa sta per essere ed essere in grado, quindi, a che fare con esso. Ci sono alcune opzioni che si possono prendere in considerazione però:

Se sai cosa lunghezza desiderata messaggio per essere che si può definire una variabile, il valore di default dei quali è un substr del parametro:

create or replace function logmessage (msg in varchar2) return number is 

    l_msg varchar2(2000) := substr(msg,1,2000); 

begin 
    return 1; 
end; 

alternativa , è possibile controllare la lunghezza nella funzione stessa:

create or replace function logmessage (msg in varchar2) return number is 

begin 

    if length(msg) > 2000 then 
     return 0; 
    end if; 

    return 1; 
end; 
3

I parametri sono dichiarati con tipi di dati ma senza lunghezza o precisione del tipo di dati. Ciò significa che un parametro può essere dichiarato come VARCHAR2 ma non verrà dichiarato con un componente di lunghezza (VARCHAR2 (30) non sarebbe valido).