반응형

7.1.3 사용자Procedure

사용자가 필요에 의해 작성한 Logic 처리하는 Procedure

row단위 반복 작업은 Performance 좋지 않으므로 특히Cursor 사용을 금하는 것이 좋다.

1)       Syntax

 


CREATE PROCEDURE proc_name (parameter,…)

BEGIN

-- Business_logic

END

 


2)       Parameter

Procedure Parameter 전달하거나 또는 Procedure에서 결과를 ParameterReturn 그리고 가지를 모두 지원하는 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한다.

3)       Business Logic

업무에 맞는 Logic 구현하기 위해 기본적으로 데이터를 처리하는 SQL, 변수처리문, Control문이 필요하다.

 

4)       변수 처리문

Declare=> 변수 선언

Set=> 변수에 값을 할당

예제)

Declare  val1 decimal(12);

Set val1= 234567;

5)       Control

BEGIN

END

IF …

ELSE IF

ELSE

END IF

 

CASE …

WHEN …

WHEN …

ELSE …

END CASE

LOOP …

END LOOP

 

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 = ‘Seoul

WHEN 02’ then set val1 = ‘Pusan

WHEN 03’ then set val1 = ‘Inchen’

ELSE    set val1 = ‘지방

END

From      customer; 

2)  CASE단독으로 사용

Case val1  WHEN ‘01’ then set val2 = ‘Seoul

WHEN ‘02’ then set val2 = ‘Pusan

WHEN ‘03’then set val1 = ‘Inchen’

ELSE set val2 = ‘지방

END CASE;

(5-4) LOOP ~ END LOOP

반복처리를 위한 Loop

)

Tagloop:  Loop

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 수행 시킬 이용

 

6)       Stored 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:

Loop

Fetch next test_cur into reg, cyear, sqty;

If sqlstate = err_notfound

Leave curloop;

End if;

End loop Curloop;

Close test_cur;

End

 

7)       Error 처리 EXCEPTION

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> 태그로 변경되어 제대로 나온다.

+ Recent posts