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

출처 :http://develop.sunshiny.co.kr/34

/* 해당 일자에 속한 한주 일자를 출력 : 월~일 */
SELECT TRUNC(SYSDATE, 'IW') + LEVEL -1
FROM DUAL
CONNECT BY LEVEL <= 7
;

/* 해당 년도의 월일을 모두 출력 */
SELECT TRUNC(SYSDATE, 'YEAR') + LEVEL -1
FROM DUAL
CONNECT BY LEVEL <= 365
;


/* 주민번호로 나이 출력 : 출생년도만 입력되어도 가능.*/
SELECT TO_NUMBER(TO_CHAR(SYSDATE, 'YYYY')) -
TO_NUMBER(DECODE(SUBSTR('790518', 1, 1), '0', '20', '19') ||
SUBSTR('790518', 1, 2)) + 1 AGE
FROM DUAL
;


-- Oracle --
-- 날자 변환 형식 : 2009-01-03 -- > 2009년 01월 03일

SELECTTO_CHAR(SYSDATE,'YYYY"년" MM"월" DD"일"')AS TODAYFROM DUAL;


-- 현재 날자 시간
SELECT TO_CHAR(SYSDATE, 'YYYYMMDDHH24MISS') FROM DUAL

-- 이틀 전
SELECT TO_CHAR(SYSDATE-2, 'YYYYMMDDHH24MISS') FROM DUAL

-- 3분 전
SELECT TO_CHAR(SYSDATE-(3/(24*60)), 'YYYYMMDDHH24MISS') FROM DUAL

-- 현재 시간에서 20분을 뺀 시간
SELECT TO_CHAR(sysdate - 1/24/60 * 20, 'yyyymmddhh24mi') FROM dual

--------------------------------------------------------------

select /* 오늘날짜 시분초 포함*/
to_char(sysdate,'yyyy/mm/dd hh24:mi:ss')
from dual

select /* 오늘날짜 00시 00분 00초 */
to_char(trunc(sysdate),'yyyy/mm/dd hh24:mi:ss')
from dual
select /* 오늘날짜 00시 00분 00초 위와 동일*/
to_char(trunc(sysdate,'dd'),'yyyy/mm/dd hh24:mi:ss')
from dual

select /* 이번달 1일 00시 00분 00초 */
to_char(trunc(sysdate,'mon'),'yyyy/mm/dd hh24:mi:ss')
from dual

select /* 올해 1월 1일 00시 00분 00초 */
to_char(trunc(sysdate,'year'),'yyyy/mm/dd hh24:mi:ss')
from dual
select /* 올해 1월 1일 00시 00분 00초 */
to_char(to_date('2002','yyyy'),'yyyy/mm/dd hh24:mi:ss')
from dual
select /* 2월 1일 00시 00분 00초 */
to_char(to_date('200202','yyyymm'),'yyyy/mm/dd hh24:mi:ss')
from dual

select /* 2월 2일 00시 00분 00초 */
to_char(to_date('20020202','yyyymmdd'),'yyyy/mm/dd hh24:mi:ss')
from dual
select /* 2월 2일 00시 00분 01초 */
to_char(to_date('20020202','yyyymmdd')+1/68400,'yyyy/mm/dd hh24:mi:ss')
from dual
select /* 2월 2일 00시 00분 00초 -> 한달뒤*/
to_char(add_months(to_date('20020202','yyyymmdd'),1),'yyyy/mm/dd hh24:mi:ss')

from dual
from en-core
laalaal~
날짜 빼기
밑에 날짜 빼기가 있던데 요건 약간 다르게..
(1) 현재 날자에서 하루를 빼고 싶다고 하면
select sysdate() - 1 from dual
(2) 1시간을 빼고 싶으면
select sysdate() - 1/24 from dual
(3) 1분을 빼고 싶으면
select sysdate() - 1/24/60
(q) 1초를 빼고 싶은면 어떻게 할까요? ^^
======================================================================================
- 날짜형 함수

