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
'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 |