정답은 이미 주어졌다, 그러나 조금을 정교화했다. MILLER 두 번 인쇄 여기
SQL> declare
2 cursor cur_t
3 is
4 select ename
5 from emp
6 where deptno = 10
7 ;
8 v_texttoadd emp.ename%type;
9 v_string varchar2(100);
10 begin
11 open cur_t;
12 loop
13 fetch cur_t into v_texttoadd;
14 v_string := v_string || v_texttoadd;
15 exit when cur_t%notfound;
16 end loop
17 ;
18 dbms_output.put_line(v_string);
19 end;
20/
CLARKKINGMILLERMILLER
PL/SQL-procedure is geslaagd.
:
현재의 상황을 시뮬레이션. 커서를 위해 루프를 사용하는 경우
SQL> declare
2 cursor cur_t
3 is
4 select ename
5 from emp
6 where deptno = 10
7 ;
8 v_texttoadd emp.ename%type;
9 v_string varchar2(100);
10 begin
11 open cur_t;
12 loop
13 fetch cur_t into v_texttoadd;
14 exit when cur_t%notfound;
15 v_string := v_string || v_texttoadd;
16 end loop
17 ;
18 dbms_output.put_line(v_string);
19 end;
20/
CLARKKINGMILLER
PL/SQL-procedure is geslaagd.
그러나, 당신의 PL/SQL 코드가 쉬워집니다 : 바로 EXIT 문 및 v_string 할당을 전환하면 원하는 결과를 얻을. 그런 다음 루프 감소에 v_texttoadd 변수와 행의 수를 건너 뛸 수 있습니다 :
SQL> declare
2 cursor cur_t
3 is
4 select ename
5 from emp
6 where deptno = 10
7 ;
8 v_string varchar2(100);
9 begin
10 for r in cur_t
11 loop
12 v_string := v_string || r.ename;
13 end loop
14 ;
15 dbms_output.put_line(v_string);
16 end;
17/
CLARKKINGMILLER
PL/SQL-procedure is geslaagd.
는 또한 작업을 수행하기 위해 직선 SQL을 사용할 수 있습니다. 는 SQL 모델 절 예, 당신은 버전 10g 이상에있는 경우 :
SQL> select string
2 from (select string
3 , rn
4 from emp
5 where deptno = 10
6 model
7 dimension by (rownum rn)
8 measures (ename, cast(null as varchar2(100)) string)
9 (string[any] order by rn desc = ename[cv()] || string[cv()+1]
10 )
11 )
12 where rn = 1
13/
STRING
-----------------------------------------------------------------------------------
CLARKKINGMILLER
1 rij is geselecteerd.
감사합니다, 롭.
제게 적합하지 않았습니다. 네가 신경 쓰면 내 대답 좀 봐. –