SYSDATE : 현재 시스템의 날짜 및 시간을 구함



LAST_DAY : 지정한 날짜의 해당 월의 마지막 날짜를 구함

-- 현재의 월의 마지막날자를 반환
SELECT LAST_DAY(SYSDATE) "REMAIN DAYS" FROM DUAL;

-- 현재 월의 남은 일수를 반환
SELECT (LAST_DAY(SYSDATE) - SYSDATE) "REMAIN DAYS" FROM DUAL;



MONTHS_BETWEEN : 두 날짜 사이의 개월 수를 구함


-- MONTHS_BETWEEN(DATA1, DATA2)
-- 날자와 날자 사이의 기간을 월 로 나타냄. data1이 data2보다 큰 값

SELECT MONTHS_BETWEEN(LAST_DAY('20091231'), SYSDATE) "남은달" FROM DUAL;
남은달
---------------
10.81507616...




ADD_MONTHS : 지정한 날짜로부터 몇 개월 후의 날짜를 구함

ROUND : 날짜에 대한 반올림

TRUNC : 날짜에 대한 버림



SYSDATE : SYSDATE10-MAY-99

LAST_DAY(날짜값) : LAST_DAY('17-FEB-98')28-FEB-98

MONTHS_BETWEEN(날짜값1, 날짜값2) : MONTHS_BETWEEN('26-APR-97','22-JUL-95')21.1290323

ADD_MONTHS(날짜값, 숫자값) : ADD_MONTHS('22-JUL-95',21)22-APR-97

ROUND(날짜값, 자리수) : 현재 날짜가 1999년 5월 10일이라고 가정하자.

ROUND(SYSDATE,'MONTH')01-MAY-99

TRUNC(날짜값, 자리수) : 현재 날짜가 1999년 5월 10일이라고 가정하자.

TRUNC(SYSDATE,'YEAR')01-JAN-99


- 날짜에 대한 산술연산

날짜 + 숫자 : 날짜 특정한 날로부터 몇일 후의 날짜 계산

날짜 - 숫자 : 날짜 특정한 날로부터 몇일 전의 날짜 계산

날짜 - 날짜 : 숫자 두 날짜 사이의 차이를 숫자로 계산


- 변환형 함수




오늘은 MS-SQl을 쓰다가 필요한 쿼리를 찾던 중 TO_CHAR로 된 쿼리를 찾았는데 써보니 MS-SQL용 쿼리가 아니라 ORACLE용 쿼리여서 제대로 쓸수가 없었습니다.
그래서 찾던 중 ORACLE의 TO_CAHR 함수를 MS-SQL의 CONVERT 함수로 대체할 수 있다는 것을 찾아서 이렇게 정리해 봅니다.

혹시나 저처럼 필요하신 분은 아래를 참조하시면 되겠습니다!!

출처 :
ORACLE의 TO_CHAR 함수를 MSSQL의 CONVERT 함수로


※ ORACLE에서 날짜를 처리할때는
TO_CHAR(SYSDATE,'YYYY-MM-DD') -> 2003-01-23
TO_CHAR(SYSDATE,'YYYY/MM/DD') -> 2003/01/23
TO_CHAR(SYSDATE,'YYYYMMDD') -> 20030123

※ 반대로 처리할때는 TO_DATE함수를 사용하면 되죠~

※ ORACLE에서 숫자를 처리할때는
TO_CHAR(2500000,'L9,999,999') -> w2,500,000
TO_CHAR(2500000,'9,999,999.99') -> 2,500,000.00

※ 반대로 처리할때는 TO_NUMBER함수를 사용하면 되죠~
※ 이 외에도 활용할 수있는 용도가 무지 많습니다.

※ MSSQL에서 날짜를 처리할때는
CONVERT(VARCHAR(10),GETDATE(),120) -> 2003-01-23
CONVERT(VARCHAR(10),GETDATE(),111) -> 2003/01/23
CONVERT(VARCHAR(8),GETDATE(),112) -> 20030123

