2016-04-22 7 views
1
declare 
    v_nr number DEFAULT 12345678944;  
    v_numberWithSpace varchar2(255);  
    v_count number DEFAULT 1;  
begin  
    for i in 1..length(v_nr) loop  
    v_numberWithSpace := v_numberWithSpace ||substr(v_nr, v_count, 4)|| ' .';  
    v_count := v_count + 4; 
    DBMS_OUTPUT.PUT_LINE(v_numberWithSpace);  
    end loop;  
    v_numberWithSpace := substr(v_numberWithSpace,1 , length(v_numberWithSpace) -1);  
end; 

Ich mag die folgende Ausgabe für v_numberwithSpace hat:einfügen Raum in einem String x Zeichen Orakel

Jetzt läßt es Leerzeichen am Ende der Zeichenfolge. Ich habe ein gesetzt. Ad den Code, um es klarer zu machen, was ich meine. Ohne Leerzeichen am Anfang und am Ende. Ich habe versucht this, aber es funktioniert nicht für mich.

+1

Was meinst du mit "funktioniert nicht"? Haben Sie einen Fehler oder ein unerwartetes Ergebnis? – Aleksej

+0

Ihr Block funktioniert, wenn Sie einfach das Semikolon nach dem Deklarieren entfernen; außer Sie Schleife zu oft und drucken Sie die Ausgabe an der falschen Stelle. –

+0

Es lässt Leerzeichen am Ende der Zeichenfolge. Dies liegt an der Schleife. Die Schleife geht in die Länge (v_nr), das ist mehr, als es gehen muss. – ReneJanssen

Antwort

3

Wenn ich Ihre Bedürfnisse verstehe, müssen Sie besser mit der Schleifenbedingung umgehen, Schleifen nicht für die ganze Länge der Startnummer, aber in Betracht ziehen es in Gruppe von 4 Zeichen; außerdem, wenn Sie nur eine Zeichenfolge als Ergebnis benötigen, geht die PUT_LINE der Schleife aus:

declare  
    v_nr number DEFAULT 12345678944;  
    v_numberWithSpace varchar2(255);  
    v_count number DEFAULT 1;  
begin  
    while v_count <= length(v_nr) loop  
    v_numberWithSpace := v_numberWithSpace || substr(v_nr, v_count, 4)|| ' ';  
    v_count := v_count + 4;   
    end loop; 
    DBMS_OUTPUT.PUT_LINE(trim(v_numberWithSpace));   
end; 

Diese geben:

1234 5678 944 
+0

Danke Aleksej! Das hat es für mich getan. – ReneJanssen

4

Die reguläre Ausdruck Lösung von der Frage Tom Sie verlinkten Beitrag zu arbeitet mit triviale Änderung:

select trim(regexp_replace(to_char(12345678944), '(....)', '\1 ')) as result 
from dual; 

RESULT     
------------------------- 
1234 5678 944    

die trim() ist es, weil ein Wert, der ein exaktes Vielfaches von 4 Ziffern ist, würde einen hinteren Raum, der durch die r gegeben werden egex; andere Werte nicht. Die einzige andere Änderung besteht darin, das Muster aus vier statt drei Zeichen zu machen, wobei in den Klammern eine zusätzliche Periode steht.

, die mit ganzen Zahlen jeder Größe arbeitet, wie durch eine Stichprobe gezeigt:

with t (n) as (
    select trunc(dbms_random.value(power(10, level -1), power(10, level))) 
    from dual 
    connect by level <= 20 
) 
select n, 
    trim(regexp_replace(to_char(n), '(....)', '\1 ')) as result, 
    length(trim(regexp_replace(to_char(n), '(....)', '\1 '))) as result_length 
from t; 

        N RESULT     RESULT_LENGTH 
--------------------- ------------------------- ------------- 
        9 9          1 
        45 45         2 
        483 483         3 
       3178 3178         4 
       73389 7338 9        6 
       192365 1923 65        7 
       3662474 3662 474        8 
      97356484 9735 6484        9 
      446571637 4465 7163 7       11 
      9557657854 9557 6578 54       12 
      25608546675 2560 8546 675      13 
     511047589116 5110 4758 9116      14 
     7429787110250 7429 7871 1025 0      16 
     13021942429553 1302 1942 4295 53     17 
     563394031257243 5633 9403 1257 243     18 
    6504958239800949 6504 9582 3980 0949     19 
    84778674020192456 8477 8674 0201 9245 6    21 
    178163119511742275 1781 6311 9511 7422 75    22 
    8473846546814521167 8473 8465 4681 4521 167    23 
95084346610621497023 9508 4346 6106 2149 7023    24 

Ich habe gerade das Ergebnis Länge gezeigt, so dass Sie keine Leerzeichen gibt es zu sehen.