저장 프로시저

저장 프로시저 또는 스토어드 프로시저(stored procedure)는 일련의 쿼리를 마치 하나의 함수처럼 실행하기 위한 쿼리의 집합이다. 데이터베이스에 대한 일련의 작업을 정리한 절차를 관계형 데이터베이스 관리 시스템에 저장한(지속성) 것으로, 영구저장모듈(Persistent Storage Module)이라고도 불린다.

개요

데이터베이스 언어 표준 SQL에서는 SQL / PSM 기준으로 책정되어 있다. 벤더(제조사) 각사 모두 정적, 동적 SQL에 커서 처리 및 제어 구문, 예외 처리 등을 포함한 사양의 확장 언어로 절차를 설명할 수 있는 DBMS를 제공하는 경우가 많다. 또한 C 언어로 작성된 컴파일한 외부 모듈(공유 라이브러리) 및 Java 클래스 라이브러리에서 함수나 클래스 메소드를 호출하는 것으로 실현하는 ‘외부 프로시저’ 기능을 구현하는 것도 있다. 저장프로시저를 사용하여 다음과 같은 장점이 있다.

  1. 하나의 요청으로 여러 SQL문을 실행할 수 있다. (네트워크에 대한 부하를 줄일 수 있다.)
  2. 미리 구문 분석 및 내부 중간 코드로 변환을 끝내야 하므로 처리 시간이 줄어든다.
  3. 데이터베이스 트리거와 결합하여 복잡한 규칙에 의한 데이터의 참조무결성 유지가 가능하게 된다. 간단히 말하면 응용 프로그램 측 로직을 가지지 않고도 데이터베이스의 데이터 앞뒤가 맞게 될 수 있다.
  4. JAVA 등의 호스트 언어와 SQL 문장이 확실하게 분리된 소스 코드의 전망이 좋아지는 것, 또한 웹사이트 등 운용 중에도 저장프로시저의 교체에 의한 수정이 가능하기 때문에 보수성이 뛰어나다.

저장프로시저를 많이 사용하면 다음과 같은 단점이 있다.

  1. 데이터베이스 제품에 대해 설명하는 구문 규칙이 SQL / PSM 표준과의 호환성이 낮기 때문에 코드 자산으로의 재사용성이 나쁘다.
  2. 비즈니스 로직의 일부로 사용하는 경우 업무의 사양 변경 시 외부 응용 프로그램과 함께 저장프로시저의 정의를 변경할 필요가 있다. 이때 불필요한 수고와 변경 실수에 의한 장애를 발생시킬 가능성이 있다.

DBMS별 예제

오라클

다음은 PL/SQL로 구현한 오라클 저장 프로시저의 예이다.

CREATE OR REPLACE PROCEDURE helloworld (str IN VARCHAR2)
  AS
     hw VARCHAR2 (100) : = 'Hello World!';
  BEGIN
     DBMS_OUTPUT. PUT_LINE ( 'Hello World!');
     DBMS_OUTPUT. PUT_LINE ( 'VARIABLE hw ='| | hw);
     DBMS_OUTPUT. PUT_LINE ( 'Parameter str ='| | str);
  END;
  /

MySQL

MySQL은 버전 5.0 이후 표준 SQL 규격 저장프로시저를 지원하고 있다. 다음은 함수와 프로시저에서 동등한 처리를 하는 예를 보여준다.

함수 예1 (DB 개입 없음)

(1) 정의

drop function if exists DecToNshin;   -- 존재한다면 삭제
delimiter //                          -- 마침 기호의 변경
create function DecToNshin
(dec_num       int,
 n_shin        tinyint)
 returns varchar(32)
--
-- 10진수→n진수
--
begin
 declare ltr          char(36) default '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
 declare w_dec_num    int;
 declare amari        int;
 declare w_DecToNshin varchar(32);
 set w_DecToNshin='';
 set w_dec_num=dec_num;
 while w_dec_num>=n_shin do
  set amari=mod(w_dec_num,n_shin);
  set w_DecToNshin=concat(substr(ltr,amari+1,1),w_DecToNshin);
  set w_dec_num=w_dec_num div n_shin;
 end while;
 set w_DecToNshin=concat(substr(ltr,w_dec_num+1,1),w_DecToNshin);
 return w_DecToNshin;