※ MSSQL에서 숫자를 처리할때는
CONVERT(varchar(20), convert(money,2500000),1) -> 2,500,000.00


출처 :
DBMS별 날짜 포맷변환

1. DBMS 별 시간, 날짜 조회 쿼리

Oracle

select sysdate from dual; 날짜+시분초 까지 조회가능
select current_timestamp from dual; 날짜+밀리초+시간존 까지 조회

MS SQL

select getdate() 날짜 + 밀리초 단위까지 조회가능

DB2 UDB

select current timestamp from sysibm.sysdummy1 날짜+밀리초까지 조회select current date from sysibm.sysdummy1 날짜만 조회
select current time from sysibm.sysdummy1 밀리초 단위시간조회



2. DBMS 별 default date format

Oracle

MS SQL

YYY/MM/DD HH:MI:SS(한글)
MM-DD-YYYY HH:MI:SS(영어)

DB2 UDB

YYYY-MM-DD-HH:MI:SS.MMMMMM (TIMESTAMP 타입)
YYYY-MM-DD (DATE 타입)
HH:MI:SS.MMMMMM (TIME 타입)



3. 날짜 포맷 변환표

형식

RDBMS

변환 문법

'YYYY.MM.DD'

Oracle


TO_CHAR(date_exp, 'YYYY.MM.DD')

MSSQL


CONVERT(VARCHAR, date_exp, 102)

DB2


REPLACE(CHAR(DATE(date_exp),ISO), '-', '.')

Oracle


TO_CHAR(date_exp, 'HH:MI:SS')


MSSQL

CONVERT(VARCHAR, date_exp, 108)


DB2

CHAR(TIME(date_exp) , JIS )


Oracle

TO_CHAR(date_exp, 'YYYY/MM/DD')


MSSQL

CONVERT(VARCHAR, date_exp, 111)


DB2

REPLACE(CHAR(DATE(date_exp), ISO), '-', '/')


Oracle

TO_CHAR(date_exp, 'YYYYMMDD')


MSSQL

CONVERT(VARCHAR, date_exp, 112)


DB2

CHAR(DATE(date_exp))


Oracle

TO_CHAR(date_exp, 'HH24:MI:SS')


MSSQL

CONVERT(VARCHAR(8), date_exp, 114)


DB2

CHAR(TIME(date_exp) )


Oracle

TO_CHAR(date_exp, 'YYYY.MM.DD HH24:MI')


MSSQL

CONVERT(VARCHAR, date_exp, 102) + ' ' + CONVERT(VARCHAR(5), date_exp, 114)


DB2

REPLACE(CHAR(DATE(date_exp), ISO), '-', '.') || CAST( TIME(date_exp) AS CHAR(5))



Oracle

TO_CHAR(date_exp, 'YYYY/MM/DD HH24:MI:SS')


MSSQL

CONVERT(VARCHAR, date_exp, 111) + ' ' + CONVERT(VARCHAR(8), date_exp, 114)


DB2

REPLACE(CHAR(DATE(date_exp), ISO), '-', '/') || CAST( TIME(date_exp))



Oracle/PLSQL: To_Date Function

In Oracle/PLSQL, the to_date function converts a string to a date.

The syntax for the to_date function is:

to_date( string1, [ format_mask ], [ nls_language ] )

string1 is the string that will be converted to a date.

format_mask is optional. This is the format that will be used to convert string1 to a date.

nls_language is optional. This is the nls language used to convert string1 to a date.


The following is a list of options for the format_mask parameter. These parameters can be used in many combinations.

