рдЖрдкрдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИ!
рдореИрдВ рдкреАрдПрд▓ / рдПрд╕рдХреНрдпреВрдПрд▓ рдбреЗрд╡рд▓рдкрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реВрдВред рд╕рд┐рд╕реНрдЯрдо рд▓реЛрдб рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдбреЗрдЯрд╛ рдПрдХрддреНрд░ рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░реНрдп рд╣реИред рдХреБрдЫ рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬреЛ рдЖрдИрдбреА рдХреА рд╕реВрдЪреА рд╡рд╛рд▓реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред
1,2,3,4тАж1001,1002,1003тАж
рдХрд╛рд░реНрдп рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реИред рддрддреНрд╡реЛрдВ рдореЗрдВ рдРрд╕реА рд░реЗрдЦрд╛ рдХреЛ рддреЛрдбрд╝рдирд╛ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдкреВрд░реНрдгрд╛рдВрдХ рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рд▓рд┐рдЦрдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред
рдЪрд▓рд┐рдП рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред
рдкрд╣рд▓реЗ рдЖрдкрдХреЛ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЖрдЗрдП рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦреЗрдВ рдЬреЛ рдХреЙрдорд╛ рджреНрд╡рд╛рд░рд╛ рдЕрд▓рдЧ рдХрд┐рдП рдЧрдП рдирдВрдмрд░реЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИред рд╣рдо рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдПрдХ рдкреВрд░реНрдгрд╛рдВрдХ рддрд░реНрдХ рдПрди рдкрд╛рд╕ рдХрд░реЗрдВрдЧреЗ - рдЕрдиреБрдХреНрд░рдо рдореЗрдВ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ред
рд╣рдо рд╕реНрдорд╛рд░реНрдЯ рдирд╣реАрдВ рд╣реЛрдВрдЧреЗ, рд╣рдо VARCHAR2 рдХреЗ рд╕рд╛рде рдЕрдиреБрдХреНрд░рдо рдХрд░реЗрдВрдЧреЗ, рди рдХрд┐ CLOBред рдЕрдЧрд▓рд╛, рдореИрдВ рд╕рдордЭрд╛рдКрдВрдЧрд╛ рдХрд┐ рдХреНрдпреЛрдВ VARCHAR2ред
рдЕрдиреБрдХреНрд░рдо рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝рдВрдХреНрд╢рди рдХреЛрдб:
CREATE OR REPLACE FUNCTION createNumbers(v_N IN PLS_INTEGER) RETURN VARCHAR2 IS v_str VARCHAR2(4000) := '0'; too_small EXCEPTION; PRAGMA EXCEPTION_INIT(too_small, -6502); BEGIN FOR i IN 1..v_N LOOP BEGIN v_str := v_str || ',' || TO_CHAR(i); EXCEPTION WHEN too_small THEN EXIT; END; END LOOP; RETURN v_str || ','; END;
рдЖрдЗрдП рдЕрдкрдиреЗ рдХрд╛рдо рдкрд░ рд╡рд╛рдкрд╕ рд▓реМрдЯрддреЗ рд╣реИрдВред
рдкрд╣рд▓реА рдмрд╛рдд рдЬреЛ рдорди рдореЗрдВ рдЖрддреА рд╣реИ рд╡рд╣ рд▓рд╛рдЗрди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд▓реВрдк рдХрд░рдирд╛ рд╣реИ, рдкреНрд░рддреНрдпреЗрдХ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдкрд░ рд▓рд╛рдЗрди рдХреА рд▓рдВрдмрд╛рдИ рдХреЛ рдХрдо рдХрд░рдирд╛ред рдЪреВрдВрдХрд┐, рд╕рдорд╕реНрдпрд╛ рдХреА рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдкрд░рд┐рдгрд╛рдо рдХреЛ рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рд╣рдо рдЗрд╕реА рд╕рдВрдЧреНрд░рд╣ рдХреЛ рдмрдирд╛рдПрдВрдЧреЗред
DECLARE v_N PLS_INTEGER := 1000; v_str VARCHAR2(4000) := createNumbers(v_N => v_N); TYPE tab_number IS TABLE OF NUMBER(5); t_str tab_number := tab_number(); BEGIN WHILE v_str IS NOT NULL LOOP t_str.EXTEND; t_str(t_str.COUNT) := SUBSTR(v_str, 1, INSTR(v_str, ',', 1) - 1); v_str := SUBSTR(v_str, INSTR(v_str, ',', 1) + 1); END LOOP; FOR i IN t_str.FIRST..t_str.LAST LOOP dbms_output.put_line(t_str(i)); END LOOP; t_str.DELETE; END;
рдкрд░рд┐рдгрд╛рдо:
0
1
2
тАж
421
422
423
тАж
CreateNumber () рдлрд╝рдВрдХреНрд╢рди рд▓реЙрдЬрд┐рдХ v_N = 1000 рд▓реЗрддрд╛ рд╣реИред createNumber () рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ, рдЖрдк v_str рд╡реИрд░рд┐рдПрдмрд▓ рдХреЗ рдУрд╡рд░рдлрд╝реНрд▓реЛ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЧрдгрдирд╛ рдХреЗ рд╕рд╛рде, рдЖрдк рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ 1021 рдирдВрдмрд░реЛрдВ рдХреЗ рд▓рд┐рдП 4000 рдмрд╛рдЗрдЯреНрд╕ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИрдВред рд╣рдорд╛рд░рд╛ 1000 рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╕рдорд╕реНрдпрд╛ рдХреЗ рдЗрд╕ рдЖрдХрд╛рд░ рдореЗрдВ рдлрд┐рдЯ рдмреИрдарддрд╛ рд╣реИред
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдкрд░рд┐рдгрд╛рдо рд╡рд╣реА рд╣реИ рдЬрд┐рд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереАред рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╡рд┐рднрд╛рдЬрд┐рдд рд╣реИред
рднрд▓реЗ рд╣реА рдУрд░реЗрдХрд▓ рдореЗрдВ рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╡рд┐рднрд╛рдЬрди () рдлрд╝рдВрдХреНрд╢рди рдирд╣реАрдВ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рдЬрд╛рд╡рд╛ рдпрд╛ рдкрд╛рдпрдерди рдореЗрдВ, рдпрд╣ рд╡рд┐рдХрд▓реНрдк рдореБрдЭреЗ рд╕реВрдЯ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдиреЗ рдЬреИрд╕реЗ рд╕рд░рд▓ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдзрд┐рдХ рдХреЛрдб рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИред
рдЗрд╕ рд╕реНрддрд░ рдкрд░, рдореИрдВрдиреЗ рд╕реЛрдЪрд╛, рдХреНрдпрд╛ рдХреЗрд╡рд▓ рдПрд╕рдХреНрдпреВрдПрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ? рдореБрдЭреЗ рдХреНрд▓рд╛рд╕рд┐рдХ рдПрд╕рдХреНрдпреВрдПрд▓ рд╕реЗ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдПрд╕рдХреНрдпреВрдПрд▓ рдЬреЛ рдУрд░реЗрдХрд▓ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред
рдореБрдЭреЗ рдкреНрд░рд╢реНрдиреЛрдВ рдХреЗ рдкрджрд╛рдиреБрдХреНрд░рдорд┐рдд рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдпрд╛рдж рдЖрдпрд╛ред

