2013-07-16 1224 views
5

Non so se mi manca qualcosa, ma quello che sto facendo è:PL/SQL: errore di valore o numerico: carattere buffer di stringa troppo piccolo% ROWTYPE

Ho una funzione che restituisce un ROWTYPE

FUNCTION myFunc(pChar CHAR) RETURN myTable%ROWTYPE AS 
    myTable_rec myTable%ROWTYPE; 
    BEGIN 
    SELECT col1, col2, col3 
    INTO myTable_rec.col1 
     , myTable_rec.col2 
     , myTable_rec.col3 
    FROM myTable 
    WHERE col4 = pChar; 

    RETURN(myTable_rec); 
    END B001_03; 

poi nella mia procedura (che chiama la funzione di cui sopra), ho dichiarato:

myTable_rec myTable%ROWTYPE; 

ma quando chiamo nella procedura:

... 
myTable_rec := myFunc(someChar); 
... 

ottengo

ORA-06502: PL/SQL: numeric or value error: character string buffer too small 

non sono i campi supposti di essere dalla stessa tabella e dello stesso tipo di dati (come la mia scarsa conoscenza)?

MODIFICA: Ho provato a selezionare * e ogni lavoro. Mi manca sicuramente qualcosa qui. Semplicemente non lo so.

+0

perché non usi Varchar2 invece di Char? –

+0

wow che ha davvero risolto il problema. Metti una risposta e la segnerò come risposta migliore, signore. Ciò che mi dà davvero fastidio è che "someChar" viene interrogato dalla stessa colonna E della tabella, quindi mi aspettavo che avesse lo stesso tipo di dati e la stessa lunghezza di col4. – Incognito

risposta

5

Scommetto che il problema deriva dall'utilizzo di Char che è una stringa di lunghezza fissa. Non sei sicuro di dove, ma da qualche parte nel tuo codice provi a mettere una stringa Char o varchar2 di lunghezza N in un carattere di lunghezza M dove M> N.

3

Stavo ricevendo questo errore mentre accedevo a Oracle SP tramite il mio codice .Net . Se qualcuno si trova di fronte a questo errore, per lui/lei specificare la dimensione del parametro di input/output potrebbe aiutare a risolvere il problema.

codice di esempio va in questo modo:

OracleParameter oparamProjectId = mycom.Parameters.Add (. "P_open_flag", OracleDbType Varchar2); oparamProjectId.Direction = ParameterDirection.Output; oparamProjectId.Size = 100;

+0

Perfetto! Dopo tanto tempo cercando di trovare l'errore, finalmente so perché. Grazie mille! –