ParameterExplanation
YEARYear, spelled out
YYYY4-digit year
YYY
YY
Y
Last 3, 2, or 1 digit(s) of year.
IYY
IY
I
Last 3, 2, or 1 digit(s) of ISO year.
IYYY4-digit year based on the ISO standard
RRRRAccepts a 2-digit year and returns a 4-digit year.
A value between 0-49 will return a 20xx year.
A value between 50-99 will return a 19xx year.
QQuarter of year (1, 2, 3, 4; JAN-MAR = 1).
MMMonth (01-12; JAN = 01).
MONAbbreviated name of month.
MONTHName of month, padded with blanks to length of 9 characters.
RMRoman numeral month (I-XII; JAN = I).
WWWeek of year (1-53) where week 1 starts on the first day of the year and continues to the seventh day of the year.
WWeek of month (1-5) where week 1 starts on the first day of the month and ends on the seventh.
IWWeek of year (1-52 or 1-53) based on the ISO standard.
DDay of week (1-7).
DAYName of day.
DDDay of month (1-31).
DDDDay of year (1-366).
DYAbbreviated name of day.
JJulian day; the number of days since January 1, 4712 BC.
HHHour of day (1-12).
HH12Hour of day (1-12).
HH24Hour of day (0-23).
MIMinute (0-59).
SSSecond (0-59).
SSSSSSeconds past midnight (0-86399).
FFFractional seconds. Use a value from 1 to 9 after FF to indicate the number of digits in the fractional seconds. For example, 'FF4'.
AM, A.M., PM, or P.M.Meridian indicator
AD or A.DAD indicator
BC or B.C.BC indicator
TZDDaylight savings information. For example, 'PST'
TZHTime zone hour.
TZMTime zone minute.
TZRTime zone region.


Applies To:

  • Oracle 8i, Oracle 9i, Oracle 10g, Oracle 11g


For example:

to_date('2003/07/09', 'yyyy/mm/dd')would return a date value of July 9, 2003.
to_date('070903', 'MMDDYY')would return a date value of July 9, 2003.
to_date('20020315', 'yyyymmdd')would return a date value of Mar 15, 2002.

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

ORA-01403: no data found 대처 SQL문  (0) 2012.04.06
오라클 날짜형 함수  (0) 2012.04.05
오라클의 TRUNC 함수  (0) 2012.04.05
Native Dynamic SQL의 이해와 예제  (0) 2012.04.04
SQL%ROWCOUNT 편리함 ^^  (0) 2012.04.04


- 원하는 소수점 자리수 만큼만 보여주고 나머지는 없애버린다.

- EX) TRUNC(12.345, 2) => 12.34 (소수점 2자리만 보여준다)
TRUNC(12.345) => 12 (소수점 자릿수를 지정하지 않으면 정수만 보여준다.)
TRUNC('2004-05-33', 'MONTH') => '2004-05-01' (월을 기준으로 1일로 돌아온다)
TRUNC('2004-05-12', 'YEAR') => '2004-01-01' (년을 기준으로 1월 1일로 돌아온다)

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

오라클 날짜형 함수  (0) 2012.04.05
오라클 DATE 관련 함수  (0) 2012.04.05
Native Dynamic SQL의 이해와 예제  (0) 2012.04.04
SQL%ROWCOUNT 편리함 ^^  (0) 2012.04.04
PLSQL문법 정리  (730) 2012.04.04

출처 :http://okjsp.pe.kr/seq/12984

52.32.10.46
=================================================================
Oracle8i : Dynamic SQL (Native Dynamic SQL)
=================================================================

DBMS_SQL package을 사용하여 compile 시에 고정되어지는 제한을 극복
하며 Dynamic SQL statement을 구현할 수 있다.

Oracle 8i에서의 Dynamic SQL은 두가지 방법이 있다.첫번째 방법은
"EXECUTE IMMEDIATE" 절을 사용하여 embedded dynamic sql을 구현하는
것이고, 두번째 방법은 선언되어지는 것 대신에 실행시에 문장을 보내는
ref cursor의 확장된 개념으로 query를 위해 사용되어지는 방법이다.

방법 1: EXECUTE IMMEDIATE
----------------------------

Syntax:
EXECUTE IMMEDIATE dynamic_sql_string
[INTO {define_var1 [, define_var2] ... | plsql_record }]
[USING [IN | OUT | IN OUT] bind_arg1 [,
[IN | OUT | IN OUT] bind_arg2] ...];


예제:
--------

