Table DDL 조회

select DBMS_METADATA.GET_DDL('TABLE', TABLE_NAME ) from USER_OBJECTS where OBJECT_TYPE='TABLE'

VIEW DDL 조회

select DBMS_METADATA.GET_DDL('VIEW', OBJECT_NAME ) from USER_OBJECTS where OBJECT_TYPE='VIEW'

SEQUENCES DDL 조회

select DBMS_METADATA.GET_DDL('SEQUENCE', SEQUENCE_NAME) from USER_SEQUENCES

INDEX DDL 조회

select DBMS_METADATA.GET_DDL('SEQUENCE', SEQUENCE_NAME) from USER_SEQUENCES




oracle 

DatabaseMetaData 


COLUMN_DEF 를 가지고 올때 

아래와 같은 에러가 발생하였다 .  


이유를 찾아본결과. 

java.sql.SQLException: 스트림이 이미 종료되었습니다

at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:125)

at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:162)

at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:227)

at oracle.jdbc.driver.LongAccessor.getBytes(LongAccessor.java:166)

at oracle.jdbc.driver.LongAccessor.getString(LongAccessor.java:207)

at oracle.jdbc.driver.T4CLongAccessor.getString(T4CLongAccessor.java:390)

at oracle.jdbc.driver.OracleResultSetImpl.getString(OracleResultSetImpl.java:355)

at oracle.jdbc.driver.OracleResultSet.getString(OracleResultSet.java:1559)



/*

TABLE_CAT

TABLE_SCHEM

CHAR_OCTET_LENGTH

IS_NULLABLE

ORDINAL_POSITION

SQL_DATETIME_SUB

SQL_DATA_TYPE

ORDINAL_POSITION

 

// 조회를 할때 위에 필드가 COLUMN_DEF 보다 위에 있어서 나는 에러였다. 

순서 때문에 에러가 발생 위에 필드들은 COLUMN_DEF 보다 뒤에 get 해야 된다. 그럼 문제 해결. 

*/



ResultSetMetaData rsmd = null;

Connection conn = null;

ResultSet rs=null;

try {

conn = RDBConn.getConnection(dbAlias);

DatabaseMetaData dbmd = conn.getMetaData();

rs = dbmd.getColumns(null, null, tableNm, "%");

rsmd = rs.getMetaData();

int count = rsmd.getColumnCount();

String [] columns_key = new String[count];

for (int i = 1; i <= count; i++) {

columns_key[i - 1] = rsmd.getColumnName(i);

}

LinkedHashMap columns = null;

Reader input = null;

char[] buffer  = null;

int byteRead=-1;

String key  = "";

HashMap tc = null; 

while (rs.next()) {

tc = new HashMap();


/* 어디에 있어서 상관없는 필드들. 

NULLABLE

REMARKS

NUM_PREC_RADIX

DECIMAL_DIGITS

BUFFER_LENGTH

COLUMN_SIZE

TYPE_NAME

DATA_TYPE

COLUMN_NAME

TABLE_NAME

TABLE_SCHEM

TABLE_CAT

*/

tc.put("COLUMN_DEF", rs.getString("COLUMN_DEF"));


/*

TABLE_CAT

TABLE_SCHEM

CHAR_OCTET_LENGTH

IS_NULLABLE

ORDINAL_POSITION

SQL_DATETIME_SUB

SQL_DATA_TYPE

ORDINAL_POSITION

 

// 조회를 할때 위에 필드가 COLUMN_DEF 보다 위에 있어서 나는 에러였다. 

순서 때문에 에러가 발생 위에 필드들은 COLUMN_DEF 보다 뒤에 get 해야 된다. 그럼 문제 해결. 

*/


System.out.println(tc);

}

}catch (SQLException e1) {

e1.printStackTrace();

}catch(Exception e){

e.printStackTrace();

}finally{

RDBConn.release(conn, null ,rs);

}




select deptno , substr(min(lpad(sal,4,0)||ename),5)
ename,min(lpad(sal,5,0)||ename) value from emp group by deptno
// 필드를 합쳐서 사용 substr(value, number) number 앞에서 부터 자를 글자수

 


select a.ename, a.deptno, b.loc, a.job from emp a, dept b where
a.deptno=b.deptno and a.deptno = 10;

rowid 모든 데이타 마다 유니크 하게 가지는 아이디 .

rownum 데이타의 row 넘버 .

order by는 모든select가 실행되는 가운데에서 매일 마지막에 실행된다.

frimary key 를 만들면 자동 목차를 만든다. 