end;
//
delimiter ;                       -- 마침기호 취소

(2) 실행

SELECT DecToNshin(100,16);        -- 100을 16진수로 하면?

프로시저의 예1 (DB 개입 없음)

(1) 정의

drop procedure if exists DecToNshin;   -- 존재한다면 삭제
delimiter //                           -- 마침기호 변경
create procedure DecToNshin
(in dec_num int,
 in n_shin tinyint,
 out w_DecToNshin varchar(32))
--
-- 10진수→n진수
--
begin
 declare ltr          char(36) default '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
 declare w_dec_num    int;
 declare amari        int;
 set w_DecToNshin='';
 set w_dec_num=dec_num;
 while w_dec_num>=n_shin do
  set amari=mod(w_dec_num,n_shin);
  set w_DecToNshin=concat(substr(ltr,amari+1,1),w_DecToNshin);
  set w_dec_num=w_dec_num div n_shin;
 end while;
 set w_DecToNshin=concat(substr(ltr,w_dec_num+1,1),w_DecToNshin);
end;
//
delimiter ;                            -- 마침 기호 취소

(2) 실행

CALL DecToNshin(100,16,@RSLT);         -- 100을 16진수로 하면?
SELECT @RSLT;                          -- 마침 표시

함수 예제2 (DB 작업 있음)

(1) 테이블 정의 및 데이터

create table gengou
(bgn_date    date,
 end_date    date,
 gengou_name varchar(4));
insert into gengou values
('1868-01-01','1912-07-30','메이지'),
('1912-07-30','1926-12-25','다이쇼'),
('1926-12-25','1989-01-07','쇼'),
('1989-01-08','2019-04-30','헤이세이');

(2) 정의

drop function if exists cng_gengou;   -- 존재한다면 삭제
delimiter //                          -- 마침기호 변경
create function cng_gengou
(p_seireki_date date)
 returns varchar(30)
--
-- 서기→일본력
--
begin
 declare w_rcnt        int         default 0;    -- 행 line  확인
 declare w_gengou_name varchar(4)  default '';   -- 연호명
 declare w_bgn_date    date;                     -- 시작일
 declare w_nensuu      tinyint     default 0;    -- 일본력 년
 declare w_rslt        varchar(30) default '';   -- 결과
-- 
 select count(*)
  into w_rcnt
  from gengou
  where bgn_date<=p_seireki_date and end_date>=p_seireki_date;
 if w_rcnt>1 then
  set w_rslt='2행 이상 존재하기 때문에 지원하지 않음';
 else
  select gengou_name,bgn_date
   into w_gengou_name,w_bgn_date
   from gengou
   where bgn_date<=p_seireki_date and end_date>=p_seireki_date;
  if length(w_gengou_name)>0 then
   set w_nensuu=year(p_seireki_date)-year(w_bgn_date)+1;
   set w_rslt=concat(w_gengou_name,cast(w_nensuu as char(2)));
  else
   set w_rslt='change unsuccessful';
  end if;
 end if;
 return w_rslt;
end;
//
delimiter ;                       -- 종결기호 취소

(3) 실행

select cng_gengou('2006-07-19');

프로시저 예제2 (DB 작업 있음, 비켜서 작업)

(1) 테이블 정의 및 데이터

"함수 예제2 (DB 작업 있음)"와 같다.

(2) 정의

drop procedure if exists cng_gengou;   -- 존재한다면 삭제
delimiter //                          -- 마침기호 변경
create procedure cng_gengou
(in  p_seireki_date date,
 out p_rslt         varchar(30))
--
-- 서기→일본력
--
begin
 declare w_rcnt        int         default 0;    -- 행 line 확인
 declare w_gengou_name varchar(4)  default '';   -- 연호이름
 declare w_bgn_date    date;                     -- 시작일
 declare w_nensuu      tinyint     default 0;    -- 일본력 년
