select col1, col2, col3 from tab order by col1, col2
compute sum(col3) by col1
select col1, col2, col3 from tab order by col1, col2
compute sum(col3) by col1
Auto_commit |
Chained |
설 명 |
On |
On |
Begin Insert aa values('A1'); Insert ab values('A1'); ß Error발생 End =>위 Query는 두번째 Insert문장의 Error발생으로 ‘Begin ~End’ 사이의 모든 내용이 자동적으로 rollback된다. |
On |
Begin Insert aa values('A1'); Insert ab values('A1'); ß Error발생 End /* Rollback; */ =>위 Query는 두번째 Insert문장에서 Error가 발생했으나 첫번째 Insert는 Insert가 되어버린다, 뒤에 Rollback를 실행하여 Rollback할 수 있다. | |
On , Off |
Off |
Begin Insert aa values('A1'); Insert ab values('A1'); ß Error발생 End /* Rollback; */ =>위 Query수행 결과는 ‘Chained=’Off’’에 의해 첫번째 insert 문은 정상적으로 수행한다. 이 경우 ‘Begin~End’뒤에 Rollback은 첫번째 Insert를 rollback하지 못한다. |
On |
(Begin ~ End 가 없는 경우) Update TEST set a = 2 ,b = 21 WHERE a = 1 ; Rollback ; => 위의 결과는 rollback이 작용해 Update가 안된다. 이유는 Update가 실행되고 Auto_commit ‘Off’에 의해Commit이 없이 Rollback이 실행된다. | |
On |
On |
(Begin ~ End 가 없는 경우) Update TEST set a = 2 ,b = 21 WHERE a = 1 ; Rollback ; => 위의 결과는 Update가 이미 ‘Commit’되어 완료된 상태이므로 rollback이 무의미 해진다. |
On , Off |
Off |
(Begin ~ End 가 없는 경우) Update TEST set a = 2 ,b = 21 WHERE a = 1 ; Rollback ; => 위 Query수행 결과는 ‘Rollback’ 문장이 있지만 Update가 수행된다. Chained mode가 ‘Off’ 이므로 Begin~End 내에 있는 문장이 개별로 처리됨 . |
출처 : sybase
사용자가 필요에 의해 작성한 Logic을 처리하는 Procedure
※ row단위 반복 작업은 Performance가 좋지 않으므로 특히Cursor 사용을 금하는 것이 좋다.
CREATE PROCEDURE proc_name (parameter,…)
BEGIN
-- Business_logic
END
Procedure에 Parameter를 전달하거나 또는 Procedure에서 결과를 Parameter로Return 그리고 두 가지를 모두 지원하는 Parameter유형이 있다
1) 예제) Create Procedure test_prc(in cust_id char(4)
,Inout cname char(20) default NULL
,out sqty decimal(12))
2) cust_id는 input parameter로 procedure call할 때 반드시 입력
3) cname은 in-out parameter로 procedure call한 caller에 입력을 받을 뿐 아니라 Return도 한다. 그리고 default를 선언하면 입력이 없을 때default값으로 대치 한다. 위의 예에서는 Null로 대치 .
4) sqty는 procedure가 내부적인 Logic을 처리하고 최종적으로 할당된 값을 Caller 에게Return한다.
업무에 맞는 Logic를 구현하기 위해 기본적으로 데이터를 처리하는 SQL, 변수처리문, Control문이 필요하다.
Declare=> 변수 선언
Set=> 변수에 값을 할당
예제)
Declare val1 decimal(12);
Set val1= 234567;
BEGIN END |
IF … ELSE IF ELSE END IF |
CASE … WHEN … WHEN … ELSE … END CASE |
LOOP … END WHILE … |
FOR … END FOR |
LEAVE … CALL … |
(5-1) BEGIN ~ END
여러 문장을 하나의 Batch로 묶는 Command로 Procedure에는
시작과 끝을 나타냄
예)
Begin
Declare val1 integer;
Select ~~~
~~~
END ;
(5-2) IF ~ END IF
조건에 따라 분기 하거나 다른 Logic을 구현할 때 이용
예)
IF val1 = 1 Then
set val2 = 100;
Call prc1();
Elseif val1 = 2 Then
set val2 = 200;
Call prc2()
Else
Set val2 = 0;
End if;
(5-3) CASE ~ END CASE
1) 경우에 따라 값을 달리 처리하고자 할 때 이용 SELECT문 에서 사용
select CASE cust_reg WHEN 01’ then set val1 = ‘
WHEN 02’ then set val1 = ‘
WHEN 03’ then set val1 = ‘Inchen’
ELSE set val1 = ‘지방’
END
From customer;
2) CASE단독으로 사용
Case val1 WHEN ‘01’ then set val2 = ‘
WHEN ‘02’ then set val2 = ‘
WHEN ‘03’then set val1 = ‘Inchen’
ELSE set val2 = ‘지방’
END CASE;
(5-4) LOOP ~ END
반복처리를 위한 Loop문
예)
Tagloop:
Fetch next test_cur into reg, cyear, sqty;
If sqlstate = err_notfound
Leave curloop;
End if;
End loop Tagloop;
(5-5) WHILE
반복처리를 위한 While문 (dbisqlc로 실행 안됨)
예)
Begin
Declare @id int;
Select @id = 1;
While (@id < 4)
Begin
Insert aaa values(@id);
Select @id = @id +1;
End
End ;
(5-6) FOR ~ END FOR
Cursor를 처리할 때 반복 문으로 이용
예)
For curfor As test_cur
Cursor For
Select cust_reg, order_year, sum(order_qty) oqty
From customer a, order_detail b
Where a.cust_id = b.cust_id
Group by cust_reg, order_year
For read only
DO
Set reg = cust_reg;
Set cyear = order_year;
Set sqty = oqty;
End For curfor;
(5-7) LEAVE , CALL
LEAVE는 Loop문을 빠져 나올 때 이용
CALL은 Procedure를 수행 시킬 때 이용
Create procedure Test_proc(in zip char(6))
Begin
Declare err_notfound Exception for sqlstate ‘02000’;
Declare reg char(20);
Declare cyear char(4);
Declare sqty decimal(12);
Declare test_cur cursor For
Select cust_reg, order_year, sum(order_qty)
From customer a, order_detail b
Where a.cust_id = b.cust_id And cust_zip = zip
Group by cust_reg, order_year
For read only;
Open test_cur;
Curloop:
Fetch next test_cur into reg, cyear, sqty;
If sqlstate = err_notfound
Leave curloop;
End if;
End loop Curloop;
Close test_cur;
End
Error발생 시 EXCEPTION 루틴을 수행하고 PROCEDURE를 종료한다.
예)
Create proc SP_Test( out SUB_RETURN_SQL numeric(5),
out SUB_JOB_STATUS char(1),
out SUB_STATUS_MSG char(50))
Begin
Select count(*) from test;
Set SUB_STATUS_MSG=’ERROR’
EXCEPTION
When others then
Set SUB_RETURN_SQL=SQLCODE;
Set SUB_JOB_STATUS=’1’;
Rollback work;
Message ‘ERROR_MSG :‘,SUB_STATUS_MSG type info to client;
Message ‘SQL_CODE :‘,SUB_RETURN_SQL type info to client;
Return;
End;
bcp migration~~~
bcp util은 sybase 혹은 mssql에 내장되어 있는 UTIL입니다.
사용법은 다음과 같습니다.
왝~ 뭐가 이렇게 많아..
그러나 다 사용되는 놈들이랍니다.
간단히 정말 간단히 bcp 로 백업해봅시다.
bcp [[database_name.]owner.]table_name[:slice_number] {in | out} datafile
[-m maxerrors] [-f formatfile] [-e errfile]
[-F firstrow] [-L lastrow] [-b batchsize]
[-n] [-c] [-t field_terminator] [-r row_terminator]
[-U username] [-P password] [-I interfaces_file] [-S server]
[-a display_charset] [-q datafile_charset] [-z language] [-v]
[-A packet size] [-J client character set]
[-T text or image size] [-E] [-g id_start_value] [-N] [-X]
[-M LabelName LabelValue] [-labeled]
[-K keytab_file] [-R remote_server_principal]
[-V [security_options]] [-Z security_mechanism] [-Q]
예로
bcp pubs2..authors out "c:\ddd.dat" -c -Usa -P
치시면 pubs2라는 db에 authors가 ddd.dat라는 파일로 c:\에 생성됩니다.
그러면 집어넣을때는
bcp pubs2..authors in "c:\ddd.dat" -c -Usa -P
화 ~~~ 정말 간단하죠.. 그럼 아주 유용한 팁을 하나 소개하겠습니다.
dos창을 띄워서 혹은 UNIX 유저는 terminal을 하나 띄워서 다음과 같은 bcptest.sql이라는 화일을 만듭니다. 내용은 다음과 같이 적어 주세요
use pubs2
go
select 'bcp pubs2..'+name+' out '+name+'.dat -c -Usa -P' from sysobjects where type='U'
go
당연히 -P 다음에는 sa의 password를 적어야 합니다.
글구 저는 pubs2 라는 테스트 db의 테이블들을 bcp로 카피한겁니다.
그러니까 여러분은 bcp로 카피하고자 하는 테이블이 있는 데이타베이스를 적어 주세요.
화일을 저장하고 파일이 있는 디렉토리에서 다음을 실행시킵니다.
(주의:이때 위에서 c:\에서 했다고 c:\에서 실행하지 마세요.
c:\에 bcp라는 폴더를 맹글구 난다음 그 안에 bcptest.sql를 맹글구 test하십쇼)
isql -Usa -P -ibcptest.sql -oresult.sql
그럼 result.sql이 현재의 디렉토리에 생성됩니다. 내용을 보세요.
------------------------------------------------------------------------------bcp pubs2..authors out authors.dat -c -Usa -P
bcp pubs2..publishers out publishers.dat -c -Usa -P
bcp pubs2..roysched out roysched.dat -c -Usa -P
bcp pubs2..sales out sales.dat -c -Usa -P
bcp pubs2..salesdetail out salesdetail.dat -c -Usa -P
bcp pubs2..titleauthor out titleauthor.dat -c -Usa -P
bcp pubs2..titles out titles.dat -c -Usa -P
bcp pubs2..stores out stores.dat -c -Usa -P
bcp pubs2..discounts out discounts.dat -c -Usa -P
bcp pubs2..au_pix out au_pix.dat -c -Usa -P
bcp pubs2..blurbs out blurbs.dat -c -Usa -P
(11 rows affected)
다음과 같죠... 흠 이것에서 맨위에 -------
을 없애고 맨밑에 (11 rows affected)을 없애고 저장하면 ....
흐 NT에서는 이 파일을 생성할때 result.sql 말구 result.bat로 생성하세요.
글구 발로 클릭하면 현재의 디렉토리에 bcp 된 화일이 자~~르륵
UNIX에서는 chmod로 실행 퍼미션을 주시고...실행하시면 자르륵 어서 해보세요.
담은 집어넣는거 할겁니다.
출처 : http://ase.sni.co.kr/
제우스+사이베이스+jsp
엔터를 쳐서 저장한 값을 textarea 에 불러오면 옆으로 붙어서 나온다
이럴때
<%=common.toKorean(content).replaceAll("\r\n","<br>") %>
하면 엔터를 쳤던 부분이 모두 <BR> 태그로 변경되어 제대로 나온다.