(i) DDL문 실행. bind variable을 허용하지 않는다.

declare
str varchar2(200);
begin
str := 'create table msg (msg varchar2(120))';
EXECUTE IMMEDIATE str;
end;

(ii) bind variable을 사용하지 않는 non-query DML문 실행 예.

declare
str varchar2(200);
begin
str := 'insert into msg values (''Hello'')';
EXECUTE IMMEDIATE str;
end;

(iii) bind variable을 사용하지 않는 non-query DML문 실행 예.
variable은 default로 IN bind이므로 IN, OUT mode을 나타낼
필요는 없다.

declare
str varchar2(200);
val varchar2(20);
begin
str := 'insert into msg values (:b1)';
val := 'Bye';
EXECUTE IMMEDIATE str USING val;
end;

(iv) bind variable을 이용하여 single row select을 실행하고,
single define variable에 fetch하는 예.

declare
str varchar2(200);
val varchar2(20);
ret varchar2(20);
begin
str := 'select msg from msg where msg = :b1';
val := 'Hello';
EXECUTE IMMEDIATE str INTO ret USING val;
dbms_output.put_line('Value fetched from table: '||ret);
end;

Result:

Value fetched from table: Hello

(v) (iv)예와 같은 select문을 수행하며 , PL/SQL record type에 fetch하는 예.

declare
str varchar2(200);
val varchar2(20);
ret msg%rowtype;
begin
str := 'select msg from msg where msg = :b1';
val := 'Hello';
EXECUTE IMMEDIATE str INTO ret USING val;
dbms_output.put_line('Value fetched from table: '||ret.msg);
end;

Result:

Value fetched from table: Hello

(vi) returning절을 포함한 delete문을 수행하는 예. 이 경우에는 OUT mode로
선언된 bind variable이 존재해야 한다. delete된 row을 알기 위해서는
sql%rowcount을 사용하며, 모든 sql% attribute가 유효하다.

declare
str varchar2(200);
val varchar2(20);
ret varchar2(20);
begin
val := 'Bye';
str := 'delete from msg where msg = :b1 returning msg into :b2';
EXECUTE IMMEDIATE str USING val, OUT ret;
dbms_output.put_line('Deleted '||sql%rowcount||
' row(s) with value: '||ret);
end;

Result:

Deleted 1 row(s) with value: Bye

(vii) error을 check하면서 stored function을 만들고 만들어진 function을
실행하며, function은 return type으로 OUT bind variable이 제공된다.

declare
str varchar2(200);
-- Declare an exception to trap "compiled with errors"
compile_warn exception;
pragma exception_init(compile_warn,-24344);
val number;
ret number;
begin
begin
-- A deliberate error (spelling of number)
str := 'create or replace function doubleit (p1 in umber)'||
' return number as begin return p1*2; end;';
EXECUTE IMMEDIATE str;
exception
when compile_warn then
-- Correct and reexecute
str := replace(str,'in umber','in number');
EXECUTE IMMEDIATE str;
when others then raise;
end;

-- Call the stored function
str := 'begin :b1 := doubleit(:b2); end;';
val := 30;
EXECUTE IMMEDIATE str USING OUT ret, IN val;
dbms_output.put_line('Result of '||val||' doubled is '||ret);
end;

Result:

Result of 30 doubled is 60

(viii) (vii)예와 같은 function을 새로운 CALL 절을 이용하여 실행한다.

declare
str varchar2(200);
val number;
ret number;
begin
-- Call the stored function
str := 'CALL doubleit(:b2) INTO :b1';
val := 30;
EXECUTE IMMEDIATE str USING IN val, OUT ret;
dbms_output.put_line('Result of '||val||' doubled is '||ret);
end;

Result:

Result of 30 doubled is 60

(ix) 중복된 place holder가진 SQL문을 실행하는 예.

declare
str varchar2(200);
val_str varchar2(20);
val_num number;
ret number;
begin
-- DML : 이 경우는 SQL문으로 bind variable 수만큼의 place holder
-- 가 필요하다.
str := 'insert into msg values (:b1||'' ''||:b1)';
val_str := 'Hello';
EXECUTE IMMEDIATE str USING val_str, val_str;

