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
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
Make Orakel split
Funktion, die varray
zurückzukehren. Hier ist V_ARRAY
TYPE V_ARRAY
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;
Warum 'varray' eher als ein normales nt? Warum 1000 speziell? Auch '//' sollte '--' sein –
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`
mehrere Zeilen (mehr als 100) funktioniert nicht – asraful009
@ 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
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
@Utsav Hier ist keine Anforderung, deshalb markiere ich es. – Seyran
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