2012-07-01 18 views
6

En PL/SQL, el código siguiente fallará. No permite la definición de tamaño para el parámetro varchar2. ¿Sabes por qué? ¿Cómo lo arreglo?parámetro de función PL/SQL

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

mensaje de error es

1/33 PLS-00103: Encontró el símbolo "(" cuando se esperaba uno de los siguientes:

:. =), @ Carácter% por defecto El símbolo ": =" fue sustituido por "(" para continuar.

Respuesta

9

Lo soluciona quitando la restricción de tamaño. No es ne eded:

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

Supongo que su función es un poco más complicada que esto?

La sintaxis completa para la declaración create functionfrom the documentation es:

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

Hay una gran cantidad de información en tornothe specifics si está interesado, pero se puede encontrar TECH on the Net más útil.


En respuesta a la primera pregunta de por qué no sé y no puedo encontrar una respuesta. Pero to quote APC:

Esto es molesto, pero es la forma en PL/SQL funciona por lo que tenemos que vivir con ella.

En pocas palabras, usted debe saber en tiempo de ejecución cuánto tiempo algo va a ser y poder, por lo tanto, para tratar con él. Hay algunas opciones que puede tener en cuenta sin embargo:

Si sabe cuál es la longitud que desee mensaje a ser usted puede definir una variable, el valor por defecto de los cuales es un substr del parámetro:

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

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

begin 
    return 1; 
end; 

Alternativamente , se puede comprobar la longitud de la propia función:

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

parámetros se declaran con tipos de datos pero sin longitud tipo de datos o de precisión. Eso significa que un parámetro se puede declarar como VARCHAR2 pero no se declarará con un componente de longitud (VARCHAR2 (30) no sería válido).

Cuestiones relacionadas