흐르는 시간의 블로그...

출처 :http://net2.tistory.com/entry/ORA-01403-no-data-found-%EB%8C%80%EC%B2%98


-- 내 생각 : SQL%FOUND로만 처리 가능하리라 생각했지만 BIND 변수를 쓰고 INTO문으로 인해서 EXCEPTION 발생


프로시져 또는 트리거 실행 시 SELECT INTO에서 조회된 쿼리의 ROW가 존재하지 않을때

ORA-01403 에러발생 조치

1. Select 절에서 Row가 없는 경우 Exception으로 뺀다.

예)

select rtptno
into v_rtptno
from mosstbat
where pt_no = :new.q_patientno;

결과가 no_data_found로 나온 경우

아래와 같이 exception을 추가해 준다.

begin

select rtptno
into v_rtptno
from mosstbat
where pt_no = :new.Q_PATIENTNO;

exception
when no_data_found then null;
when others then
null;

end;

'프로그래밍??? > 오라클' 카테고리의 다른 글

RAC 재시작 관련 사항  (0) 2012.04.10
최종 업데이트 행을 찾는 쿼리...  (0) 2012.04.09
오라클 날짜형 함수  (0) 2012.04.05
오라클 DATE 관련 함수  (0) 2012.04.05
오라클의 TRUNC 함수  (0) 2012.04.05


파일을 열고 문자열을 쓰고 닫는 예제는 아래와 같다

#!/usr/bin/perl

$filename = './test.txt';
$my_string = 'test for file write.';

open( TEXT, ">$filename");
print TEXT $my_string;
close(TEXT);

open(TEXT, $file_name);
$out_string = <TEXT>;
close(TEXT);

출처 :

*** 어제 날짜 구하기
어제 날짜를 알기 위해서는, 단순히 오늘 날짜에 -1을 한다고 되는 것이 아니겠지요.

오늘이 1일이라면, 어제 날짜는 30일이 될 수도 있고, 31일이 될 수도 있고, "어제 달", "어제 년"의 문제도 있습니다.

따라서, time 함수로 현재의 "유닉스 타임"을 구한 후, "하루의 초(sec)"에 해당하는
(24 * 60 * 60) = 86400 초
라는 숫자를 빼면 어제 날짜의 유닉스 타임이 구해집니다. 그 유닉스 타임을 날짜로 변환하면, 어제 날짜가 구해집니다.


#!/usr/bin/perl
use strict; use warnings;

my $rightnow = time - (24 * 60 * 60);

printf("어제 년: %04d\n", (localtime $rightnow) [5] + 1900 );
printf("어제 월: %02d\n", (localtime $rightnow) [4] + 1 );
printf("어제 일: %02d\n", (localtime $rightnow) [3] );


*** 내일 날짜 구하기


#!/usr/bin/perl

use strict; use warnings;

my $rightnow = time + (24 * 60 * 60);

printf("내일 년: %04d\n", (localtime $rightnow) [5] + 1900 );
printf("내일 월: %02d\n", (localtime $rightnow) [4] + 1 );
printf("내일 일: %02d\n", (localtime $rightnow) [3] );



*** 오늘 날짜 구하기

펄에서 오늘 현재의 날짜와 시간을 구하는 방법입니다. 연월일 시분초 별로 나누어서, 화면에 출력합니다.

localtime 이라는 함수에 인수를 주지 않고 실행하면, 현재 시간이 연월일 시분초 별로 들어 있는 리스트를 반환합니다.

파일명: 0.pl
#!/usr/bin/perl
use strict; use warnings;

my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime;


printf("현재 년: %04d\n", $year + 1900);
printf("현재 월: %02d\n", $mon + 1);
printf("현재 일: %02d\n", $mday);

print "\n"; # 줄바꿈

printf("현재 시: %02d\n", $hour);
printf("현재 분: %02d\n", $min);
printf("현재 초: %02d\n", $sec);

print "\n"; # 줄바꿈

printf("오늘 요일: %d\n", $wday); # 일요일 = 0
printf("올해 몇번째 날: %d\n", $yday); # 1월1일 = 0
printf("서머타임 여부: %d\n", $isdst); # 서머타임 없음 = 0




*** 유닉스 타임 얻기 예제
#!/usr/bin/perl
use strict; use warnings;

print time;


원본 출처 :https://sites.google.com/site/smcgbu/home/gongbu-iyagi/naljjahyeonghamsu



날짜형 함수