-- 
 select count(*)
  into w_rcnt
  from gengou
  where bgn_date<=p_seireki_date and end_date>=p_seireki_date;
 if w_rcnt>1 then
  set p_rslt='2행 이상 존재하기 때문에 지원하지 않음';
 else
  select gengou_name,bgn_date
   into w_gengou_name,w_bgn_date
   from gengou
   where bgn_date<=p_seireki_date and end_date>=p_seireki_date;
  if length(w_gengou_name)>0 then
   set w_nensuu=year(p_seireki_date)-year(w_bgn_date)+1;
   set p_rslt=concat(w_gengou_name,cast(w_nensuu as char(2)));
  else
   set p_rslt='change unsuccessful';
  end if;
 end if;
end;
//
delimiter ;                       -- 마침기호 취소

(3) 실행

call cng_gengou('2006-07-19',@rslt);
select @rslt;

프로시저 예제3 (DB 작업 있음, 커서 작업)

(1) 테이블 정의 및 데이터

"함수 예제2 (DB작업 있음)"와 같다.

(2) 정의

drop procedure if exists cng_gengou;   -- 존재한다면 삭제
delimiter //                          -- 마침기호 변경
create procedure cng_gengou
(in  p_seireki_date date,
 out p_rslt         varchar(30))
--
-- 서기→일본력
--
begin
 declare w_rcnt        int         default 0;    -- 행 수 확인
 declare w_gengou_name varchar(4)  default '';   -- 연호이름
 declare w_bgn_date    date;                     -- 시작일
 declare w_nensuu      tinyint     default 0;    -- 일본력 년
 declare eod           tinyint;
-- 커서 선언
 declare cr1 cursor for
  select gengou_name,bgn_date
   from gengou
   where bgn_date<=p_seireki_date and end_date>=p_seireki_date;
-- 예외 선언
 declare continue handler for not found set eod=1;

 set eod=0;
 open cr1;
 fetch cr1 into w_gengou_name,w_bgn_date;
 while eod=0 do
  set w_rcnt=w_rcnt+1;
  if w_rcnt>1 then
   set p_rslt='2행 이상 존재하기 때문에 지원하지 않음';
  else
   if length(w_gengou_name)>0 then
    set w_nensuu=year(p_seireki_date)-year(w_bgn_date)+1;
    set p_rslt=concat(w_gengou_name,cast(w_nensuu as char(2)));
   else
    set p_rslt='change unsuccessful';
   end if;
  end if;
  fetch cr1 into w_gengou_name,w_bgn_date;
 end while;
 close cr1;
end;
//
delimiter ;                       -- 종결기호 취소

(3) 실행

call cng_gengou('2006-08-10',@rslt);
select @rslt;

외부 링크

Read other articles:

Drvenik VeliFoto satelit Drvenik VeliGeografiLokasiLaut AdriatikKoordinat43°26′39″N 16°08′44″E / 43.444226°N 16.145439°E / 43.444226; 16.145439Koordinat: 43°26′39″N 16°08′44″E / 43.444226°N 16.145439°E / 43.444226; 16.145439Luas12.07 km2Titik tertinggi178 mPemerintahanNegara KroasiaKabupatenSplit-DalmatiaKependudukanPenduduk150 jiwa (2011) Pulau Drvenik Veli (bahasa Italia: Zirona Grande) ...

 

Sergio Romero Informasi pribadiNama lengkap Sergio Germán Romero[1]Tanggal lahir 22 Februari 1987 (umur 37)Tempat lahir Bernardo de Irigoyen, ArgentinaTinggi 192 cm (6 ft 4 in)[2]Posisi bermain Penjaga gawangInformasi klubKlub saat ini VeneziaNomor 88Karier junior1996–1997 Almirante Brown1997–2003 CAI2003–2006 Racing ClubKarier senior*Tahun Tim Tampil (Gol)2006–2007 Racing Club 5 (0)2007–2011 AZ Alkmaar 90 (0)2011–2015 Sampdoria 71 (0)2013–2...

 

Julian Brandt Brandt bersama Leverkusen pada tahun 2014.Informasi pribadiNama lengkap Julian Brandt[1]Tanggal lahir 2 Mei 1996 (umur 27)Tempat lahir Bremen, JermanTinggi 1,85 m[2]Posisi bermain Gelandang serangInformasi klubKlub saat ini Borussia DortmundNomor 19Karier junior2001–2009 SC Borgfeld2009–2011 FC Oberneuland2011–2013 VfL WolfsburgKarier senior*Tahun Tim Tampil (Gol)2014 Bayer Leverkusen II 1 (1)2014–2019 Bayer Leverkusen 165 (34)2019- Borussia Dortmun...

