프린트 하기

OS환경 : Oracle Linux6.8(64bit)

 

DB 환경 : Oracle Database 11.2.0.4

 

방법 : dual 테이블 반복 시키고 싶을 때

 

1
select 1 from dual;

 

이 문장을 반복시키고 싶을 때 

 

pl/sql의 for문 while, loop 문등을 모두 써서 해보려했지만 실패했습니다.

 

보통의 insert 문은 아래와 같은 방식으로 사용합니다.

1
2
3
4
5
6
begin
for i in 1 .. 100 loop
insert into emp values (i);
end loop; 
end;
/

 

하지만 select 문을 이방식으로 해보려했는데 정상적으로 작동하지 않습니다.

1
2
3
4
5
6
7
begin
for i in 1 .. 100 loop
insert into emp values (i);
select i from dual;  
end loop; 
end;
/

 

그래서 방식을 바꿔서 c언어처럼 i=i+1; 를 써보았습니다.

 

1
2
3
4
5
6
7
8
9
begin
for i in 1 .. 100 loop
select 1 from dual;
i := i+1;
end loop; 
end;
/
ORA-06550: line 3, column 1:
PLS-00428: an INTO clause is expected in this SELECT statement

이렇게 해보았지만 역시나 실패...

 

 

그러다 구글링중 찾은 쿼리입니다.

1
SELECT LEVEL FROM DUAL CONNECT BY LEVEL <= 100;

이 쿼리를

1
SELECT 1 FROM DUAL CONNECT BY LEVEL <= 100;

이렇게 바꿔주면

처음 제가 원했던 대로 1을 반복시켜 출력 시킬 수 있습니다.

 

 

dual 테이블이란...

'오라클(oracle)'에 의해서 자동으로 생성되는 테이블이다.

sys 스키마에 있지만 모든 사용자가 엑세스할 수 있다.

VARCHAR2(1)로 정의된 dummy라고 하는 하나의 컬럼(열)으로 되어 있다.

사용자가 함수(계산)를 실행할 때 임시로 사용하는데 적합하다.

이렇게

 

하나의 열로 되어있는 테이블이기 때문에 제가원하는 결과를 출력할 수 없는것입니다.

 

뭐 혹시나...

 

1
select 1 from dual;

이 문장을 출력을 반복해서 아래와 같이

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
1
-
1
 
 
1
-
1
 
 
1
-
1
 
 
1
-
1

 

이렇게 반복 시키시고픈이 있다면... 꼭 알아내서 저에게 알려주시면 감사하겠습니다 :D

 

 

+ 추가

비슷하게 나마 반복출력 구문을 만드는 방법입니다.

 

반복시킬 테이블 생성 및 데이터 삽입

1
2
3
CREATE TABLE IMSI (C1 NUMBER, C2 NUMBER);
INSERT INTO IMSI VALUES (1,2);
COMMIT;

 

프로시저 생성

1
2
3
4
5
6
7
8
9
10
11
12
13
14
CREATE OR REPLACE PROCEDURE FORTEST
     IS
        CURSOR CURSOR1 IS
        SELECT * FROM IMSI;
     BEGIN
     FOR I IN 1..5 LOOP 
       FOR LIST IN CURSOR1 LOOP
          DBMS_OUTPUT.PUT_LINE('C1 C2');
          DBMS_OUTPUT.PUT_LINE('----- -----'); 
          DBMS_OUTPUT.PUT_LINE(LIST.C1 ||' '|| LIST.C2);
       END LOOP;
     END LOOP;
   END;
   /

 

실행

1
2
SET SERVEROUTPUT ON ; 
EXECUTE fortest;
 
결과
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
c1 c2
----- -----
1 2
c1 c2
----- -----
1 2
c1 c2
----- -----
1 2
c1 c2
----- -----
1 2
c1 c2
----- -----
1 2

 

추가1

plsql 로 반복시키는 방법은 찾았지만 결과는 나오지 않음(단순히 실행만 시키는 스크립트)

1
2
3
4
5
6
7
8
9
10
11
12
13
SQL>
set serveroutput on
declare
   l_counter number := 0;
begin
   while l_counter < 10000 loop
      execute immediate 'select 1 from dual';
      l_counter := l_counter + 1;
   end loop;
end;
/
 
PL/SQL procedure successfully completed.

 

 

추가2

plsql에서 into 절을 사용하면 결과값도 출력가능함

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
SQL>
set serveroutput on
declare
   l_counter number := 0;
   l_result number;
begin
   while l_counter < 1000 loop
      execute immediate 'select 1 from dual' into l_result;
      dbms_output.put_line(l_result);
      l_counter := l_counter + 1;
   end loop;
end;
/
 
1
1
1
1
.
.
 
PL/SQL procedure successfully completed.

 

 

참조 : 

https://positivemh.tistory.com/199

 

오라클 select 문 반복 loop

OS환경 : Oracle Linux6.8(64bit) DB 환경 : Oracle Database 11.2.0.4 쿼리 : #반복시킬 테이블 생성 및 데이터 삽입 1 2 3 SQL> CREATE TABLE IMSI (C1 NUMBER, C2 NUMBER); SQL> INSERT INTO IMSI VALUES (1,2); SQL> COMMIT; #프로시저 생성 1

positivemh.tistory.com

 

'ORACLE > Sql' 카테고리의 다른 글

sql_id로 쿼리 찾는 방법  (0) 2018.02.12
sqlplus 에서 백스페이스 사용방법  (0) 2017.11.11
ordsrcsp.sql 이란?  (0) 2017.06.02
cvusys.sql 이란?  (0) 2017.06.02
사용중인 모든 dbf파일, log파일 확인  (0) 2017.05.31