-- PL/SQL 에서는 bind variable 수만큼의 place holder가 필요하지 않다.
str := 'begin :b1 := doubleit(:b2+:b2); end;';
val_num := 30;
EXECUTE IMMEDIATE str USING OUT ret, IN val_num;
dbms_output.put_line('Result of '||val_num||' quadrupled is '
||ret);
end;

Result:

Result of 30 quadrupled is 120

(x) NOCOPY parameter을 가진 stored procedure을 부르는 예.

create or replace procedure add_stars (p1 in varchar2,
p2 out NOCOPY varchar2) as
begin
p2 := p1||'***';
end;

NOCOPY parameter는 version 8.1에서 소개되었다. value에 의해서기 보다는
reference에 의해 전달되어지는 output parameter이며, 성능을 증가시킬뿐만
아니라 메모리를 절약할 수 있다. value에 의해 전달되어지는 parameter처럼
bind variable이 선언되어진다.

declare
str varchar2(100) := 'call add_stars(:b1,:b2)';
in_str varchar2(20) := 'Hello World';
out_str varchar2(20);
begin
EXECUTE IMMEDIATE str USING IN in_str, OUT out_str;
dbms_output.put_line(out_str);
end;

Result:

Hello World***

방법 2: ref cursor
----------------------

Syntax:
OPEN cursor_var FOR dynamic_query_string
[USING bind_arg1 [, bind_arg2] ...];


예 제 :
--------

다음의 예제를 수행하기 전에 수행되어질 사항:

create table msg (msg varchar2(120));
insert into msg values ('Hello');
insert into msg values ('Bye');

Weak: type my_cur_type is ref cursor;
Strong: type my_cur_type is ref cursor return emp%rowtype;

(i) bind 없이 cursor을 open하는 예.

declare
type my_curs_type is REF CURSOR; -- must be weakly typed
curs my_curs_type;
str varchar2(200);
ret varchar2(20);
begin
str := 'select msg from msg';
-- No placeholders so no USING clause
OPEN curs FOR str;
loop
FETCH curs INTO ret;
exit when curs%notfound;
dbms_output.put_line(ret);
end loop;
CLOSE curs;
end;

Result:

Hello
Bye

(ii) bind variable을 사용하여 cursor을 open하고 single row을 fetch하는 예.

declare
type my_curs_type is REF CURSOR; -- must be weakly typed
curs my_curs_type;
str varchar2(200);
ret varchar2(20);
val varchar2(20);
begin
str := 'select msg from msg where msg = :b1';
val := 'Bye';
OPEN curs FOR str USING val;
FETCH curs INTO ret;
dbms_output.put_line('Value fetched from table: '||ret);
CLOSE curs;
end;

Result:

Value fetched from table: Bye

(iii) 새로운 bulk collect 을 이용하여 한번에 여러 row을 fetch하는 예.

declare
str varchar2(200);
type my_curs_type is REF CURSOR; -- must be weakly typed
curs my_curs_type;

-- Use a nested table to fetch into. This could equally be
-- a VARRAY or index by table.
type string_tab is table of varchar2(20);
ret_tab string_tab; -- don't need to initialise, fetching
-- will do this automatically
begin
str := 'select msg from msg';
OPEN curs FOR str;
FETCH curs BULK COLLECT INTO ret_tab;
dbms_output.put_line('Array fetch: ');
for i in 1..curs%rowcount loop
dbms_output.put_line(ret_tab(i));
end loop;
CLOSE curs;
end;

Result:

Array fetch:
Hello
Bye


Further Information
-------------------

PL/SQL User's Guide and Reference, Chapter 10.


from oracle

白面書生

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

오라클 DATE 관련 함수  (0) 2012.04.05
오라클의 TRUNC 함수  (0) 2012.04.05
SQL%ROWCOUNT 편리함 ^^  (0) 2012.04.04
PLSQL문법 정리  (730) 2012.04.04
SQLPLUS에서 외부 스크립트 실행하기  (0) 2012.04.04

