가로세로 SQL 결과값 전화 row ->column
No. 10955
ROW의 DISPLAY방향을 ACROSS-DOWN에서 DOWN-ACROSS로 ================================================
PURPOSE ———
Sql*Plus에서 Select statement를 수행하면 row의 출력이 ‘across-down’형태로 나타난다.
SQL> SELECT deptno, dname FROM dept;
DEPTNO DNAME ——— ————– 10 ACCOUNTING 20 RESEARCH 30 SALES 40 OPERATIONS
그렇지만, 경우에 따라 아래와 같이 ‘down-across’의 출력을 필요로 할 경우도 있다.
10 20 30 40 ACCOUNTING SALES RESEARCH OPERATIONS
Example ——–
/* * SQL*Plus set commands */ SET HEADING OFF SET VERIFY OFF SET FEEDBACK OFF
/* display되는 column의 갯수만큼 column을 선언하고 길이는 아래 예제의 wid * 변수의 길이만큼 선언한다. */ CREATE TABLE trans ( C1 VARCHAR2(15), C2 VARCHAR2(15), C3 VARCHAR2(15), C4 VARCHAR2(15));
/* * PL/SQL 예제 */ DECLARE
CURSOR mycursor IS SELECT deptno, dname FROM dept ORDER BY deptno; mycurrec mycursor%ROWTYPE; numcols NUMBER := 4; /* 한 line에 display될 column 수 */ wid NUMBER := 15; /* display될 column의 길이 */ deptnostr VARCHAR2(60); /* source table의 첫번째 column */ dnamestr VARCHAR2(60); /* source table의 두번째 column */
BEGIN
OPEN mycursor;
LOOP EXIT WHEN mycursor%NOTFOUND; deptnostr := ”; dnamestr := ”;
FOR i IN 1..numcols LOOP FETCH mycursor INTO mycurrec; EXIT WHEN mycursor%NOTFOUND;
deptnostr := deptnostr || RPAD(TO_CHAR(mycurrec.deptno), wid); dnamestr := dnamestr || RPAD(mycurrec.dname, wid);
END LOOP;
/* * 아래의 insert문에 fail이 나지 않게끔 column길이의 마지막에 * space를 padding한다. */ deptnostr := RPAD(deptnostr, numcols*wid); dnamestr := RPAD(dnamestr,numcols*wid);
/* * result table에 string을 insert한다. */ INSERT INTO trans VALUES( SUBSTR(deptnostr, 1, wid), SUBSTR(deptnostr, wid+1, wid), SUBSTR(deptnostr, 2*wid+1, wid), SUBSTR(deptnostr, 3*wid+1, wid));
INSERT INTO trans VALUES( SUBSTR(dnamestr, 1, wid), SUBSTR(dnamestr, wid+1, wid), SUBSTR(dnamestr, 2*wid+1, wid), SUBSTR(dnamestr, 3*wid+1, wid));
/* * 각 set간에 빈 line을 삽입한다. */ INSERT INTO trans VALUES(NULL, NULL, NULL, NULL);
END LOOP; CLOSE mycursor;
END; /
COMMIT;
SELECT * FROM trans; DROP TABLE trans;
/* * SQL*Plus set commands를 원래 상태로. */ SET HEADING ON SET VERIFY ON SET FEEDBACK ON
Comments