객체를 생성할 수 있는 권한은 있는데.. 흐음~ ORA-30041: 테이블스페이스에 할당량을 부여할 수 없음 이런 에러도 함께 흐음~ 다시금 사용자를 수정했다. alter user testuser default tablespace users quota unlimited on users; 후후
ORA-01045: user TESTUSER lacks CREATE SESSION privilege; logon denied 사용자를 생성했는데 conn testuser/testpasswd 로 로그인하려고 하는데 위와같은 에러메시지가 떴다. 세션을 생성할 권한이 없다는 얘기.. 다시 sysdba 계정으로 로그인하여 conn /as sysdba testuser 에게 세션권한을 줬다. grant create session to testuser; grant create session, resource to testuser; resource 는 롤 권한을 준건데.. 사용자를 생성하고 아무일도 하지 않을건가? 테이블도 만들고 시퀀스도 만들고.. 여러 객체를 생성할텐데.. resource 는 이런것들을 할 수 있는..
DATE 타입의 컬럼을 WHERE 문에서 BETWEEN 으로 검색하려하는데 날짜는 상관없는데 시분초까지 검색하려면 'ORA-01861: 리터럴이 형식 문자열과 일치하지 않음' 이 에러가 떴다. 구글검색결과 타입을 지정해줘야한다는 결론이 났다. 다음과 같이 하면 된다. WHERE SDATE BETWEEN TO_DATE('2008-09-01 00:00:00', 'yyyy-mm-dd hh24:mi:ss') AND TO_DATE('2008-09-08 23:59:59', 'yyyy-mm-dd hh24:mi:ss') 에공..
데이터베이스 상태 알아보기 SQL> SELECT STATUS FROM V$INSTANCE; STATUS 가 STARTED 이면 NOMOUNT 단계로 CONTROL FILE 의 문제가 있다. MOUNTED 이면 DATA FILE 이나 REDO LOG FILE 의 문제가 있다. OPEN 이면 정상으로 열림
STARTUP 단계 1. SHUTDOWN – 인스턴스가 닫힘 파라미터 파일이 있어야 NOMOUNT 단계로 갈 수 있다. 2. NOMOUNT – 인스턴스 시작 파라미터 파일을 읽고, SGA 를 할당하고, 백그라운드 프로세스가 시작되고, ALERT LOG 파일 및 추적파일을 연다. CONTROL FILE 이 있어야 MOUNT 단계로 갈 수 있다. 3. MOUNT – 데이터베이스의 모드를 변경하는 단계 DATAFILE 의 이름 바꾸기, ARCHIVELOG MODE 변경, DB 복구 DATA FILE, REDO LOG FILE 이 정상적으로 있어야 OPEN 단계로 갈 수 있다. 4. OPEN – 데이터베이스가 정상적으로 열린 상태 STARTUP 명령은 SHUTDOWN 단계에서만 사용할 수 있고 NOMOUNT 나..
SPFILE 생성 SQL> CREATE SPFILE FROM PFILE; 일반적으로 PFILE 은 initSID.ora 라는 이름으로 되어있고, (SID 는 ORACLE_SID 로 오라클 인스턴스 명이다? ㅡ,.ㅡ;) SPFILE 은 spfileSID.ora 라는 이름으로 되어있다. 이 두가지는 초기화 매개변수로 인스턴스를 시작하기 위해 필요하다. pfile 은 텍스트 편집기에서 수정할 수 있으나 spfile 은 이진파일로 되어있어서 편집기에서는 수정할 수 없다. pfile 은 텍스트 편집기에서 수정후 인스턴스를 재시작해야 한다. spfile 은 현재 세션에서도 수정해서 적용할 수 있다.(물론 재시작후 적용되는 것도 있다.ㅡ.ㅡ) 반대로 SPFILE 에서 PFILE을 생성할 수 있다. CREATE PFI..
공부하면서 짝대기 거가며 A4 용지에 끄적인걸 찍어서 보여주면 좋겠지만,, 일단은 그냥.. 후후^^; 오라클 서버는 일단 인스턴스와 데이터베이스로 구성되어지고 다시 인스턴스는 백그라운드 프로세스와 메모리 영역으로 나누어진다. 백그라운드 프로세스는 5개의 주요 프로세스와 기타프로세스로가 있고 메모리에는 SGA 와 PGA 가 있다. 데이터베이스는 데이터파일과 컨트롤파일, 리두로그 파일로 구성된다. 그래서 아래처럼 정리.. ^^; ORACLE SERVER 1. Instance (1) BackGround Porcess - PMON : 프로세스 모니터, 트랜잭션 롤백 - SMON : 시스템 모니터, 인스턴스 복구 - DBWR : 디비 라이터(쓰기) 체크포인트가 일어날 시, 더티버퍼 수가 한계값을 넘을시, 사용가능..
인덱스가 사용되지 않는 경우 - 인덱스 컬럼은 비교되기 전에 변형이 일어나면 인덱스를 사용할 수 없다. 인덱스는 가공되기 전에 값으로 생성되어 있지 가공된 후의 값을 가지고 있지않다. - 부정형으로 조건을 기술한 경우에도 인덱스를 사용하지 않는다. - 인덱스 컬럼이 null 로 비교되면 사용할 수 없다. 결합인덱스 - 첫번째 컬럼이 검색되지 않으면 소용없다. - 첫번째 컬럼이 '='으로 검색되어야 한다. between이나 like 로 검색되면 효율이 떨어진다. 개발시 인덱스 추출 요령 1. 반복 수행되는 액세스 형태를 찾는다. - 기본키, 외부키, 서브쿼리시 연결고리가 되는 컬럼 2. 분포도가 아주 양호한 컬럼들을 발췌하여 액세스 유형을 조사한다. 3. 자주 넓은 범위의 조건이 부여되는 경우를 찾는다. ..
SELECT CHARINDEX(char(13), Title), Title FROM EnterTest 이렇게 하면 엔터가 들어간 부분에 인덱스를 구할 수 있다. 그래서 어떤 글을 썼는데, 처음 엔터까지 문장을 끊고 싶으면 substring 을 써서 처리할 수 있다. - substring(0, charindex(char(13), Title) ) 뭐 이런식으로 하면 되나?? 이건 쿼리로 한 건데 물론, 프로그램 소스에서도 처리할 수 있다. 알아서들 해보삼~ 후후후^^
Main Query - Sub Query ? 사원테이블에서 최대월급을 받는 사람과 그 월급을 출력하려면.. select ename, max(sal) from emp where sal=max(sal); 이러면 되는 줄 알았건만.. ㅡ,.ㅡ;; '그룹 함수는 허가되지 않습니다' 이건 뭐여~~ 서브쿼리를 사용하자! select ename, sal from emp where sal=(select max(sal) from emp); ENAME SAL ---------- ---------- KING 5000 where 절에 있는 (select max(sal) from emp) 이 서브쿼리다. ? 여기서, JONES의 월급보다 많이 받는 사원들의 이름, 월급을 출력하려면.. select ename, sal from ..
1. equi join - 두 테이블 사이에 서로 공통된 컬럼이 있을때 하는 조인 where 절에 증거를 줘야한다. 먼저, emp 테이블 말고 dept 테이블이 있는데 이를 확인하면.. select * from dept; DEPTNO DNAME LOC -------------------------------------- 10 ACCOUNTING NEW YORK 20 RESEARCH DALLAS 30 SALES CHICAGO 40 OPERATIONS BOSTON 여기있는 deptno 가 emp 테이블과의 연결고리다. emp 테이블에도 deptno가 있는 것을 확인해보라. 그럼 여기서,, 각 사원들의 근무지를 보려면 select ename, loc from emp, dept where emp.deptno=d..
max - 최대값을 출력하는 함수 다음과 같이 해보자. emp 테이블에서 월급이 제일 큰것을 출력하려면. select max(sal) from emp; MAX(SAL) --------- 5000 자, 다음은 직업이 SALESMAN 인 사원이 받는 월급 중 가장 많은 월급과 함께 직업을 같이 출력하려면.. select job, max(sal) from emp where job='SALESMAN'; -'단일 그룹의 그룹 함수가 아닙니다' 라는 메시지를 볼수 있다. 여기서 문제가 뭐냐하면, job이 SALESMAN 인 row 는 여러개니까 그것이 다 출력되려고 하고, max 값은 최대값으로 하나만 나오려고 하니까 둘이 다투다가 문제가 생기는 것이다. 따라서, 여기서 필요한 건 뭐?! group by 절이 필요..
to_char - 말 그대로 char 로 바꿔주는 함수 바꿀 때 포맷도 줄 수 있느데, 몇개 예를 들어보면 day 는 요일을 반환하고, d 는 일수(?)를 반환한다. 뭐냐하면, 일요일부터 토요일까지 1~7까지의 숫자를 반환한다. 일요일은 1, 월요일은 2, 금요일은 6 이런식으로 반환한다 select hiredate, to_char(hiredate,'day'), to_char(hiredate,'d') from emp; HIREDATE TO_CHAR(HIREDATE,'DAY') TO_CHAR(HIREDATE,'D') --------------------------------------------------------------------- 1980-12-17 수요일 4 1981-02-20 금요일 6 198..
upper - 대문자로 출력하는 함수 select upper('Never, give up!!') from dual; 결과 : NEVER, GIVE UP!! lower - 소문자로 출력하는 함수 select upper('Never, give up!!') from dual; 결과 : never, give up!! initcap - 앞글자만 대문자로 출력하는 함수 select upper('Never, give up!!') from dual; 결과 : Never, Give Up!! concat - 연결해서 출력 SQL> select concat(ename, sal) 2 from emp; CONCAT(ENAME,SAL) -------------------- SMITH800 ALLEN1600 WARD1250 .....
그냥 이어서... -- 연결연산자 || 연결연산자의 장점은 문자열로 표현할수 있다는 것이다. 다음을 입력해보자. select ename || ' 의 월급은 ' || sal from emp; ENAME||'의월급은'||SAL ----------------------- SMITH 의 월급은 800 ALLEN 의 월급은 1600 WARD 의 월급은 1250 -- where 절에 조건을 줘서 특정 데이터만 select -- 사원이름이 SCOTT 인 사원의 이름, 월급? select ename, sal from emp where ename = 'SCOTT'; ENAME SAL ---------- ---------- SCOTT 3000 이름을 줄때 소문자로 쓴다던지, ''(싱글쿼터) 로 감싸주지 않으면 원하는 결과..
SQL/공부 2008. 10. 4. 21:14
객체를 생성할 수 있는 권한은 있는데.. 흐음~ ORA-30041: 테이블스페이스에 할당량을 부여할 수 없음 이런 에러도 함께 흐음~ 다시금 사용자를 수정했다. alter user testuser default tablespace users quota unlimited on users; 후후
SQL/공부 2008. 10. 4. 21:10
ORA-01045: user TESTUSER lacks CREATE SESSION privilege; logon denied 사용자를 생성했는데 conn testuser/testpasswd 로 로그인하려고 하는데 위와같은 에러메시지가 떴다. 세션을 생성할 권한이 없다는 얘기.. 다시 sysdba 계정으로 로그인하여 conn /as sysdba testuser 에게 세션권한을 줬다. grant create session to testuser; grant create session, resource to testuser; resource 는 롤 권한을 준건데.. 사용자를 생성하고 아무일도 하지 않을건가? 테이블도 만들고 시퀀스도 만들고.. 여러 객체를 생성할텐데.. resource 는 이런것들을 할 수 있는..
SQL/공부 2008. 10. 4. 20:57
사용자 계정이 잠겨있다는 에러코드다. sys 계정으로 로그인 한 후 해당 사용자의 잠금상태를 해제한다. alter user testuser account unlock;
SQL/공부 2008. 10. 4. 20:54
create user testuser identified by testpasswd account unlock; testuser 라는 아이디로 계정을 생성하는데 패스워드는 testpasswd 이고 바로 사용할수 있게 계정잠금상태를 풀어줬다.
SQL/공부 2008. 9. 8. 18:23
DATE 타입의 컬럼을 WHERE 문에서 BETWEEN 으로 검색하려하는데 날짜는 상관없는데 시분초까지 검색하려면 'ORA-01861: 리터럴이 형식 문자열과 일치하지 않음' 이 에러가 떴다. 구글검색결과 타입을 지정해줘야한다는 결론이 났다. 다음과 같이 하면 된다. WHERE SDATE BETWEEN TO_DATE('2008-09-01 00:00:00', 'yyyy-mm-dd hh24:mi:ss') AND TO_DATE('2008-09-08 23:59:59', 'yyyy-mm-dd hh24:mi:ss') 에공..
SQL/공부 2008. 4. 17. 13:32
데이터베이스 상태 알아보기 SQL> SELECT STATUS FROM V$INSTANCE; STATUS 가 STARTED 이면 NOMOUNT 단계로 CONTROL FILE 의 문제가 있다. MOUNTED 이면 DATA FILE 이나 REDO LOG FILE 의 문제가 있다. OPEN 이면 정상으로 열림
SQL/공부 2008. 4. 17. 13:17
STARTUP 단계 1. SHUTDOWN – 인스턴스가 닫힘 파라미터 파일이 있어야 NOMOUNT 단계로 갈 수 있다. 2. NOMOUNT – 인스턴스 시작 파라미터 파일을 읽고, SGA 를 할당하고, 백그라운드 프로세스가 시작되고, ALERT LOG 파일 및 추적파일을 연다. CONTROL FILE 이 있어야 MOUNT 단계로 갈 수 있다. 3. MOUNT – 데이터베이스의 모드를 변경하는 단계 DATAFILE 의 이름 바꾸기, ARCHIVELOG MODE 변경, DB 복구 DATA FILE, REDO LOG FILE 이 정상적으로 있어야 OPEN 단계로 갈 수 있다. 4. OPEN – 데이터베이스가 정상적으로 열린 상태 STARTUP 명령은 SHUTDOWN 단계에서만 사용할 수 있고 NOMOUNT 나..
SQL/공부 2008. 4. 17. 12:55
SPFILE 생성 SQL> CREATE SPFILE FROM PFILE; 일반적으로 PFILE 은 initSID.ora 라는 이름으로 되어있고, (SID 는 ORACLE_SID 로 오라클 인스턴스 명이다? ㅡ,.ㅡ;) SPFILE 은 spfileSID.ora 라는 이름으로 되어있다. 이 두가지는 초기화 매개변수로 인스턴스를 시작하기 위해 필요하다. pfile 은 텍스트 편집기에서 수정할 수 있으나 spfile 은 이진파일로 되어있어서 편집기에서는 수정할 수 없다. pfile 은 텍스트 편집기에서 수정후 인스턴스를 재시작해야 한다. spfile 은 현재 세션에서도 수정해서 적용할 수 있다.(물론 재시작후 적용되는 것도 있다.ㅡ.ㅡ) 반대로 SPFILE 에서 PFILE을 생성할 수 있다. CREATE PFI..
SQL/공부 2008. 4. 17. 12:09
오라클 데이터베이스는 논리적구조와 물리적 구조로 나뉜다. 1) 논리적 구조 DataBase -> Tablespace -> Segment -> Extent -> Block(최소단위) 2) 물리적 구조 Data File, Control File, Redo Log File
SQL/공부 2008. 4. 17. 11:39
공부하면서 짝대기 거가며 A4 용지에 끄적인걸 찍어서 보여주면 좋겠지만,, 일단은 그냥.. 후후^^; 오라클 서버는 일단 인스턴스와 데이터베이스로 구성되어지고 다시 인스턴스는 백그라운드 프로세스와 메모리 영역으로 나누어진다. 백그라운드 프로세스는 5개의 주요 프로세스와 기타프로세스로가 있고 메모리에는 SGA 와 PGA 가 있다. 데이터베이스는 데이터파일과 컨트롤파일, 리두로그 파일로 구성된다. 그래서 아래처럼 정리.. ^^; ORACLE SERVER 1. Instance (1) BackGround Porcess - PMON : 프로세스 모니터, 트랜잭션 롤백 - SMON : 시스템 모니터, 인스턴스 복구 - DBWR : 디비 라이터(쓰기) 체크포인트가 일어날 시, 더티버퍼 수가 한계값을 넘을시, 사용가능..
SQL/공부 2008. 4. 15. 11:48
인덱스가 사용되지 않는 경우 - 인덱스 컬럼은 비교되기 전에 변형이 일어나면 인덱스를 사용할 수 없다. 인덱스는 가공되기 전에 값으로 생성되어 있지 가공된 후의 값을 가지고 있지않다. - 부정형으로 조건을 기술한 경우에도 인덱스를 사용하지 않는다. - 인덱스 컬럼이 null 로 비교되면 사용할 수 없다. 결합인덱스 - 첫번째 컬럼이 검색되지 않으면 소용없다. - 첫번째 컬럼이 '='으로 검색되어야 한다. between이나 like 로 검색되면 효율이 떨어진다. 개발시 인덱스 추출 요령 1. 반복 수행되는 액세스 형태를 찾는다. - 기본키, 외부키, 서브쿼리시 연결고리가 되는 컬럼 2. 분포도가 아주 양호한 컬럼들을 발췌하여 액세스 유형을 조사한다. 3. 자주 넓은 범위의 조건이 부여되는 경우를 찾는다. ..
SQL/공부 2008. 4. 15. 10:50
SELECT COUNT(1) AS ColCnt FROM SYSCOLUMNS WHERE ID = ( SELECT ID FROM SYSOBJECTS WHERE NAME='Table_Name' ) 그냥 이렇게 하면 알수 있길래... ^^; 뭐 필요 없을 수도 ㅋㅋ
SQL/공부 2008. 4. 15. 10:22
SELECT CHARINDEX(char(13), Title), Title FROM EnterTest 이렇게 하면 엔터가 들어간 부분에 인덱스를 구할 수 있다. 그래서 어떤 글을 썼는데, 처음 엔터까지 문장을 끊고 싶으면 substring 을 써서 처리할 수 있다. - substring(0, charindex(char(13), Title) ) 뭐 이런식으로 하면 되나?? 이건 쿼리로 한 건데 물론, 프로그램 소스에서도 처리할 수 있다. 알아서들 해보삼~ 후후후^^
SQL/공부 2007. 12. 7. 14:29
Main Query - Sub Query ? 사원테이블에서 최대월급을 받는 사람과 그 월급을 출력하려면.. select ename, max(sal) from emp where sal=max(sal); 이러면 되는 줄 알았건만.. ㅡ,.ㅡ;; '그룹 함수는 허가되지 않습니다' 이건 뭐여~~ 서브쿼리를 사용하자! select ename, sal from emp where sal=(select max(sal) from emp); ENAME SAL ---------- ---------- KING 5000 where 절에 있는 (select max(sal) from emp) 이 서브쿼리다. ? 여기서, JONES의 월급보다 많이 받는 사원들의 이름, 월급을 출력하려면.. select ename, sal from ..
SQL/공부 2007. 12. 7. 12:09
1. equi join - 두 테이블 사이에 서로 공통된 컬럼이 있을때 하는 조인 where 절에 증거를 줘야한다. 먼저, emp 테이블 말고 dept 테이블이 있는데 이를 확인하면.. select * from dept; DEPTNO DNAME LOC -------------------------------------- 10 ACCOUNTING NEW YORK 20 RESEARCH DALLAS 30 SALES CHICAGO 40 OPERATIONS BOSTON 여기있는 deptno 가 emp 테이블과의 연결고리다. emp 테이블에도 deptno가 있는 것을 확인해보라. 그럼 여기서,, 각 사원들의 근무지를 보려면 select ename, loc from emp, dept where emp.deptno=d..
SQL/공부 2007. 11. 29. 17:46
max - 최대값을 출력하는 함수 다음과 같이 해보자. emp 테이블에서 월급이 제일 큰것을 출력하려면. select max(sal) from emp; MAX(SAL) --------- 5000 자, 다음은 직업이 SALESMAN 인 사원이 받는 월급 중 가장 많은 월급과 함께 직업을 같이 출력하려면.. select job, max(sal) from emp where job='SALESMAN'; -'단일 그룹의 그룹 함수가 아닙니다' 라는 메시지를 볼수 있다. 여기서 문제가 뭐냐하면, job이 SALESMAN 인 row 는 여러개니까 그것이 다 출력되려고 하고, max 값은 최대값으로 하나만 나오려고 하니까 둘이 다투다가 문제가 생기는 것이다. 따라서, 여기서 필요한 건 뭐?! group by 절이 필요..
SQL/공부 2007. 11. 29. 16:36
to_char - 말 그대로 char 로 바꿔주는 함수 바꿀 때 포맷도 줄 수 있느데, 몇개 예를 들어보면 day 는 요일을 반환하고, d 는 일수(?)를 반환한다. 뭐냐하면, 일요일부터 토요일까지 1~7까지의 숫자를 반환한다. 일요일은 1, 월요일은 2, 금요일은 6 이런식으로 반환한다 select hiredate, to_char(hiredate,'day'), to_char(hiredate,'d') from emp; HIREDATE TO_CHAR(HIREDATE,'DAY') TO_CHAR(HIREDATE,'D') --------------------------------------------------------------------- 1980-12-17 수요일 4 1981-02-20 금요일 6 198..
SQL/공부 2007. 11. 26. 14:27
upper - 대문자로 출력하는 함수 select upper('Never, give up!!') from dual; 결과 : NEVER, GIVE UP!! lower - 소문자로 출력하는 함수 select upper('Never, give up!!') from dual; 결과 : never, give up!! initcap - 앞글자만 대문자로 출력하는 함수 select upper('Never, give up!!') from dual; 결과 : Never, Give Up!! concat - 연결해서 출력 SQL> select concat(ename, sal) 2 from emp; CONCAT(ENAME,SAL) -------------------- SMITH800 ALLEN1600 WARD1250 .....
SQL/공부 2007. 11. 23. 18:36
그냥 이어서... -- 연결연산자 || 연결연산자의 장점은 문자열로 표현할수 있다는 것이다. 다음을 입력해보자. select ename || ' 의 월급은 ' || sal from emp; ENAME||'의월급은'||SAL ----------------------- SMITH 의 월급은 800 ALLEN 의 월급은 1600 WARD 의 월급은 1250 -- where 절에 조건을 줘서 특정 데이터만 select -- 사원이름이 SCOTT 인 사원의 이름, 월급? select ename, sal from emp where ename = 'SCOTT'; ENAME SAL ---------- ---------- SCOTT 3000 이름을 줄때 소문자로 쓴다던지, ''(싱글쿼터) 로 감싸주지 않으면 원하는 결과..
SQL/공부 2007. 11. 23. 17:52
그냥 처음 시작해서 1강임. 범위는 맘데로.. ㅡ,.ㅡ;;; 자~~ 시작!!! * SQL (Structure Query Language) 다음과 같이 5가지로 분류할 수 있다. 1. Query --> select 2. DML --> insert, update, delete 3. DDL --> create, alter, drop, truncate, rename 4. DCL --> grant, revoke 5. TCL --> commit, rollback, savepoint 이제부터는 오라클에서의 예제다. (오라클 설치는 잘 해보자!!) 오라클의 테스트 계정은 scott 이고 pw는 tiger이다. sqlplus을 실행시켜서 접속해보자. cmd창에서 sqlplus scott/tiger 를 입력하자. lock..