2013-05-10 23 views
14

Dinamik sorgemi dbms_output aracılığıyla hata ayıklamaya çalıştım ancak sorgu dizesi dbms_output arabelleği için çok uzun gibi görünüyor.Dbms_output tamponu nasıl artırılır?

I got:

ORA-06502: PL/SQL: numeric or value error: character string buffer too small 
ORA-06512: at "SYS.DBMS_OUTPUT", line 148 
ORA-06512: at line 1 

konusunda fikrin nasıl tampon boyutunu artırmak için?

+5

Muhtemelen dbms_output kullanarak çok fazla bilgi yazıyor olabilirsiniz. Bunun için tasarlanmamıştır. En iyi seçeneğiniz muhtemelen bu mesajları bir tabloya eklemek ve daha sonra tablodan seçmektir. –

+0

@a_horse_with_no_name: Potansiyel olarak unutulmayacak olaylardan dolayı bir uygulama günlüğü olarak bir veritabanı tablosu kullanmamayı hiç tercih etmemiştim: örneğin, bir uygulama ' t günlüğüne bağlanamadığınız veritabanındaysa uygulamanın bağlanamayacağı veriyi nereye kaydederseniz veritabanına bağlanın mı? Düz dosyalara (PL/SQL'deki UTL_FILE paketini kullanarak) günlükleri yazmayı tercih ediyorum; bu da IMO'nun bir veritabanındaki bir tablodan daha az kullanışsız olma ihtimalidir. YMMV. Paylaş ve Keyfini çıkar. –

+0

@BobJarvis: Bir PL/SQL prosedürünün içinde bunun mantıklı olduğunu düşünüyorum. Düzenli uygulama kodu için (Java, C#, ...) Sana katılıyorum. –

cevap

25

DBMS_OUTPUT'u etkinleştirebilir ve arabellek boyutunu ayarlayabilirsiniz. Tampon boyutu 1 ila 1.000.000 arasında olabilir.

dbms_output.enable(buffer_size IN INTEGER DEFAULT 20000); 
exec dbms_output.enable(1000000); 

kontrol Frank ve Mat tarafından gönderildi yorumun gereğince this

DÜZENLEME

, ayrıca BUFFER_SIZE

exec dbms_output.enable(NULL); 

Null

ile etkinleştirebilirsiniz: Üst sınır, tarafından tesp, tamponlanmış bilgi miktarı. Buffer_size öğesinin NULL olarak ayarlanması, sınır olmaması gerektiğini belirtir. Maksimum boyut 1.000.000'dir ve kullanıcı buffer_size (NOT NULL) belirttiğinde en az 2.000'dir. Tampon boyutu dolduğunda

+0

Aynı hatayı alıyorum. Işe yaramadı.Her neyse, – hsuk

+0

dbms_output işlevini devre dışı bırakmayı deneyin ve ardından maksimum boyutu –

+5

ile etkinleştirin. Ayrıca arabellek boyutunu sınırsız olarak ayarlayabileceğiniz dbms_output.enable (NULL) öğesini de arayabilirsiniz, bkz. Http://docs.oracle.com/cd/B19306_01 /appdev.102/b14258/d_output.htm#i999293 –

3

. Birkaç seçenek vardır deneyebileceğiniz:

1) 1.000.000

2) tampona yazılır verileri filtrelemeyi deneyin için DBMS_OUTPUT tampon boyutunu artırın - muhtemelen orada DBMS_OUTPUT yazar bir döngü ve yapmanız bu verilere gerek yok.

3) Kodunuzdaki çeşitli kontrol noktalarında ENABLE arayın. Her çağrı arabelleği temizler. Alternative to dbms_output.putline @ Tarafından:

DBMS_OUTPUT.ENABLE (NULL) geriye dönük uyumluluk Oracle documentation on dbms_output

aşağıda

create or replace procedure cust_output(input_string in varchar2) 
is 

    out_string_in long default in_string; 
    string_lenth number; 
    loop_count number default 0; 

begin 

    str_len := length(out_string_in); 

    while loop_count < str_len 
    loop 
     dbms_output.put_line(substr(out_string_in, loop_count +1, 255)); 
     loop_count := loop_count +255; 
    end loop; 
end; 

Bağlantı rEF pasajlarını gibi Ayrıca display.something özel çıkış oluşturabilirsiniz için 20000 varsayılan olarak : Alexander

İşte
+3

DBMS_OUTPUT.ENABLE (NULL) parametrenin atlanmasıyla aynı değil. Oracle belgeleri (bağlantıya bakın) açıkça belirtir: "buffer_size Üst sınır, bayt cinsinden, tamponlanan bilginin miktarı. Buffer_size değerini NULL olarak ayarlama, sınır olmaması gerektiğini belirtir." –

+0

Prosedürü şu şekilde değiştirmelisiniz: 'FRE_OUTPUT_REPLACE (input_string in varchar2) out_string_in long default input_string; string_lenth number; loop_count number default 0; başlangıç ​​ string_lenth: = length (out_string_in); loop_count uzay95

0

gitmek:

DECLARE 
BEGIN 
    dbms_output.enable(NULL); -- Disables the limit of DBMS 
    -- Your print here ! 
END;