원문 출처 :http://aircook.tistory.com/entry/SQLROWCOUNT


SQL%ROWCOUNT


이걸로 프로시져에서 DBMS_OUTPUT.put_line을 통해 적용행수를 보여줄수 있을듯..


DBMS_OUTPUT.put_line은sql plus에선

SQL> SET SERVEROUTPUT ON ; -- (DBMS_OUTPUT.PUT_LINE을 출력하기 위해 사용)

이거 해줘야 보임..


토드에선 아래쪽에서 DBMS Output선택하고..


왼쪽 빨간버튼 초록색으로 활성화 해놓으면 보임..ㅋㅋ

참고로 옛기억을 되살리면.. sql-server에선 @@rowcount 였던걸로 기억함..


SQL%ROWCOUNT : 가장 최근에 수행된 SQL 문에 의해 영향을 받은 행의 갯수 (정수 값)
SQL%FOUND : 가장 최근에 수행된 SQL 문에 의해 영향을 받은 행의 갯수가 한 개 이상이면 TURE가 되는 Boolean속성
SQL%NOTFOUND : 가장 최근에 수행된 SQL 문에 의해 영향을 받은 행이 없으면 TRUE가 되는 Boolean 속성
SQL%ISOPEN : PL/SQL은 실행한 후 바로 Implicit cursor를 닫기 때문에 항상 FALSE로 평가됨


SQL 커서 속성의 예
S_ITEM 테이블에서 지정된 주문 번호를 갖는 행을 삭제하고 삭제된 행의 갯수를 출력한다.
 
CREATE OR REPLACE PROCEDURE del_rows

(v_ord_id IN NUMBER,
v_rows_deleted OUT VARCHAR2)
IS
BEGIN

DELETE FROM s_item

WHERE ord_id = v_ord_id;

v_rows_deleted:= TO_CHAR(SQL%ROWCOUNT)

|| 'rows deleted.';
END del_rows;



Oracle Document

Oracle allows you to access information about the most recently executed implicit cursor by referencing one of the following special implicit cursor attributes:
SQL%FOUND
SQL%NOTFOUND
SQL%ROWCOUNT
SQL%ISOPEN
Click on each of the above to learn more these attributes.
Implicit cursor attributes return information about the execution of an INSERT, UPDATE, DELETE, or SELECT INTO statement.

First of all, remember that the values of implicit cursor attributes always refer to the most recently executed SQL statement, regardless of the block in which the implicit cursor is executed. And before Oracle opens the first SQL cursor in the session, all the implicit cursor attributes yield NULL. (The exception is %ISOPEN, which returns FALSE.)

Now let’s see how you can use cursor attributes with implicit cursors.


Use SQL%FOUND to determine if your DML statement affected any rows. For example, from time to time an author will change his name and want the new name used for all of his books. So you can create a small procedure to update the name and then report back via a Boolean variable the number of book entries affected:

CREATE OR REPLACE PROCEDURE change_author_name (
old_name_in IN books.author%TYPE,
new_name_in IN books.author%TYPE,
changes_made_out OUT BOOLEAN)
IS
BEGIN
UPDATE books
SET author = new_name_in
WHERE author = old_name_in;
changes_made_out := SQL%FOUND;
END;

Use SQL%NOTFOUND to confirm that your DML statement did not affect any rows. This is the inverse of SQL%FOUND.

Use SQL%ROWCOUNT when you need to know exactly how many rows were affected by your DML statement. Here is a reworking of the above name-change procedure that returns a bit more information:

CREATE OR REPLACE PROCEDURE change_author_name (
old_name_in IN books.author%TYPE,
new_name_in IN books.author%TYPE,
rename_count_out OUT PLS_INTEGER)
IS
BEGIN
UPDATE books
SET author = new_name_in
WHERE author = old_name_in;
rename_count_out := SQL%ROWCOUNT;
END;