1999 studio album by Cosmic BabyHeavenStudio album by Cosmic BabyReleased1999Recorded1998GenreTechno, trance, house, chill-out, electro, Balearic beat, breakbeatLength77:19LabelIntercordCosmic Baby chronology Fourteen Pieces(1996) Heaven(1999) Die Toteninsel(2006) Heaven is a music album by techno/trance artist Cosmic Baby which was released in 1999. It is Cosmic Baby's fourth full-length album. It was his final album before his break from recording as Cosmic Baby, as well as his fina...

 

Voce principale: Casertana Football Club. Unione Sportiva CasertanaStagione 1982-1983Sport calcio Squadra Casertana Allenatore Vincenzo Montefusco Presidente Raffaele Cammarota Serie C15º posto nel girone B. Maggiori presenzeCampionato: Urbano (34) Miglior marcatoreCampionato: Alivernini (12) 1981-1982 1983-1984 Si invita a seguire il modello di voce Questa pagina raccoglie le informazioni riguardanti l'Unione Sportiva Casertana nelle competizioni ufficiali della stagione 1982-1983. In...

 

Provincial government of British Columbia, Canada Government of British ColumbiaProvincial governmentOverviewEstablishedJuly 20, 1871 (1871-07-20)StateBritish ColumbiaCountryCanadaLeaderPremierAppointed byLieutenant GovernorMain organExecutive CouncilResponsible toLegislative AssemblyHeadquartersVictoriaWebsitewww2.gov.bc.ca The Government of British Columbia (French: Gouvernement de la Colombie-Britannique) is the body responsible for the administration of the Canadian provinc...

German epic poem Title page of the first edition, without the author's name. Oberon is an epic poem by the German writer Christoph Martin Wieland. It was based on the epic romance Huon de Bordeaux, a French medieval tale,[1] and influenced by Shakespeare's A Midsummer Night's Dream and Alexander Pope's version of Geoffrey Chaucer's The Merchant's Tale.[2] It first appeared in 1780 and went through seven rewrites before its final form was published in 1796. Plot For the slaying...

 

Державний комітет телебачення і радіомовлення України (Держкомтелерадіо) Приміщення комітетуЗагальна інформаціяКраїна  УкраїнаДата створення 2003Керівне відомство Кабінет Міністрів УкраїниРічний бюджет 1 964 898 500 ₴[1]Голова Олег НаливайкоПідвідомчі ор...

 

British films released in 1933 Cinema of theUnited Kingdom List of British films British horror 1888–1919 1920s 1920 1921 1922 1923 19241925 1926 1927 1928 1929 1930s 1930 1931 1932 1933 19341935 1936 1937 1938 1939 1940s 1940 1941 1942 1943 19441945 1946 1947 1948 1949 1950s 1950 1951 1952 1953 19541955 1956 1957 1958 1959 1960s 1960 1961 1962 1963 19641965 1966 1967 1968 1969 1970s 1970 1971 1972 1973 19741975 1976 1977 1978 1979 1980s 1980 1981 1982 1983 19841985 1986 1987 1988 1989 1990...

Public university in Benguet, Philippines Benguet State UniversityPamantasang Pampamahalaan ng Benguet (Filipino)Former names List La Trinidad Farm School (1916–1920)[1] Trinidad Agricultural School (1920–1946)[1] La Trinidad Agricultural High School[1] La Trinidad National Agricultural School[1] Mountain National Agricultural School[1] Mountain National College[1] Mountain Agricultural College[1] Mountain State Agricultural Col...

 

