2016-07-19 4 views
0

Я пытаюсь вставить в таблицу мой Chaine:INSERT INTO TABLE ИСПОЛЬЗОВАНИЕ REGEXP_SUBSTR

'MARIE,CLAIRE,99999|RIM,CHAVANE,66666|RANA,LEONNE,33333'; 

я должен иметь 3 строки в моей таблице как folows:

NAME LAST_NAME PHONE_NUMBER 
----------------------------- 
MARIE CLAIRE 99999 
RIM CHAVANE 66666      
RANA LEONNE 33333 

Но я извлечь только first row duplicated Не могли бы вы помочь?

Ниже приведен сценарий:

DECLARE 
    NAME   VARCHAR2(200):=NULL ; 
    LAST_NAME VARCHAR2(200):=NULL ; 
    PHONE_NUMBER VARCHAR2(200):=NULL ; 
    CHAINE  VARCHAR2(200):=NULL ; 
    i   NUMBER  :=0; 
    n   NUMBER  :=0; 
BEGIN 
    CHAINE :='MARIE,CLAIRE,99999|RIM,CHAVANE,66666|RANA,LEONNE,33333'; 

    FOR i in 1..10 
    LOOP 
    NAME   := REGEXP_SUBSTR(CHAINE,'[^,]+', 1, 1); 
    LAST_NAME := REGEXP_SUBSTR(CHAINE,'[^,]+', 1, 2); 
    PHONE_NUMBER := REGEXP_SUBSTR(CHAINE,'[^,$|]+', 1, 3); 
    INSERT INTO test_oum VALUES (NAME,LAST_NAME,PHONE_NUMBER); 
    COMMIT; 
    END LOOP; 

    dbms_output.put_line('NAME  ' || NAME); 
    dbms_output.put_line('LAST_NAME  ' || LAST_NAME); 
    dbms_output.put_line('PHONE_NUMBER ' || PHONE_NUMBER); 

END; 
+0

Итак, в чем проблема? – XING

+0

Привет, я не могу вставить цепочку в свой стол – user2425416

+0

Любой разумный зацикливание 10 раз. Если требование состоит только в том, чтобы вставить 3 записи, почему вы зацикливаете 10 раз. Проверьте решение для ремня, предоставленное компанией «Chrisrs2292». Это будет работать. – XING

ответ

0

Проблема у вас есть то, что для всех вас зацикливание, вы всегда делаете подстроку на том же запятых (то есть первый, второй и третий). Переменная «Chaine» не изменяется, поэтому вы всегда получаете одни и те же значения.

Я думаю, что вам нужно сделать что-то похожее на следующее:

DECLARE 
    NAME   VARCHAR2(200):=NULL ; 
    LAST_NAME VARCHAR2(200):=NULL ; 
    PHONE_NUMBER VARCHAR2(200):=NULL ; 
    CHAINE  VARCHAR2(200):=NULL ; 
    i   NUMBER  :=0; 
    n   NUMBER  :=0; 
BEGIN 
    CHAINE :='MARIE,CLAIRE,99999|RIM,CHAVANE,66666|RANA,LEONNE,33333'; 

    FOR cValue IN (
    SELECT REGEXP_SUBSTR(chaine ,'[^|]+',1,LEVEL) val FROM DUAL 
    connect BY REGEXP_SUBSTR(chaine ,'[^|]+',1,LEVEL) IS NOT NULL 
) 
    LOOP 
    NAME   := REGEXP_SUBSTR(cValue.val,'[^,]+', 1, 1); 
    LAST_NAME := REGEXP_SUBSTR(cValue.val,'[^,]+', 1, 2); 
    PHONE_NUMBER := REGEXP_SUBSTR(cValue.val,'[^,]+', 1, 3); 

    dbms_output.put_line('NAME   ' || NAME); 
    dbms_output.put_line('LAST_NAME ' || LAST_NAME); 
    dbms_output.put_line('PHONE_NUMBER ' || PHONE_NUMBER); 

    INSERT INTO test_oum VALUES (NAME,LAST_NAME,PHONE_NUMBER); 
    COMMIT; 
    END LOOP; 
END; 

Это разбивает строку на символы трубы и петли через каждую строку. Затем он вытаскивает имя, фамилию и номер телефона, разбивая запятые каждый раз.

+0

Спасибо, что он отлично работает! – user2425416

0

вам не нужно объявить «я INT: = 0»

DECLARE 
    NAME   VARCHAR2(200):=NULL ; 
    LAST_NAME VARCHAR2(200):=NULL ; 
    PHONE_NUMBER VARCHAR2(200):=NULL ; 
    CHAINE  VARCHAR2(200):=NULL ; 
    n   NUMBER  :=0; 
BEGIN 
    CHAINE :='MARIE,CLAIRE,99999|RIM,CHAVANE,66666|RANA,LEONNE,33333'; 

    FOR i in 1..10 
    LOOP 
    NAME   := REGEXP_SUBSTR(CHAINE,'[^,]+', 1, 1); 
    LAST_NAME := REGEXP_SUBSTR(CHAINE,'[^,]+', 1, 2); 
    PHONE_NUMBER := REGEXP_SUBSTR(CHAINE,'[^,$|]+', 1, 3); 
    INSERT INTO test_oum VALUES (NAME,LAST_NAME,PHONE_NUMBER); 
    COMMIT; 
    END LOOP; 

    dbms_output.put_line('NAME  ' || NAME); 
    dbms_output.put_line('LAST_NAME  ' || LAST_NAME); 
    dbms_output.put_line('PHONE_NUMBER ' || PHONE_NUMBER); 

END; 
1

В целом конструкции PL/SQL следует избегать, когда операция может быть сделана с простым старым SQL. Обычно полученный код будет более кратким и быстрым. Здесь вы увидите пример с одним SQL-предложением-select-statement:

declare 
    v_chaine constant varchar2(32767) := 
    'MARIE,CLAIRE,99999|RIM,CHAVANE,66666|RANA,LEONNE,33333'; 
begin 
    -- note: missing column names in insert statement is not recommended 
    insert into test_oum 
    with 
    -- split single string on '|' 
    r(str) as (
    select  regexp_substr(v_chaine ,'[^|]+', 1, level) from dual 
    connect by regexp_substr(v_chaine ,'[^|]+', 1, level) is not null 
) 
    select 
    regexp_substr(str,'[^,]+', 1, 1) as first_name 
    ,regexp_substr(str,'[^,]+', 1, 2) as last_name 
    ,regexp_substr(str,'[^,]+', 1, 3) as phone_number 
    from r 
    ; 
end; 
/

См. Также, например. Oracle 11g: INSERT SELECT with WITH statement

Смежные вопросы