Fråga : Räkna teckenlängden av ett långt sätta in - felet

Hi den pröva I-förmiddagen att räkna längden av sätter in som är av en lång datatyp.  Jag skrev en fungera som kallades find_length2 och I-appellen det från ett annat tillvägagångssätt.  Det fungerar, men slutligen fel, efter 500.000 plus har rott och något att säga ”ORA-06502: PL/SQL: numeriskt eller värdera felet”.  Behaga förmiddagen för help.

I inneslutar en kopiera av find_lenthen, fungerar och förmiddagen för tillvägagångssätt I genom att använda till appellen som den, längden för below.

Thanks much.

Find fungerar:
CREATE eller BYTER UT fungerar LÅNGT för number
IS
för
RETURN för Find_Length2
(geo_log_id numrerar), long_var;
BEGIN
VÄLJER long_desc IN I long_var
FRÅN logs
VAR log_id = geo_log_id; (long_var) återgång längd för
;
END;
/
Procdure till appellen fungera:
CREATE ELLER BYTER UT log_id för is
för den TILLVÄGAGÅNGSSÄTTGEO_COUNT_DB_LONG_SIZE
is
cursor log_id_cursoren vald från logs
var sti_casetype in (
väljer sti_casetype
från ford_acs_casetypes
var transition_phasen = 'DB'
och br/> för ford_contact_type_cd<>'B'<); local_log_id för
numrerar; long_desc_length för
/* numrerar (20.0); long_desc_length för */
numrerar;
begin
öppnar log_id_cursor; fetchlog_id_cursor för
in i local_log_id; för stunder log_id_cursor%found
för
vald (local_log_id)/> in i long_desc_length från loggar VAR LOG_ID = local_log_id; mellanlägget för
in i geo_field_count2 (case_noen, field_size), värderar (local_log_id, long_desc_length);
begår; fetchlog_id_cursor för
in i local_log_id;
avslutar kretsar;
avslutar;
/

Error som möts når det har varit lyckad på 500.000 plus, ror: truncate

SQL> bordlägger geo_field_count2;

Table truncated.

SQL> exec geo_count_db_long_size;
BEGIN geo_count_db_long_size; AVSLUTA;

*
ERROR på fodrar 1:
ORA-06502: PL/SQL: numeriskt eller värdera error
ORA-06512: fodra 7
ORA-06512 på ”SCOPUS1_APP.FIND_LENGTH2 " : fodra 19
ORA-06512 på ”för SCOPUS1_APP.GEO_COUNT_DB_LONG_SIZE ": på fodra



för 1


SQL> " klar "

Svar : Räkna teckenlängden av ett långt sätta in - felet

ja vi kan bestämt göra det, men för det l5At oss tillfoga testar/loggar meddelanden till fungera för fel kodifierar, som väl till unerstand, som fodrar, ger felet. Använd det nedanfört kodifierar en utföra testa igen och ger mig som loggameddelandet tillverkar vad du får på avskärma.

SKAPA ELLER BYT UT TILLVÄGAGÅNGSSÄTTET GEO_COUNT_DB_LONG_SIZE
är
markörlog_id_cursoren är
  välj to_char (log_id) från loggar
        var sti_casetype in (
                                      välj sti_casetype
                                            från ford_acs_casetypes
                                            var transition_phase = ”DB”,
                                            );
  local_log_id numrerar;
  -/*long_desc_length numrerar (20.0); *
  long_desc_length numrerar;
  my_err varchar2 (100);
börja
  öppna log_id_cursoren;
  hämta log_id_cursoren in i local_log_id;
   my_err: = ' efter fetch';
          stunder log_id_cursor%found
           kretsa
      my_err: = ' för fungera appellen för att få length';
  vald find_length3 (local_log_id) in i long_desc_length från loggar VAR LOG_ID = local_log_id;
      my_err: = ' efter fungera appellen för att få length';
          sätt in in i geo_field_count2 (case_noen, field_size), värderar (local_log_id, long_desc_length);
      my_err: = ' efter mellanlägg till annan table';
       begå;
      hämta log_id_cursoren in i local_log_id;
   avsluta kretsar;
undantag när andra därefter
dbms_output.put_line ('mig förmiddag i undantag: ',|| my_err);
dbms_output.put_line ('fel: ',||sqlerrm);
dbms_output.put_line (”felet kodifierar: ”, || sqlcode);
avsluta;
/,

skapa eller byt ut fungerar Find_Length3 (geo_log_id numrerar),
  retur numrerar
är
  clob x;
  y long;
  my_err varchar2 (100);
börja
  dbms_lob.createtemporary (x som, är falska);
my_err: = ' FUNGERA: efter createtemporary';
  vald long_desc in i y från loggar var log_id = geo_log_id;
my_err: = ' FUNGERA: efter select';
   x: = to_clob (y);
my_err: = ' FUNGERA: efter to_clob';
  återgång dbms_lob.getlength (x);
my_err: = ' FUNGERA: efter getlength';
 dbms_lob.freetemporary (x); --> notera, detta som ska för att inte få utfört som
-- detta är efter återgångmeddelande.

undantag
  när andra därefter
dbms_output.put_line ('insida fungerar undantag: ',|| my_err);
dbms_output.put_line ('insida fungerar fel: ',||sqlerrm);
dbms_output.put_line (”insida fungerar fel kodifierar: ”, || sqlcode);
avsluta;
/,
Andra lösningar  
 
programming4us programming4us