Artikel atau sebagian dari artikel ini mungkin diterjemahkan dari Sadruddin Aga Khan di en.wikipedia.org. Isinya masih belum akurat, karena bagian yang diterjemahkan masih perlu diperhalus dan disempurnakan. Jika Anda menguasai bahasa aslinya, harap pertimbangkan untuk menelusuri referensinya dan menyempurnakan terjemahan ini. Anda juga dapat ikut bergotong royong pada ProyekWiki Perbaikan Terjemahan. (Pesan ini dapat dihapus jika terjemahan dirasa sudah cukup tepat. Lihat pula: panduan pener...

 

Fubuki-class destroyer For other ships with the same name, see Japanese destroyer Yūgiri. Yūgiri underway on 29 November 1930. History Empire of Japan NameYūgiri NamesakeJapanese destroyer Yūgiri (1899) Ordered1923 Fiscal Year BuilderMaizuru Naval Arsenal Yard numberDestroyer No. 48 Laid down1 April 1929 Launched12 May 1930 Commissioned3 December 1930 Stricken12 December 1943 FateSunk 25 November 1943 General characteristics Class and typeFubuki-class destroyer Displacement 1,75...

هذه المقالة تحتاج للمزيد من الوصلات للمقالات الأخرى للمساعدة في ترابط مقالات الموسوعة. فضلًا ساعد في تحسين هذه المقالة بإضافة وصلات إلى المقالات المتعلقة بها الموجودة في النص الحالي. (يونيو 2016) وسم حقيبة حديث. وسم الحقيبة تستخدم عادةً بواسطة شركات الحافلات، القطارات، والر...

 

Der Titel dieses Artikels ist mehrdeutig. Weitere Bedeutungen sind unter Thann (Begriffsklärung) aufgeführt. Thann Thann (Frankreich) Staat Frankreich Region Grand Est Département (Nr.) Haut-Rhin (68) Arrondissement Thann-Guebwiller (Unterpräfektur) Kanton Cernay Gemeindeverband Thann-Cernay Koordinaten 47° 48′ N, 7° 6′ O47.8066666666677.1044444444444Koordinaten: 47° 48′ N, 7° 6′ O Höhe 328–922 m Fläche 12,51 km² Einwohne...

 

Presiding officer of a legislative body Mr Speaker redirects here. For the American racehorse, see Mr Speaker (horse). Speakers and presiding officers from various Commonwealth nations meet for a Commonwealth Speakers and Presiding Officers Conference in Wellington, New Zealand, 1984 Marshal's chair in the Sejm, lower chamber of the Polish Parliament The speaker of a deliberative assembly, especially a legislative body, is its presiding officer, or the chair. The title was first used in 1377 ...

French philosopher (1926–1984) Foucault redirects here. For other uses, see Foucault (disambiguation). Michel FoucaultFoucault in 1974BornPaul-Michel Foucault15 October 1926Poitiers, FranceDied25 June 1984(1984-06-25) (aged 57)Paris, FranceEducation École normale supérieure (BA, MA) University of Paris (BA, SpDip, PhD) Notable workMadness and Civilization (1961)The Birth of the Clinic (1963)The Order of Things (1966)Discipline and Punish (1975)The History of Sexuality (1976)PartnerDa...

 

This article may contain an excessive amount of intricate detail that may interest only a particular audience. Please help by spinning off or relocating any relevant information, and removing excessive detail that may be against Wikipedia's inclusion policy. (June 2023) (Learn how and when to remove this message) 2010 television miniseries directed by Sergio Mimica-Gezzan The Pillars of the EarthGenreHistorical dramaBased onThe Pillars of the Earthby Ken FollettScreenplay byJohn PielmeierStor...

 

美軍慰安婦可以指: 美军慰安妇 (日本) 美軍慰安婦 (韓國) 这是一个消歧义页,羅列了有相同或相近的标题,但內容不同的条目。如果您是通过某條目的内部链接而转到本页,希望您能協助修正该處的内部链接,將它指向正确的条目。

Imitative work created to mock, comment on or trivialise an original work A parody is a creative work designed to imitate, comment on, and/or mock its subject by means of satirical or ironic imitation. Often its subject is an original work or some aspect of it (theme/content, author, style, etc), but a parody can also be about a real-life person (e.g. a politician), event, or movement (e.g. the French Revolution or 1960s counterculture). Literary scholar Professor Simon Dentith defines parody...

 

العبل موقع محافظة الدوادمي بالنسبة لمنطقة الرياض تاريخ التأسيس 1375 هـ تقسيم إداري البلد  السعودية التقسيم الأعلى منطقة الرياض  المسؤولون رئيس المركز مشعل بن نافل بن محيا السكان التعداد السكاني غير معروف نسمة (إحصاء ) تعديل مصدري - تعديل   العبل، هي قرية من فئة (ب) تقع ...