decode(조건, 참 , 참 값, 거짓)


select deptno, decode(job,'clerk',job,'') m,decode(job,'clerk',job,'') M,
  decode(job,'clerk',job,'') s,decode(job,'clerk',job,'')p,
Sum(sal) from emp group by deptno, job;

ex)
deptno clerk manager salesman president sum(sal)
10 1 1 0 1 
20 1 1 0 0 
30 1 1 1 0

select deptno, job, count(empno) from emp group by deptno, job


select deptno, job, decode(job,'CLERK',COUNT(EMPNO),0) CLERK,
      decode(job,'MANAGER',COUNT(EMPNO),0) MANAGER,
      decode(job,'ALALYST',COUNT(EMPNO),0) ALALYST,
      decode(job,'SALESMAN',COUNT(EMPNO),0) SALESMAN,
      decode(job,'PRESIDENT',COUNT(EMPNO),0) PRESIDENT
  SUM(SAL) FROM EMP GROUP BY DEPTNO, JOB


  인라인 뷰.. :  select 문에 table위치에 select로 나온 테이블을 테이블로 쓰는것.
SELECT DEPTNO SUM(CLERK),SUM(MANAGER), SUM(ALALYST),SUM(SALESMAN),SUM(PRESIDENT),SUM(SUM(SAL))
 FROM (select deptno, job, decode(job,'CLERK',COUNT(EMPNO),0) CLERK,
      decode(job,'MANAGER',COUNT(EMPNO),0) MANAGER,
      decode(job,'ALALYST',COUNT(EMPNO),0) ALALYST,
      decode(job,'SALESMAN',COUNT(EMPNO),0) SALESMAN,
      decode(job,'PRESIDENT',COUNT(EMPNO),0) PRESIDENT
  SUM(SAL) FROM EMP GROUP BY DEPTNO, JOB)
WHERE GROUP BY DEPTNO

 

 


 

SELECT ename, a.deptno, b.deptno, dname, loc
FROM EMP a, DEPT b
WHERE A.DEPTNO (+)= B.DEPTNO;
  ^
  |
  outer join : 조인이 안된 모든 자료를 표시 ..


자료가 없는 데이터 까지 조인해서 검색한것을 표시 .

SELECT deptno, COUNT(empno) FROM (
SELECT  dept.deptno, empno, ename FROM EMP, DEPT
  WHERE emp.deptno(+) = dept.deptno)
        GROUP BY deptno

/*12/10일 문제

특정 부서 번호에 평균 , 최대 값, 최소값(union all 사용)
결과 값
================================
    | 평균 | 최대 | 최소(sal)
================================
10  |        |       |
================================
표시  한로우에 표시 해야 함
결과 값 ..
/* sql*/
SELECT AVG(sal) a, 0 b, 0 c FROM EMP WHERE deptno = 10
UNION all
SELECT 0 a, MAX(sal) b, 0 c FROM EMP WHERE deptno = 10
UNION all
SELECT 0 a, 0 b,min(sal) c FROM EMP WHERE deptno = 10 ;
/*결과값*/
2916.66666666667 0 0
0   5000 0
0   0 1300

 

 


*/


SELECT LEVEL,ename, empno,mgr FROM emp
START WITH ename = 'KING'
CONNECT BY PRIOR  empno=mgr

start 찾고자 하는 데이타 ex) ename = 'KING'
connect by  prior 상위에 데이타 empno = mgr
결과값    상위 하위
level ename empno   mgr
============================
1 KING 7839 null
2 JONES 7566 7839
3 SCOTT 7788 7566
4 ADAMS 7876 7788

SELECT LPAD(' ',3*LEVEL)||ename, empno,mgr FROM emp
START WITH ename = 'KING'
CONNECT BY PRIOR  empno=mgr

lpad를 해서 앞에 공백 문자를 만든다.
결과값
====================================
 ename  empno mgr
     KING  7839 
      JONES  7566 7839
         SCOTT  7788 7566
            ADAMS 7876 7788
         FORD  7902 7566
            SMITH 7369 7902

/* DECODE를 이용하여 그룹 지어서 SQL
SELECT DECODE(RN,1,DEPTNO), MAX(DEPTNO), SUM(SAL) FROM
EMP,( SELECT 1 rn FROM dual UNION ALL
SELECT 2 FROM dual) GROUP BY DECODE(RN,1,DEPTNO))
*/

결과문 ... 
30 30 9400
 30 29025
20 20 10875
10 10 8750

1234

+ Recent posts