рд╡реИрдХрд▓реНрдкрд┐рдХ рд╕реНрдЯрд╛рд░реНрдЯ рд╡рд┐рде рдСрд░реЗрдХрд▓ рдУрд░реЗрдХрд▓ рдХреЛ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рд▓реВрдк рдХреЛ рдХрд╣рд╛рдВ рд╕реЗ рд╢реБрд░реВ рдХрд░рдирд╛ рд╣реИ, рдЕрд░реНрдерд╛рддреНред рдХреМрди рд╕реА рдкрдВрдХреНрддрд┐ рдореВрд▓ рд╣реЛрдЧреАред рд╣рд╛рд▓рдд рд▓рдЧрднрдЧ рдХрд┐рд╕реА рднреА рд╣реЛ рд╕рдХрддреА рд╣реИред CONNECT BY рдХреЗ рдмрд╛рдж рдХреА рд╕реНрдерд┐рддрд┐ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдПред рдпрд╣рд╛рдВ рдУрд░реЗрдХрд▓ рдХреЛ рдпрд╣ рдмрддрд╛рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рдЪрдХреНрд░ рдХреЛ рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрдм рддрдХред
рдпрд╣ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдкрджрд╛рдиреБрдХреНрд░рдорд┐рдд рдХреНрд╡реЗрд░реА рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рдПрдХрдорд╛рддреНрд░ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╢рд░реНрдд CONNECT BY рдСрдкрд░реЗрдЯрд░ рд╣реИ, рдмрд╛рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдиреБрд╕рд╛рд░ "рд╕реНрдЯреНрд░реИрдВрдЧ" рд╣реИред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрд╕ рдирд┐рд░реНрдорд╛рдг рдореЗрдВ рдПрдХ рдЫрджреНрдо рд╕реНрддрдВрдн рд╕реНрддрд░ рд╣реИ, рдЬреЛ рд╡рд░реНрддрдорд╛рди рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдкрд░ рдШреЛрдВрд╕рд▓реЗ рдХреЗ рд╢рд┐рдХрд╛рд░ рдХреЗ рд╕реНрддрд░ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рддрд╛ рд╣реИред
рдкрд╣рд▓реА рдирдЬрд╝рд░ рдореЗрдВ, рдРрд╕рд╛ рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдирд┐рд░реНрдорд╛рдг рдПрдХ рд▓рд╛рдЗрди рдХреЛ рддреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рдирд╣реАрдВ рд╣реИред рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕рдЪ рдирд╣реАрдВ рд╣реИред рдпрджрд┐ рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдЯреНрд░рд╛рд╡реЗрд▓ рдХреЛ рдЪрдХреНрд░реАрдп рдореЗрдВ рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рд╕рдордп рдореЗрдВ рдпрд╛ рдЫреЛрд░реЛрдВ рдХреЗ рд▓рд┐рдПред
рдХреНрд╡реЗрд░реА рд▓рд┐рдЦрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдПрдХ рд▓рд╛рдЗрди-рдЯреНрд░реИрд╡рд░реНрд╕рд▓ рдПрд▓реНрдЧреЛрд░рд┐рдердо рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рд▓рд╛рдЗрди рдХреА рд╢реБрд░реБрдЖрдд рд╕реЗ, рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдкрд╛рддреНрд░реЛрдВ рдХреЛ рдХрд╛рдЯрдиреЗ рдХреЗ рд▓рд┐рдП, рд╕реАрдорд╛рдВрдХрдХ рдЪрд░рд┐рддреНрд░ рдХреЛред рдКрдкрд░, рдореИрдВрдиреЗ рдЫрджреНрдо рд╕реНрддрдВрдн рд╕реНрддрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓рд┐рдЦрд╛ред рд╣рдо рдЗрд╕реЗ рд╡рд░реНрддрдорд╛рди рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред
рдпрд╣ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдирд┐рдХрд▓рддрд╛ рд╣реИ:
SELECT SUBSTR(str, INSTR(str, ',', 1, level - 1) + 1, INSTR(str, ',', 1, level) - INSTR(str, ',', 1, level - 1) + 1)) FROM DUAL;
рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдк рдмрд╛рд░реАрдХреА рд╕реЗ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдмрд╣реБрдд рдкрд╣рд▓реЗ рдЪрд▓рдирд╛ рдкрд░ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ INSTR () рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рддреАрд╕рд░рд╛ рддрд░реНрдХ 0 рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рдЗрд╕рд▓рд┐рдП, рд╣рдо DECODE () рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдЫреЛрдЯреА рд╕реА рд╕реНрдерд┐рддрд┐ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред
SELECT SUBSTR(str, DECODE(level, 1, 1, INSTR(str, ',', 1, level - 1) + 1), INSTR(str, ',', 1, level) - DECODE(level, 1, 1, INSTR(str, ',', 1, level - 1) + 1)) FROM DUAL;
рдЕрдм рдмрд╣реБрдд рдкрд╣рд▓реЗ рдЪрд▓рдирд╛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред
рдирд┐рд░реНрдорд╛рдг рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рдЖ рдЧрдпрд╛ рд╣реИред рд╕рд╛рде рд╣реА рд╣рдо рдЕрдкрдиреА рд▓рд╛рдЗрди рдХреЛ рдКрдкрд░ рд▓реЗ рдЬрд╛рддреЗ рд╣реИрдВред
WITH TMain AS (SELECT '100,200,300,400,500' || ',' AS str FROM DUAL) SELECT SUBSTR(str, DECODE(level, 1, 1, INSTR(str, ',', 1, level - 1) + 1), INSTR(str, ',', 1, level) - DECODE(level, 1, 1, INSTR(str, ',', 1, level - 1) + 1)) FROM TMain CONNECT BY NVL(INSTR(str, ',', 1, level), 0) <> 0;
рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╣реА рд▓рд┐рдЦрд╛ рдерд╛ рдХрд┐, рд╕рд╣реА рд╕реНрдерд┐рддрд┐ рдореЗрдВ, CONNECT BY рдирд┐рд░реНрдорд╛рдг рд▓реВрдк рдХреА рддрд░рд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЬрдм рддрдХ INSTR () рдлрд╝рдВрдХреНрд╢рди рд╡рд┐рднрд╛рдЬрдХ рд╡рд░реНрдг рдХреА nth рд╕реНрдерд┐рддрд┐ рдХреЛ рдвреВрдБрдв рд╕рдХрддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ n рд╡рд░реНрддрдорд╛рди рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╣реИ, рдФрд░ рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рдпрд╛рдж рдХрд░рддреЗ рд╣реИрдВ, рдЫрджреНрдо-рд╕реНрддрдВрдн рд╕реНрддрд░ рдЗрдЯрд░реНрдЬрд╝реЗрд╢рди рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд▓рд┐рдП рдЬрд╝рд┐рдореНрдореЗрджрд╛рд░ рд╣реИред
рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рд╣реЛ рдЧрдИ рд╣реИ? рдирд╣реАрдВред
рдХреЛрдб рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреА рдкрдардиреАрдпрддрд╛ рд╢реВрдиреНрдп рд╣реИред рдореИрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд▓реВрдк рд╡рд┐рдХрд▓реНрдк рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪ рд░рд╣рд╛ рдерд╛, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрд╛ рдХрд┐ CONNECT BY рд╡рд┐рдХрд▓реНрдк рдХреЛ рдХреИрд╕реЗ рдмреЗрд╣рддрд░ рдмрдирд╛рдпрд╛ рдЬрд╛рдПред
рдУрд░реЗрдХрд▓ рдореЗрдВ рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рдРрд╕рд╛ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдЙрдкрдХрд░рдг рд╣реИред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдлрд╝рдВрдХреНрд╢рди regexp_instr () рдФрд░ regexp_substr ()ред
regexp_instr(_, [, _ [, ] ])
- рдлрд╝рдВрдХреНрд╢рди рдкреИрдЯрд░реНрди рдХреЗ рд▓рд┐рдП рдореИрдЪ рдХреА рд╢реБрд░реБрдЖрдд рдпрд╛ рдЕрдВрдд рдореЗрдВ рдЪрд░рд┐рддреНрд░ рдХреА рд╕реНрдерд┐рддрд┐ рджреЗрддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рд╕рд╛рде рдЗрд╕рдХреЗ рдЕрдиреБрд░реВрдк INSTR ()ред
regexp_substr(_, [, [, ]])
- рдлрд╝рдВрдХреНрд╢рди рдкреИрдЯрд░реНрди рд╕реЗ рдореЗрд▓ рдЦрд╛рдиреЗ рд╡рд╛рд▓реЗ рдПрдХ рд╡рд┐рдХрд▓реНрдк рдХреЛ рд▓реМрдЯрд╛рддрд╛ рд╣реИред
рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреНрд╡реЗрд░реА рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦреЗрдВ:
WITH TMain AS (SELECT '100,200,300,400,500' || ',' AS str FROM DUAL) SELECT regexp_substr(str, '[^,]+', 1, level) FROM TMain CONNECT BY NVL(regexp_instr(str, '[^,]+', 1, level), 0) <> 0;
рдХреЛрдб рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдг рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рдмреЗрд╣рддрд░ рдкрдврд╝рддрд╛ рд╣реИред рдпрд╣ рд╡рд┐рдХрд▓реНрдк рдореБрдЭреЗ рд╕реВрдЯ рдХрд░рддрд╛ рд╣реИред
рдЕрдВрдд рдореЗрдВ, рддреАрди рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рд▓рд┐рдП рд░рдирдЯрд╛рдЗрдо рдкрд╛рд░реНрд╕рд┐рдВрдЧ рддреБрд▓рдирд╛ рдХреА рддреБрд▓рдирд╛ рдХрд░рдирд╛ рддрд░реНрдХрд╕рдВрдЧрдд рд╣реЛрдЧрд╛ред рдКрдкрд░, рдореИрдВрдиреЗ рдпрд╣ рд╕рдордЭрд╛рдиреЗ рдХрд╛ рд╡рд╛рджрд╛ рдХрд┐рдпрд╛ рдХрд┐ CLOB рдкреНрд░рдХрд╛рд░ рдХреЗ рдмрдЬрд╛рдп рд╣рдо VARCHAR2 рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрдпреЛрдВ рдХрд░реЗрдВрдЧреЗред рдпрд╣ рд╕рд┐рд░реНрдл рд░рдирдЯрд╛рдЗрдо рдХреА рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИред рдЪреВрдВрдХрд┐ Oracle CLAR рдкреНрд░рдХрд╛рд░ рдХреЛ VARCHAR2 рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рд╕рдВрднрд╛рд▓рддрд╛ рд╣реИ, рдЬреЛ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рд╡рд┐рдХреГрдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред
рддреАрди рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рдореВрд▓реНрдпрд╛рдВрдХрди рдХреЗ рд▓рд┐рдП рдХреЛрдб: DECLARE v_N PLS_INTEGER := 1000; v_str VARCHAR2(32767); v_startTime TIMESTAMP(9); v_endTime TIMESTAMP(9); TYPE tab_number IS TABLE OF NUMBER(5); t_str tab_number := tab_number(); BEGIN v_str := createNumbers(v_N => v_N); v_startTime := SYSTIMESTAMP; WHILE v_str IS NOT NULL LOOP t_str.EXTEND; t_str(t_str.COUNT) := SUBSTR(v_str, 1, INSTR(v_str, ',', 1) - 1); v_str := SUBSTR(v_str, INSTR(v_str, ',', 1) + 1); END LOOP; v_endTime := SYSTIMESTAMP; dbms_output.put_line(v_endTime - v_startTime); t_str.DELETE; v_str := createNumbers(v_N => v_N); v_startTime := SYSTIMESTAMP; SELECT TO_NUMBER(SUBSTR(v_str, DECODE(level, 1, 1, INSTR(v_str, ',', 1, level - 1) + 1), INSTR(v_str, ',', 1, level) - DECODE(level, 1, 1, INSTR(v_str, ',', 1, level - 1) + 1))) BULK COLLECT INTO t_str FROM DUAL CONNECT BY NVL(INSTR(v_str, ',', 1, level), 0) <> 0; v_endTime := SYSTIMESTAMP; dbms_output.put_line(v_endTime - v_startTime); t_str.DELETE; v_str := createNumbers(v_N => v_N); v_startTime := SYSTIMESTAMP; SELECT TO_NUMBER(regexp_substr(v_str, '[^,]+', 1, level)) BULK COLLECT INTO t_str FROM DUAL CONNECT BY NVL(regexp_instr(v_str, '[^,]+', 1, level), 0) <> 0; v_endTime := SYSTIMESTAMP; dbms_output.put_line(v_endTime - v_startTime); t_str.DELETE; END;
рдкрд░рд┐рдгрд╛рдо рд╕рд╛рд░рдгреАрдмрджреНрдз рд╣реИрдВ:
рддреЛрдбрд╝ рд╡рд┐рдХрд▓реНрдк / рд╕рдВрдЦреНрдпрд╛ рдХреА рд╕рдВрдЦреНрдпрд╛ | 10 | 100 | 1000 |
---|
рдЪрдХреНрд░ | 0,05ms | 0,15ms | 1,52ms |
рдХрдиреЗрдХреНрдЯ рджреНрд╡рд╛рд░рд╛ | 0,18ms | 0,68ms | 18,1ms |
рдХрдиреЗрдХреНрдЯ рджреНрд╡рд╛рд░рд╛ + рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ | 0,25ms | 12,1ms | 1s 137ms |
рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ, рдкрд░рд┐рдгрд╛рдо рдореЗрд░реЗ рд▓рд┐рдП рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рд╣реИред рдореИрдВрдиреЗ рдорд╛рди рд▓рд┐рдпрд╛ рдХрд┐ рддреАрд╕рд░рд╛ рд╡рд┐рдХрд▓реНрдк рд╕рдмрд╕реЗ рддреЗрдЬ рд╣реЛрдЧрд╛ред рдЦреИрд░, рдпрд╣ рдПрдХ рд╕рдмрдХ рд╣реЛрдЧрд╛ред
рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!
рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рд╕реНрд░реЛрддреЛрдВ рдХреА рд╕реВрдЪреА:
1.
рдкрджрд╛рдиреБрдХреНрд░рдорд┐рдд (рдкреБрдирд░рд╛рд╡рд░реНрддреА) рдкреНрд░рд╢реНрди