-SYSDATE : 시스템의 현재 날짜/시간
-CURRENT_DATE : 세션별 시간대(TIME_ZONE)를 기준으로 한 날짜/현재 시간. Oracle은 세션별로 시간대 설정 가능 (파라미터 : TIME_ZONE)
-SYSTIMESTAMP : 시스템의 현재 날짜/시간 (반환 타입이 DATE가 아닌 TIMESTAMP WITH TIME ZONE 타입을 반환)
-CURRENT_TIMESTAMP: 세션별 시간대(TIME_ZONE)를 기준으로 한 날짜/현재 시간 (반환 타입이 DATE가 아닌 TIMESTAMP WITH TIME ZONE 타입을 반환)
파라미터 있음(TIMESTAMP WITH TIME ZONE의 정밀도. 생략시는 default 6)
-LOCALTIMESTAMP : (반환 타입이 TIMESTAMP WITH TIME ZONE 아닌 TIMESTAMP 타입을 반환)
파라미터 있음(TIMESTAMP WITH TIME ZONE의 정밀도. 생략시는 default 6)
select sysdate --> 2011-10-17 10:52:36
, current_date --> 2011-10-17 10:52:36
, systimestamp --> 17-OCT-11 10.52.36.043602 AM +09:00
, current_timestamp --> 17-OCT-11 10.52.36.043602 AM +09:00
, current_timestamp(6) --> 17-OCT-11 10.52.36.043602 AM +09:00
, current_timestamp(5) --> 17-OCT-11 10.52.36.04360 AM +09:00
, current_timestamp(4) --> 17-OCT-11 10.52.36.0436 AM +09:00
, current_timestamp(3) --> 17-OCT-11 10.52.36.044 AM +09:00
, current_timestamp(2) --> 17-OCT-11 10.52.36.04 AM +09:00
, current_timestamp(1) --> 17-OCT-11 10.52.36.0 AM +09:00
, current_timestamp(0) --> 17-OCT-11 10.52.36 AM +09:00
, current_timestamp(-1) -->ORA-30088: datetime/interval precision is out of range
, localtimestamp --> 17-OCT-11 10.54.36.043602 AM
, localtimestamp(6) --> 17-OCT-11 10.54.36.043602 AM
, localtimestamp(5) --> 17-OCT-11 10.54.36.04360 AM
, localtimestamp(4) --> 17-OCT-11 10.54.36.0436 AM
, localtimestamp(3) --> 17-OCT-11 10.54.36.044 AM
, localtimestamp(2) --> 17-OCT-11 10.54.36.04 AM
, localtimestamp(1) --> 17-OCT-11 10.54.36.0 AM
, localtimestamp(0) --> 17-OCT-11 10.54.36 AM
, localtimestamp(-1) -->ORA-30088: datetime/interval precision is out of range
from dual;

--> sysdate 외에는 아직 써 본적이 없네요.

*** 실수로 데이터를 변경했을 때 좋은 것 같아요 ***

1. 특정시간의 데이터 조회
select * from 테이블명 as of timestamp to_date('2011101612','yyyymmddhh24') where rownum < 10;
2. 한시간 전 데이터 조회
select * from 테이블명 as of timestamp (systimestamp - interval '1' hour) where rownum < 10;
3. 1분전 데이터 조회
select * from 테이블명 as of timestamp (systimestamp - interval '1' minute) where rownum < 10;

-ADD_MONTHS(date, integer) : 임의의 날짜에 개월 수를 더함
select trunc(sysdate), add_months(trunc(sysdate), 2) from dual;
-----------------------------------------------------------------------
2011-10-17 00:00:00 2011-12-17 00:00:00

-MONTHS_BETWEEN(date1, date2) : 두 날짜 사이의 개월 수
select months_between(to_date('20111207', 'yyyymmdd'), to_date('20110607', 'yyyymmdd')) from dual;
---------------------------------------------------------------------------------------------------
6

-NEXT_DAY(date, char) : date이후의 날짜 중에서 주중에 char로 명시된 첫 번째 일자를 반환
char : MONDAY, MON(SUN, MON, TUE, WED, THUR, FRI, SAT), 2(1:일요일, 7:토요일)
select next_day(trunc(sysdate), 'TUESDAY'), next_day(trunc(sysdate), 'TUE'), next_day(trunc(sysdate), 3) from dual;
-------------------------------------------------------------------------------------------------------------------
2011-10-18 00:00:00 2011-10-18 00:00:00 2011-10-18 00:00:00

