'분류 전체보기'에 해당되는 글 30건
- 2008.01.07 원치않는 줄바꿈 없애기
- 2007.11.15 radio button 이 2개 이상일 경우 선택값을 읽어오는 방법
- 2007.11.02 owa_util.ident_arr로 넘기는 argument가 너무 많을 경우 나타나는 메시지
- 2007.08.23 owa_util.ident_arr 사용하는 프로시저로 넘어가는 값이 없을 때
- 2007.07.05 ceil, floor, round 함수 2
- 2007.05.04 select - into 와 explicit cursor의 차이 1
- 2007.04.18 Oracle 9i와 10g에서의 group by 의 결과의 차이
- 2007.04.16 Hint
- 2007.04.06 HR 스키마에서 job_history가 있는 사람은 Y를 붙여서 출력하는 sql문
- 2007.04.06 RAISE FORM_TRIGGER_FAILURE
- 2007.04.06 synchronize
- 2007.04.05 Alert 띄우기
- 2007.03.13 create synonym
- 2007.02.27 database link 작성
- 2007.02.21 계층형 쿼리
- 2007.02.20 FRM-40202: Field must be entered.
- 2007.02.05 해당 주의 월요일을 구하는 방법
- 2007.01.19 utl_smtp
- 2007.01.19 해당 월의 마지막 날짜를 가져오는 방법
- 2007.01.05 lpad 함수의 활용
- 2007.01.05 trunc 함수의 활용
- 2006.12.27 LOV 버튼 나오게 하는 방법
- 2006.12.27 FORMS path 설정
- 2006.12.27 폼즈 실행했을 때 나오는 메뉴 파일 위치
- 2006.12.20 주의할 것들.
- 2006.12.20 Status의 종류
- 2006.12.19 로컬에서 어플리케이션 서버 웹페이지 접속하기
- 2006.12.18 Sample Schema 설치 방법
- 2006.12.14 Forms Builder를 한글판에서 영문판으로 바꾸는 방법
- 2006.12.07 블로그 오픈
Bad Request
Your browser sent a request that this server could not understand.
mod_plsql: /dat/proc4106.PROCESS HTTP-400 Too many arguments passed in. Got 2876 parameters. Upper limit is 2000
--------------------------------------------------------------------------------
Oracle-Application-Server-10g/10.1.2.2.0 Oracle-HTTP-Server Server at Port 80
커서를 직접 정의해 사용하는 explicit 커서 방식은
pl/sql문에서 select 작업을 수행시키는 데 네트워크 트래픽을 줄여줄 수 있다.
implicit 커서의 경우 하나보다 많은 row가 반환되었을 경우
exception을 발생시켜야 하므로 수행성능을 저하시킬 수 있다.
exception 처리를 하기 위해서는 커서로부터 하나의 row를 패치해 온 다음
Too_Many_Rows exception의 발생 여부를 확인하기 위해서
두번째 row에 대한 패치를 시도해야만 한다.
- oracle developer/2000 programmer's guide. bnc
implicit 커서는 select - into - 문을 사용했을 때 사용되는 커서임.
SELECT b.department_name, a.job_id, sum(a.salary) sal, count(a.employee_id) emp_count
FROM employees a, departments b
WHERE a.department_id = b.department_id
GROUP BY b.department_name, a.job_id;
위 쿼리를 실행했을 때
9i와 10g의 결과가 서로 다르게 나타난다.

9i에서의 쿼리 결과

