테이블 test_table이 있습니다.
create table test_table(
no1 number,
u_id varchar2(10),
u_pw varchar2(10),
senten varchar2(100)
);
insert into test_table values(1,'kim','1234','동해물과 백두산이 마르고 닳도록 연습하자');
test_table의 senten 값을 공백 단위로 쪼개고 여러개의 row값을 출력하는 procedure를 짜보고 있는데 잘 안되서요. 해결해 주시면 감사하겠습니다.
-----procedure-----
create or replace procedure split_sentence
is
type table_type1 is table of test_table%rowtype
index by binary_integer;
split_word varchar2(100);
i binary_integer := 0;
test_table1 table_type1;
begin
DBMS_OUTPUT.ENABLE;
for s_list in (select senten from test_table where no=1) loop
i := i + 1;
test_table1(i) := s_list.senten;
dbms_output.put_line('test_table(i) || test_table1(i)');
end loop;
for cnt in 1..i loop
split_word := regexp_substr(test_table1(cnt).senten, '[^ ]+',1);
dbms_output.put_line('split_word : ' || split_word);
end loop;
end;
set serveroutput on;
execute split_sentence;
/*수정*/ WITH TEST_TABLE AS ( SELECT 1 no1 , 'KIM' u_id, '1234' u_pw, '동해물과 백두산이 마르고 닳도록 연습하자' senten FROM DUAL UNION ALL SELECT 2 no1 , 'LEE' u_id, '5678' u_pw, '기운센 천하장사 무쇠로 만든' senten FROM DUAL ), COPY_T AS ( SELECT LEVEL LV FROM DUAL CONNECT BY LEVEL <= (SELECT MAX(REGEXP_COUNT(senten , ' ')) + 1 FROM TEST_TABLE) ) SELECT A.NO1 , B.LV , REGEXP_SUBSTR(A.senten, '[^ ]+' , 1 , B.LV ) senten FROM TEST_TABLE A ,COPY_T B WHERE REGEXP_COUNT(A.senten,' ') + 1 >= B.LV ORDER BY A.NO1 , B.LV
연습으로 프로시저 만드시는 것 같은데..
쿼리로 하면 쉽지만 굳이 프로시저로 하시겠다면
의도에 맞게 오류 안 나게만 수정해보았습니다. 잘 작동하는지 확인해보세요.
create or replace procedure split_sentence is type table_type1 is table of test_table%rowtype index by binary_integer; split_word varchar2(100); i binary_integer := 0; test_table1 table_type1; cursor cur is select * from test_table where no = 1; begin dbms_output.enable; open cur; loop i := i + 1; fetch cur into test_table1(i); exit when cur%notfound; dbms_output.put_line('test_table(' || i || ') : ' || test_table1(i).senten); end loop; i := i - 1; for cnt in 1 .. i loop for word in 1 .. regexp_count(test_table1(cnt).senten, ' ') + 1 loop split_word := regexp_substr(test_table1(cnt).senten, '[^ ]+', 1, word); dbms_output.put_line('split_word : ' || split_word); end loop; end loop; end;