-ROUND(date, fmt) : 파라미터로 들어오는 date 날짜를 포맷모델인 fmt에 의해 명시된 단위로 반올림한 결과를 반환
select round(trunc(sysdate), 'cc' ) century --> 2001-01-01 00:00:00
, round(trunc(sysdate), 'yyyy' ) next_year1 --> 2012-01-01 00:00:00
, round(trunc(sysdate), 'year' ) next_year1 --> 2012-01-01 00:00:00
, round(trunc(sysdate), 'iyyy' ) iso_year --> 2012-01-02 00:00:00 .. iso 년도 기준
, round(trunc(sysdate), 'q' ) quarter --> 2011-10-01 00:00:00
, round(trunc(sysdate), 'month') mon --> 2011-11-01 00:00:00
, round(trunc(sysdate), 'dd' ) dd --> 2011-10-17 00:00:00
, round(trunc(sysdate), 'day' ) day --> 2011-10-16 00:00:00
from dual;

-----------------------------------------------------------------
포맷 모델 단위
-----------------------------------------------------------------
CC 4자리연도의 끝 두 자리를 기준으로 반올림된다.
SCC
-----------------------------------------------------------------
SYYYY 년(7월 1일부터 반올림된다)
YYYY
YEAR
SYEAR
YYYY
YYY
Y
-----------------------------------------------------------------
IYYY ISO 기준 년(year)
IYY
IY
I
-----------------------------------------------------------------
Q 분기(한 분기의 두 번째 달의 16일부터 반올림된다)
-----------------------------------------------------------------
MONTH 월(16일부터 반올림된다)
MON
MM
RM
-----------------------------------------------------------------
WW 연도의 첫 번째 날짜로 그 주의 같은 날
-----------------------------------------------------------------
IW ISO 연도의 첫 번째 날짜로그 주의 같은 날
-----------------------------------------------------------------
WW 월의 첫 번째 날짜로 그 주의 같은 날
-----------------------------------------------------------------
DDD, DD, J 일
-----------------------------------------------------------------
DAY, DY, D 한 주가 시작되는 날짜
-----------------------------------------------------------------
HH, HH12, HH24 시
-----------------------------------------------------------------
MI 분
-----------------------------------------------------------------


-TRUNC(date, fmt) : date 날짜를 포맷모델에 맞게 날짜를 잘라낸다.
round 함수는 포맷모델에 따라 일정한 날짜를 기준으로 해서 반올림이 수행되는데 반해
trunc 함수는 이에 상관없이 무조건 잘라낸다.
select trunc(sysdate ) today --> 2012-02-16 00:00:00
, trunc(sysdate, 'cc' ) century --> 2001-01-01 00:00:00
, trunc(sysdate, 'yyyy' ) year1 --> 2012-01-01 00:00:00
, trunc(sysdate, 'year' ) year2 --> 2012-01-01 00:00:00
, trunc(sysdate, 'iyyy' ) iso_year --> 2012-01-02 00:00:00 .. iso 년도 기준
, trunc(sysdate, 'q' ) quarter --> 2012-01-01 00:00:00
, trunc(sysdate, 'month') mon --> 2012-02-01 00:00:00
, trunc(sysdate, 'dd' ) dd --> 2012-02-16 00:00:00
, trunc(sysdate, 'day' ) day --> 2012-02-12 00:00:00
from dual;

--> round와 trunc 함수 모두 포맷 모델을 생략할 수 있는데 이러한 경우 파라미터 값에 가장 가까운 날짜로 반올림되거나 잘린다.

-EXTRACT([YEAR] [MONTH] [DAY] [HOUR] [MINUTE] [SECOND]) ... FROM datetime)
: 파라미터로 들어오는 날짜정보에서 특정한 날짜 유형, 즉 연도나 월, 시간, 분, 초 등을 추출하여 그 결과를 반환
select extract(year fromsysdate ) year --> 2011
, extract(month from sysdate ) month --> 10
, extract(day from sysdate ) day --> 17
, extract(hour fromsystimestamp) hour --> 4
, extract(minute from systimestamp) minute --> 34
, extract(second from systimestamp) second --> 21.423162

, extract(year fromsystimestamp) --> 2011
, extract(hour fromsysdate ) -->ORA-30076: invalid extract field for extract source
from dual;

--> M.Jay 의견 : 기존에는 이런 데이터를 구할 때 trunc를 하거나 substr등을 사용하고는 했는데 이 함수를 사용하면 좋겠네요.

- 기타 날짜형 함수
DBTIMEZONE: 데이터베이스의 시간대 반환
select DBTIMEZONE from dual;
----------------------------
-04:00
SESSIONTIMEZONE: 현재 접속되어 있는 세션의 시간대 반환
select SESSIONTIMEZONE from dual;
---------------------------------
+09:00