Domanda

Ho una tabella che contiene una colonna di tipo Numero

create table tmp (
    /*other fields*/
    some_field Number
)

e in uno script SQL PL, voglio convertire questo campo ad un varchar. Tuttavia, non so la sua lunghezza, in modo da ottenere un'eccezione

  

Messaggio di eccezione è ORA-06502:   PL / SQL: errore di valore o numerico:   buffer di stringa di caratteri troppo piccoli

v_some_field varchar(21);
/*...*/
v_some_field := TO_CHAR(some_field,'999999999999999999999');

Come devo dichiarare il buffer di v_some_field? Impostandolo a varchar (32767) sembra abbastanza bruta, c'è qualche alternativa?

È stato utile?

Soluzione

che stai ricevendo un errore non perché il numero è troppo grande, ma perché il risultato della vostra to_char è lungo 22 caratteri (21x "9" + un carattere per il segno):

SQL> DECLARE
  2     some_field   NUMBER := 123;
  3     v_some_field VARCHAR(21);
  4  BEGIN
  5     v_some_field := TO_CHAR(some_field, '999999999999999999999');
  6  END;
  7  /

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

SQL> DECLARE
  2     some_field   NUMBER := 123;
  3     v_some_field VARCHAR(22);
  4  BEGIN
  5     v_some_field := TO_CHAR(some_field, '999999999999999999999');
  6  END;
  7  /

PL/SQL procedure successfully completed

Altri suggerimenti

Si potrebbe determinare la lunghezza massima del varchar2 convertito mediante conversione di un valore negativo con cifre integrali e frazionarie:

set serveroutput on
declare
   n number;
begin
   n := -4/3;
   dbms_output.put_line(length(to_char(n)));
end;
/

L'uscita è 41 per me.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top