10g에서의 쿼리 결과
ORACLE 데이터베이스 릴리스 간에는 중요한 GROUP BY 방식의 차이가 있다. 이러한 차이는 GROUP BY가 두 개 이상의 Parameter를 받을 때 결과로써 더욱 확연하게 드러나는 데, 각 ORACLE 데이터베이스 릴리스 별로 GROUP BY 방식은 아래처럼 설명할 수 있다.
Oracle 8i Database : Character Sort GROUP BY
Oracle 9i Database : Binary Sort GROUP BY
Oracle 10g Database : Hash based GROUP BY
캐릭터 소트와 바이너리 소트가 호환될 수 있는 것은 US7ASCII 문자 셋이 처리될 때 뿐일 것이다. ORACLE 9i의 GROUP BY와 같이 내부적으로 바이너리 소트 매커니즘을 사용할 때에는 그룹된 Parameter가 어떤 선호 인덱스의 영향을 받냐에 따라서도 Parameter 간의 우선 순위가 역전될 수 있다.
1.ALL_ROWS
Goal : Best Throughput
용도 : 전체 RESOURCE 소비를 최소화 시키기 위한 힌트.
Cost-Based 접근방식.
예 : SELECT /*+ALL_ROWS */ EMPNO,ENAME
FROM EMP
WHERE EMPNO = 7655;
2.FIRST_ROWS
Goal : Best Response Time
용도 : 조건에 맞는 첫번째 row를 리턴하기 위한 Resource
소비를 최소화 시키기위한 힌트.
Cost-Based 접근방식.
특징 : - Index Scan 이 가능하다면 Optimizer가 Full Table Scan 대신
Index Scan을 선택한다.
- Index Scan 이 가능하다면 Optimizer가 Sort-Merge 보다
Nested Loop 을 선택한다.
- Order By절에의해 Index Scan 이 가능하다면,
Sort과정을 피하기위해 Index Scan을 선택한다.
- Delete/Update Block 에서는 무시된다.
- 다음을 포함한 Select 문에서도 제외된다.
집합연산자 (Union,Intersect,Minus,Union All)
Group By
For UpDate
Group 함수
Distinct
예 : SELECT /*+FIRST_ROWS */ EMPNO,ENAME
FROM EMP
WHERE EMPNO = 7655;
3.CHOOSE
Goal : Acess되는 테이블에 통계치 존재여부에 따라
Optimizer로 하여금 Rule-Based Approach와 Cost-Based Approach
중 하나를 선택할수 있게 한다.
용도 : Data Dictionary가 해당테이블에 대해 통계정보를 가지고 있다면
Optimizer는 Cost-Based Approach를 선택하고,
그렇지 않다면 Rule-Based Approach를 선택한다.
예 : SELECT /*+CHOOSE */ EMPNO,ENAME
FROM EMP
WHERE EMPNO = 7655;
4.RULE
용도 : Rule-Based 최적화를 사용하기위해.
예 : SELECT /*+RULE */ EMPNO,ENAME
FROM EMP
WHERE EMPNO = 7655;
B. Access Methods 로써의 Hints
1.FULL
용도 : 해당테이블의 Full Table Scan을 유도.
예 : SELECT /*+FULL(EMP) */ EMPNO,ENAME
FROM EMP
WHERE EMPNO = 7655;
* 테이블 Alias 가 있는경우는 Alias사용.
Schema Name은 사용안함(From 에 SCOTT.EMP 라고 기술해도 hint에는 EMP사용).
2.ROWID
용도 : 지정된 테이블의 ROWID를 이용한 Scan 유도
3.CLUSTER
용도 : 지정된 테이블Access에 Cluster Scan 유도.
Cluster된 Objects에만 적용가능.
예 : SELECT /*+CLUSTER(EMP) */ ENAME,DEPTNO
FROM EMP,DEPT
WHERE DEPTNO = 10
AND EMP.DEPTNO = DEPT.DEPTNO;
4.HASH
용도 : 지정된 테이블Access에 HASH Scan 유도.
/*+HASH(table) */
5.HASH_AJ
용도 : NOT IN SubQuery 를 HASH anti-join으로 변형
/*+HASH_AJ */
6.HASH_SJ
용도 : correlated Exists SubQuery 를 HASH semi-join으로 변형
/*+HASH_SJ */
7.INDEX
용도 : 지정된 테이블Access에 Index Scan 유도.
* 하나의 index만 지정되면 optimizer는 해당index를 이용.
* 여러개의 인덱스가 지정되면 optimizer가 각 index의
scan시 cost를 분석 한 후 최소비용이 드는 index사용.
경우에 따라 optimizer는 여러 index를 사용한 후 결과를
merge하는 acees방식도 선택.
* index가 지정되지 않으면 optimizer는 테이블의 이용가능한
모든 index에 대해 scan cost를 고려후 최저비용이 드는
index scan을 선택한다.
예 : SELECT /*+INDEX(EMP EMPNO_INDEX) */ EMPNO,ENAME
FROM EMP
WHERE DEPTNO=10
8.INDEX_ASC
용도 : INDEX HINT와 동일 단,ASCENDING 으로 SCAN함을 확실히 하기위함.
9.INDEX_COMBINE
용도 : INDEX명이 주어지지 않으면 OPTIMIZER는 해당 테이블의
best cost 로 선택된 Boolean combination index 를 사용한다.
index 명이 주어지면 주어진 특정 bitmap index 의
boolean combination 의 사용을 시도한다.
/*+INDEX_COMBINE(table index) */
10.INDEX_DESC
용도 : 지정된 테이블의 지정된 index를 이용 descending으로 scan
하고자할때 사용.
/*+INDEX_DESC(table index) */
11.INDEX_FFS
용도 : full table scan보다 빠른 full index scan을 유도.
/*+INDEX_FFS(table index) */
12.MERGE_AJ
용도 : not in subquery를 merge anti-join으로 변형
/*+MERGE_AJ */
13.MERGE_SJ
용도 : correalted EXISTS subquery를 merge semi-join으로 변형
/*+MERGE_SJ */
14.AND_EQUAL
용도 : single-column index의 merge를 이용한 access path 선택.
적어도 두개이상의 index가 지정되어야한다.
/*+AND_EQUAL(table index1,index2...) */
15.USE_CONCAT
용도 : 조건절의 OR 를 Union ALL 형식으로 변형한다.
일반적으로 변형은 비용측면에서 효율적일때만 일어난다.
/*+USE_CONCAT */
C. JOIN 순서를 결정하는 Hints
1.ORDERED
용도 : from절에 기술된 테이블 순서대로 join이 일어나도록 유도.
/*+ORDERED */
예 : SELECT /*+ORDERED */ TAB1.COL1,TAB2.COL2,TAB3.COL3
FROM TAB1,TAB2,TAB3
WHERE TAB1.COL1=TAB2.COL1
AND TAB2.COL1=TAB3.COL1;
2.STAR
용도 : STAR QUERY PLAN이 사용가능하다면 이를 이용하기위한 HINT.
STAR PLAN은 규모가 가장큰 테이블이 QUERY에서 JOIN ORDER상
마지막으로 위치하게 하고 NESTED LOOP 으로 JOIN이 일어나도록
유도한다.
적어도 3개 테이블 이상이 조인에 참여해야하며 LARGE TABLE의
CONCATENATED INDEX는 최소 3컬럼 이상을 INDEX에 포함해야한다.
테이블이 ANALYZE 되어 있다면 OPTIMIZER가 가장효율적인 STAR PLAN을
선택한다.
/*+STAR */
D. JOIN OPERATION을 결정하는 HINTS.
1.USE_NL
용도 : 테이블의 JOIN 시 테이블의 각 ROW가 INNER 테이블을 NESTED LOOP
형식으로 JOIN 한다.
/*+USE_NL(inner_table) */
예 : SELECT /*+ORDERD USE_NL(CUSTOMER) */
FROM ACCOUNT.BALANCE,CUSTOMER.LAST_NAME,CUSTOMER.FIRST_NAME
WHERE ACCOUNT.CUSTNO = CUSTOMER.CUSTNO;
2.USE_MERGE
용도 : 지정된 테이블들의 조인이 SORT-MERGE형식으로 일어나도록 유도.
/*+USE_MERGE(table) */
* 괄호안의 테이블은 JOIN ORDER상의 뒤의 테이블(?)
3.USE_HASH
용도 : 각 테이블간 HASH JOIN이 일어나도록 유도.
/*+USE_HASH(table) */
* 괄호안의 테이블은 JOIN ORDER상의 뒤의 테이블(?)
4.DRIVING_SITE
용도 : QUERY의 실행이 ORACLE에 의해 선택된 SITE가 아닌 다른 SITE에서
일어나도록 유도.
/*+DRIVING_SITE(table) */
예 : SELECT /*+DRIVING_SITE(DEPT) */
FROM EMP,DEPT@RSITE
WHERE EMP.DEPTNO = DEPT.DEPTNO;
DRIVING_SITE 힌트를 안쓰면 DEPT의 ROW가 LOCAL SITE로 보내져
LOCAL SITE에서 JOIN이 일어나지만,
DRIVING_SITE 힌트를 쓰면 EMP의 ROW들이REMOTE SITE로 보내져
QUERY가 실행된후 LOCAL SITE로 결과가 RETURN된다.
1~1000을 loop를 돌릴 경우
화면에는 멈춘 것으로 나오는데
1, 2, 3, ... 1000 등의 변화를 화면에 표시하기 위한 방법으로
synchronize; 를 사용함.
http://www.oracle.com/technology/global/kr/products/forms/pdf/forms9icstowebmigration.pdf 에는
SYNCHRONIZE 빌트인을 사용하면 클라이언트에서 서버로의 라운드트립이 발생합니다. 경험상으로 보면 대부분의 개발자가 이 명령을 과도하게 사용하기 때문에 불필요한 네트워크 트래픽이 생성됩니다. 따라서 SYNCHRONIZE를 사용할 때마다 실제로 필요한 것인지 확인해야 합니다.
라고 나옴.
declare
ALERT_BUTTON number;
begin
ALERT_BUTTON := show_Alert('ALERT13');
IF ALERT_BUTTON = ALERT_BUTTON1 THEN
MESSAGE('yes');
-- IF ALERT_BUTTON = 88 THEN -- 첫번째 버튼
ELSIF ALERT_BUTTON = ALERT_BUTTON2 THEN
-- ELSIF ALERT_BUTTON = 89 THEN -- 두번째 버튼
MESSAGE('NO');
-- ELSIF ALERT_BUTTON = ALERT_BUTTON3 THEN
-- ELSIF ALERT_BUTTON = 90 THEN -- 세번째 버튼
END IF;
end;
FRM-40202: Field must be entered.
Field must be entered라고 뜨는것은 말 그대로 TEXT ITEM의 PROPERTY중 REQUIRED = YES로 지정된 상태입니다.
보통 컬럼에 REQUIRED = YES로 지정된 경우 동일하게 처리하기 위해 TEXT ITEM등에 자동으로 지정되는 속성이죠.
이러한 TEXT ITEM을 커서가 포커싱 되었다가 벗어날 때 나타나게 됩니다.
ERROR MESSAGE LEVEL 을 25로 올렸다 하더라도 ON-ERROR 트리거를 타게 되니 당연히 메시지가 표시되게 됩니다.
에러메시지를 표시하지 않으려면 에러메시지를 강제로 올려놓은 상태에서 처리하게 하는것은 레벨 이하의 다른 에러까지 표시되지 않게 되므로 위험하니 ON-ERROR 혹은 ON-MESSAGE에서 적절하게 처러하시는게 좋습니다.
권장하는 방법은 REQUIRED ITEM의 경우 ITEM PROPERTY의 REQUIRED = NO로 지정하고 PROMPT의 색깔을 빨간색 등으로 표시한 후 커서는 마음대로 이동하게 하고 BLOCK을 이동하거나 COMMIT시에 다른색으로 표시된 ITEM의 입력 여부를 체크하시면 코딩이 다소 어려울지 몰라도 사용자에게 자유로움을 줄수 있습니다.
출처 : http://forums.oracle.com/forums/thread.jspa?messageID=1505111
요일대신 숫자로도 가능함
SELECT NEXT_DAY (SYSDATE, 1) FROM DUAL; --일요일
SELECT NEXT_DAY (SYSDATE, 2) FROM DUAL; --월요일
SELECT NEXT_DAY (SYSDATE, 3) FROM DUAL; --화요일
SELECT NEXT_DAY (SYSDATE, 4) FROM DUAL; --수요일
SELECT NEXT_DAY (SYSDATE, 5) FROM DUAL; --목요일
SELECT NEXT_DAY (SYSDATE, 6) FROM DUAL; --금요일
SELECT NEXT_DAY (SYSDATE, 7) FROM DUAL; --토요일
sample schema 에서 scott, sh, hr 유저를 수동으로 만드는 방법은
아래와 같습니다. 참고하세요.
1. scott 유저 샘플 만들기
dbms#oracle:/data/oracle/app/oracle/product/9.2.0/dbs> sqlplus ''/as sysdba''
SQL*Plus: Release 9.2.0.6.0 - Production on Wed Feb 15 17:45:28 2006
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
Connected to:
Oracle9i Enterprise Edition Release 9.2.0.6.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.6.0 - Production
SQL>
SQL> set pages 100
SQL> column tn format a20 heading ''TableSpace|Name''
SQL> column Tot format 999,999,999 heading ''Total|(Mb)''
SQL> column Free format 999,999,999 heading ''Free|(Mb)''
SQL> column Used format 999,999,999 heading ''Used|(Mb)''
SQL> column Pct format 999,999,999 heading ''Pct|(%)''
SQL>
SQL> ttitle ''DataSize|Tot/Used/Pct/Free''
SQL>
SQL> SELECT /*+ use_hash(f,t) */
2 t.tn,
3 t.sizes Tot,
4 nvl(trunc((t.sizes - f.sizes) /t.sizes * 100),100) Pct,
5 trunc(t.sizes - nvl(f.sizes,1) ) Used,
6 trunc(nvl(f.sizes,1)) Free
7 FROM ( SELECT tablespace_name tn,
8 sum(bytes)/1024/1024 Sizes
9 FROM dba_data_files
10 GROUP BY tablespace_name) t,
11 ( SELECT /*+ full(a) parallel(a 5) */
12 a.tablespace_name tn,
13 sum(a.bytes)/1024/1024 sizes
14 FROM dba_free_space a
15 GROUP BY a.tablespace_name) f
16 WHERE t.tn = f.tn(+)
17 ORDER BY t.tn
18 /
clear columns
ttitle off
Wed Feb 15
page 1
DataSize
Tot/Used/Pct/Free
TableSpace Total Pct Used Free
Name (Mb) (%) (Mb) (Mb)
-------------------- ------------ ------------ ------------ ------------
SYSTEM 300 33 101 198
TEST 10 0 0 9
TEST2 10 0 0 9
UNDOTBS 100 29 29 70
UNDOTBS2 10 10 1 8
USERS 1,000 2 21 978
6 rows selected.
SQL>
SQL> set pages 40
SQL> set line 132
SQL> col tbs_name format a15
SQL> col Used_mega format a15
SQL> col Used_PCT format 999.99
SQL> col Cache_PCT format 999.99
SQL>
SQL> SELECT d.tablespace_name tbs_name, d.status Status, d.CONTENTS Type,
2 d.extent_management Ext_manage,
3 NVL(a.BYTES / 1024 / 1024, 0) Total_mega,
4 NVL(t.BYTES, 1)/1024/1024 ||'' / ''|| NVL(a.BYTES / 1024 / 1024,
1) Used_mega,
5 NVL(t.BYTES / a.BYTES * 100, 1) Used_PCT,
6 NVL(t.curnt_byte/1024/1024, 1) Cache_mega,
7 (NVL(t.curnt_byte/1024/1024, 1)/NVL(a.BYTES / 1024 / 1024, 0)
*100) Cache_PCT
8 FROM SYS.dba_tablespaces d,
9 (SELECT tablespace_name, SUM (BYTES) BYTES
10 FROM dba_temp_files
11 GROUP BY tablespace_name) a,
12 (SELECT tablespace_name, SUM (BYTES_USED) curnt_byte, sum
(BYTES_CACHED) BYTES
13 FROM v$temp_extent_pool
14 GROUP BY tablespace_name) t
15 WHERE d.tablespace_name = a.tablespace_name(+)
16 AND d.tablespace_name = t.tablespace_name(+)
17 AND d.extent_management LIKE ''LOCAL''
18 AND d.CONTENTS LIKE ''TEMPORARY'';
clear columns
ttitle off
TBS_NAME STATUS TYPE EXT_MANAGE TOTAL_MEGA USED_MEGA
USED_PCT CACHE_MEGA CACHE_PCT
--------------- --------- --------- ---------- ---------- --------------- -
------- ---------- ---------
TEMP ONLINE TEMPORARY LOCAL 200 10 /
200 5.00 0 .00
SQL> create user scott identified by tiger
2 default tablespace users
3 temporary tablespace temp;
User created.
SQL> grant connect, resource to scott;
SQL> conn scott/tiger
Connected.
Grant succeeded.
SQL> @?/sqlplus/demo/demobld
Building demonstration tables. Please wait.
Demonstration table build is complete.
Disconnected from Oracle9i Enterprise Edition Release 9.2.0.6.0 -
Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.6.0 - Production
dbms#oracle:/data/oracle/app/oracle/product/9.2.0/dbs> sqlplus scott/tiger
SQL*Plus: Release 9.2.0.6.0 - Production on Wed Feb 15 17:52:36 2006
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
Connected to:
Oracle9i Enterprise Edition Release 9.2.0.6.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.6.0 - Production
SQL> select * from tab;
TNAME TABTYPE CLUSTERID
------------------------------ ------- ----------
BONUS TABLE
DEPT TABLE
DUMMY TABLE
EMP TABLE
SALGRADE TABLE
SQL>
2. hr 유저 만들기
SQL> conn /as sysdba
Connected.
SQL> @?/demo/schema/human_resources/hr_main
specify password for HR as parameter 1:
Enter value for 1: hr
specify default tablespeace for HR as parameter 2:
Enter value for 2: users
specify temporary tablespace for HR as parameter 3:
Enter value for 3: temp
specify password for SYS as parameter 4:
Enter value for 4: change_on_install
specify log path as parameter 5:
Enter value for 5: /u/home/oracle/LOG/
DROP USER hr CASCADE
*
ERROR at line 1:
ORA-01918: user ''HR'' does not exist
old 1: CREATE USER hr IDENTIFIED BY &pass
new 1: CREATE USER hr IDENTIFIED BY hr
User created.
old 1: ALTER USER hr DEFAULT TABLESPACE &tbs
new 1: ALTER USER hr DEFAULT TABLESPACE users
old 2: QUOTA UNLIMITED ON &tbs
new 2: QUOTA UNLIMITED ON users
User altered.
old 1: ALTER USER hr TEMPORARY TABLESPACE &ttbs
new 1: ALTER USER hr TEMPORARY TABLESPACE temp
User altered.
Grant succeeded.
Grant succeeded.
Connected.
3. sh 유저 만들기
- 오래 걸리고 300메가 공간이 있어야 합니다.
- ORACLE_HOME 디렉토리를 알아야 합니다.
SQL> show user
USER is "HR"
SQL> conn /as sysdba
Connected.
SQL> !echo $ORACLE_HOME
/data/oracle/app/oracle/product/9.2.0
SQL> @?/demo/schema/sales_history/sh_main
specify password for SH as parameter 1:
Enter value for 1: sh
specify default tablespeace for SH as parameter 2:
Enter value for 2: users
specify temporary tablespace for SH as parameter 3:
Enter value for 3: temp
specify password for SYS as parameter 4:
Enter value for 4: change_on_install
==> 아래에서 중요!!~~ 오라클 홈디렉토리에/demo/schema/sales_history/
를 붙여야 합니다. 마지막에 / 을 붙이지 않으면 찾지 못하니
마지막에 / 를 꼭 붙여주세요.
specify directory path for the data files as parameter 5:
Enter value for
5: /data/oracle/app/oracle/product/9.2.0/demo/schema/sales_history/
=> 아래는 sh유저를 생성한 로그를 남기는 곳인데.. / 를 마지막에
붙여줘야 그 해당 디렉토리에 만들어 집니다.
writeable directory path for the log files as parameter 6:
Enter value for 6: /u/home/oracle/LOG/
.... 생성 시작.. 시간이 많이 걸립니다.