2017-05-01 2 views
-3

Wie String geteilt durch neue Zeile oder andere char StringOracle PL/SQL durch neue Linie geteilt

ABC|123 
xyz|098 

Um

ABC --- 123 
xyz --- 098 
+0

Ihre Anforderung ist nicht sehr klar. Also 'ABC --- 123' ist ein einzelner String-Ausgang? Warum nicht einfach 'select replace (column, '|', '---') von Ihrem Tisch verwenden? ' – Utsav

+0

@Utsav Hier ist keine Anforderung, deshalb markiere ich es. – Seyran

+0

Das ist unklar. Sie scheinen zwei Spalten zu zeigen, nicht nur einen einzelnen Zeichenfolgenwert. Müssen Sie BEIDE und vielleicht auf eine koordinierte Weise teilen? Was ist, wenn die Werte in den beiden Spalten (in den gleichen ursprünglichen Zeilen) nicht die gleiche Anzahl von Zeilenvorschubzeichen haben? Müssen Sie verfolgen, welche Linie zuerst war und welche Sekunde? - Ich biete dies nur als Beispiel an, dass Sie Ihrer Anfrage viel mehr Details hinzufügen müssen. Bis dahin empfehle ich das Schließen als unklar. – mathguy

Antwort

0

Make Orakel split Funktion, die varray zurückzukehren. Hier ist V_ARRAY

  1. erstellen TYPE V_ARRAY
  2. geben danach split Funktion erstellen, die Rückkehr V_ARRAY

CREATE OR REPLACE TYPE V_ARRAY AS VARRAY(1000) OF VARCHAR2(4000); 

CREATE or REPLACE function split(str varchar2, patt varchar2) 
RETURN v_array as 
    s BINARY_integer; 
    e BINARY_integer; 
    i BINARY_integer; 
    token v_array; 
begin 
    token := v_array(); 
    i :=1; 
    s := 0; 
    e := INSTR(str, patt); 
    while(e > 0) loop 
     token.extend; // add new varchar2 
     token(i) := substr(str, s+1, e-s-1); 
     s := e; 
     e := INSTR(str, patt, s+1); 
     i := i + 1; 
    end loop; 
    token.extend; 
    token(i) := substr(str, s+1, length(str) -1); 
    return token; 
end; 


E xample

declare 
    str varchar(10000); 
    line varchar(10000); 
    lines v_array; 
    subs v_array; 
begin 
    str := 'ABCe123';--|| chr(10) ||'xyz|098'; 
    lines := split(str, chr(10)); 
    --DBMS_OUTPUT.PUT_LINE(lines.count); 
    for i in 1.. lines.count loop 
    line := lines(i); 
    -- DBMS_OUTPUT.PUT_LINE('line :' || line); 
    subs := split(line, '|'); 
    -- DBMS_OUTPUT.PUT_LINE(subs.count); 
    DBMS_OUTPUT.PUT_LINE(subs(1) || '---' || subs(1)); 
    end loop;  
end; 

ref: A function to split, loop through

+0

Warum 'varray' eher als ein normales nt? Warum 1000 speziell? Auch '//' sollte '--' sein –

1

Versuchen regexp_substr Funktion ...

select regexp_substr('ABC|123','[^|]+',1,1) part1, regexp_substr('ABC|123','[^|]+',1,2) part2 from dual

Und bei neue Linie (CR/LF) es aussehen würde, so:

`regexp_substr(mystr,'[^('||chr(13)||chr(10)||')]+',1,1) part1, 
    regexp_substr(mystr,'[^('||chr(13)||chr(10)||')]+',1,2) part2` 
+0

mehrere Zeilen (mehr als 100) funktioniert nicht – asraful009

+0

@ asraful009 was meinst du 'nicht funktioniert'? Ihre Problembeschreibung gibt zu wenig Details (daher Ihr negatives Ergebnis). Es ist nicht klar, was genau du erreichen willst ... zum Beispiel 'trim auswählen (regexp_substr (mystr, '[^ (' || chr (13) || chr (10) || ']]', 1 , level)) teile aus dual connect nach level <100 'zerbrechen die string in 99 rows (funktioniert es für dich?), oder wenn du durch 'regexp_substr (|| chr (13) || chr (10) || ')] +', 1, i) ', du kannst den 'i'-Teil der Zeichenkette erhalten (egal ob es mehr als 100 ist oder nicht). Also, verfeinern Sie bitte Ihre Frage - geben Sie weitere Beispiele – Plirkee