1. SQL 저장 프로시저 개요
대규모 데이터베이스 시스템에서는 저장 프로시저와 트리거가 중요한 역할을 합니다. 저장 프로시저든 트리거든 SQL 문과 흐름 제어 명령문의 모음입니다. 본질적으로 트리거도 저장 프로시저입니다. 저장 프로시저는 작업 중에 실행 메서드를 생성하므로 나중에 다시 실행할 때 매우 빠르게 실행됩니다. SQL Server 2000은 사용자 정의 저장 프로시저 기능을 제공할 뿐만 아니라 도구로 사용할 수 있는 다양한 시스템 저장 프로시저를 제공합니다.
1.1 개념
저장 프로시저 ( 저장 프로시저)는 특정 기능을 완료하기 위한 SQL 문 집합으로, 컴파일되어 데이터베이스에 저장됩니다. 사용자는 이름을 지정하고 매개변수(저장 프로시저에 매개변수가 있는 경우)를 제공하여 저장 프로시저를 실행합니다.
SQL Server 시리즈 버전에서 저장 프로시저는 시스템 제공 저장 프로시저와 사용자 정의 저장 프로시저라는 두 가지 범주로 나뉩니다. 시스템 프로시저는 주로 마스터 데이터베이스에 저장되며 접두사 sp_가 붙으며, 시스템 저장 프로시저는 주로 시스템 테이블에서 정보를 가져오므로 시스템 관리자가 SQL Server를 관리할 수 있도록 지원합니다. 시스템 저장 프로시저를 통해 MS SQL Server의 많은 관리 또는 정보 활동(예: 데이터베이스 개체 및 데이터베이스 정보 이해)을 원활하고 효과적으로 완료할 수 있습니다. 이러한 시스템 저장 프로시저는 master 데이터베이스에 배치되지만 데이터베이스 이름 앞에 저장 프로시저 이름을 붙이지 않고도 다른 데이터베이스에서 계속 호출할 수 있습니다. 그리고 새 데이터베이스가 생성되면 일부 시스템 저장 프로시저가 새 데이터베이스에 자동으로 생성됩니다. 사용자 정의 저장 프로시저는 사용자가 생성하고 특정 기능(예: 사용자가 요구하는 데이터 정보 쿼리)을 완료할 수 있는 저장 프로시저입니다. 이 장에서 언급되는 저장 프로시저는 주로 사용자 정의 저장 프로시저를 의미합니다.
1.2 저장 프로시저의 장점
Transaction-SQL은 MS SQL Server를 사용하여 애플리케이션을 만들 때 기본으로 사용되는 프로그래밍 언어입니다. 프로그래밍에 Transaction-SQL을 사용하는 경우 두 가지 방법이 있습니다. 하나는 Transaction-SQL 프로그램을 로컬에 저장하고 결과를 처리하기 위해 SQL Server에 명령을 보내는 애플리케이션을 만드는 것입니다. 두 번째는 Transaction-SQL로 작성된 일부 프로그램을 SQL Server의 저장 프로시저로 저장할 수 있고 저장 프로시저를 호출하고 데이터 결과를 처리하는 응용 프로그램을 만들 수 있으며 저장 프로시저는 매개 변수를 수신하여 호출자에게 결과 집합을 반환할 수 있습니다. 결과 집합의 형식은 호출자에 의해 결정되며 호출의 성공 여부를 나타내는 상태 값을 반환하며 데이터베이스에 대한 작업 문을 포함하고 저장 프로시저에서 다른 저장 프로시저를 호출할 수 있습니다.
우리는 일반적으로 클라이언트 컴퓨터에서 Transaction-SQL로 작성된 프로그램을 호출하는 대신 SQL Server에서 저장 프로시저를 사용하는 두 번째 방법을 선호합니다. 저장 프로시저에는 다음과 같은 장점이 있기 때문입니다.
1) 저장 프로시저는 표준 컴포넌트 프로그래밍을 허용합니다
저장 프로시저가 생성된 후에는 저장 프로시저의 SQL 문을 다시 작성할 필요 없이 프로그램에서 여러 번 호출할 수 있습니다. 또한 데이터베이스 전문가는 언제든지 저장 프로시저를 수정할 수 있지만 이는 애플리케이션 소스 코드에 아무런 영향을 미치지 않습니다(애플리케이션 소스 코드에는 저장 프로시저의 호출 문만 포함되어 있기 때문). 따라서 프로그램의 이식성이 크게 향상됩니다.
(2) 저장 프로시저는 더 빠른 실행 속도를 얻을 수 있습니다
작업에 대량의 Transaction-SQL 코드가 포함되어 있거나 여러 번 실행되는 경우 저장 프로시저가 일괄 처리보다 빠릅니다. 훨씬 빠릅니다. 저장 프로시저는 미리 컴파일되어 있기 때문에 저장 프로시저가 처음 실행될 때 쿼리 최적화 프로그램은 이를 분석하고 최적화한 후 최종적으로 시스템 테이블에 저장되는 실행 계획을 제공합니다. 일괄 Transaction-SQL 문은 실행될 때마다 컴파일하고 최적화해야 하므로 속도가 상대적으로 느립니다.
(3) 저장 프로시저는 네트워크 트래픽을 줄일 수 있습니다
데이터베이스 객체에 대한 동일한 작업(예: 쿼리, 수정)에 대해 이 작업에 포함된 Transaction-SQL 문을 다음과 같이 구성하면 됩니다. 저장 프로시저를 사용하면 클라이언트 컴퓨터에서 저장 프로시저를 호출할 때 호출 문만 네트워크에 전송됩니다. 그렇지 않으면 여러 SQL 문이 되어 네트워크 트래픽이 크게 증가하고 네트워크 부하가 줄어듭니다.
(4) 저장 프로시저를 보안 메커니즘으로 최대한 활용 가능
시스템 관리자는 특정 저장 프로시저의 실행 권한을 제한하여 해당 데이터에 대한 접근을 제한할 수 있습니다. 데이터에 접근하지 못하게 하고 데이터 보안을 보장합니다. (이러한 저장 프로시저의 적용에 대해서는 14장 "SQL Server의 사용자 및 보안 관리"에서 보다 명확하게 소개합니다.)
참고: 저장 프로시저에는 매개변수와 반환값이 모두 있지만 함수와는 다릅니다. 저장 프로시저의 반환 값은 실행 성공 여부만 나타낼 뿐이며 함수처럼 직접 호출할 수는 없습니다. 즉, 저장 프로시저 호출 시 저장 프로시저 이름 앞에 EXEC 예약어가 있어야 합니다.
2. 기본 구문 2.1 저장 프로시저 생성
프로시저 생성 sp_name //sp_name 저장 프로시저에 부여하는 이름
Begin
……
End
Proc dbo 생성
저장 프로시저 매개변수
AS
실행문
RETURN
실행 저장 프로시저
GO
예:
-- 저장 프로시저를 생성할 데이터베이스
테스트 사용
-- 생성할 저장 프로시저 이름이 존재하는지 확인
if Exists(Select name From sysobjects Where name='csp_AddInfo' And
type='P')
-- 저장 프로시저 삭제
삭제 프로시저 dbo .csp_AddInfo
이동
-- 저장 프로시저 생성
Proc dbo.csp_AddInfo 생성
- - 저장된 프로시저 매개변수
@UserName varchar(16),
@Pwd varchar(50),
@Age smallint,
@*** varchar(6)
AS
-- 저장 프로시저 문 본문
Uname(UserName,Pwd,Age,***)에 삽입
값(@UserName,@Pwd,@Age,@***)
RETURN
-- 실행
GO
--저장 프로시저 실행
EXEC csp_AddInfo 'Junn.A','123456',20,'Male'
새 이름 저장 프로시저. 프로시저 이름은 식별자 규칙을 따라야 하며 데이터베이스와 해당 소유자에 대해 고유해야 합니다.
로컬 임시 프로시저를 생성하려면 프로시저_이름 앞에 숫자 문자(##프로시저_이름)를 추가하면 됩니다. 전역 임시 프로시저를 생성하려면 프로시저_이름 앞에 숫자 문자 두 개(##프로시저_이름)를 추가하면 됩니다. 전체 이름(# 또는 ## 포함)은 128자를 초과할 수 없습니다. 프로세스 소유자의 이름을 지정하는 것은 선택 사항입니다.
2.2 호출 저장 프로시저
호출 프로시저 sp-name()
참고: 저장 프로시저 뒤에 괄호를 추가해야 합니다. 프로시저 이름, 저장 프로시저에 전달된 매개변수가 없는 경우에도
1) 첫 번째 방법: 출력 매개변수 사용
AdventureWorks 사용;
GO
IF OBJECT_ID( 'Production.usp_GetList', 'P' )가 NULL이 아닌 경우
삭제 절차 Production.usp_GetList;
GO
프로시저 생성 Production.usp_GetList
@product varchar(40)
, @maxprice Money
, @compareprice Money OUTPUT
, @listprice Money OUT
AS
SELECT p.name AS Product, p.ListPrice AS 'List Price'
FROM Production.Product p
JOIN Production.ProductSubcategory s
ON p.ProductSubcategoryID = s.ProductSubcategoryID
s.name이 @product AND p.ListPrice < 🎜>- - 출력 변수 @listprice를 채웁니다.
SET @listprice = (SELECT MAX(p.ListPrice)
FROM Production.Product p
JOIN Production.ProductSubcategory s
ON p.ProductSubcategoryID = s.ProductSubcategoryID
WHERE s.name LIKE @product AND p.ListPrice < @maxprice);
-- 출력 변수를 채웁니다. @compareprice.
SET @compareprice = @maxprice;
GO
--또 하나 저장 프로시저 호출 시:
Create Proc Test
as
DECLARE @compareprice Money, @cost Money
EXECUTE Production.usp_GetList '%Bikes%' , 700,
@compareprice OUT,
@cost OUTPUT
IF @cost <= @compareprice
시작
인쇄 ' 이 제품은
$'+RTRIM(CAST(@compareprice AS varchar(20)))+'.'
END
ELSE< 미만으로 구매하실 수 있습니다. 🎜 >
PRINT '이 카테고리의 모든 제품 가격은$'+ RTRIM(CAST(@compareprice AS varchar(20)))+'.'<🎜을 초과합니다. >
2) 두 번째 방법: 임시 테이블 만들기
create proc GetUserName
asbegin
'UserName' 선택 end
테이블 만들기 #tempTable(userName nvarchar(50))
insert into #tempTable(userName)
exec GetUserName
select #tempTable
-- 이후 사용, 임시 테이블 지우기
시작
...
end
프로시저 b
시작
.. .
insert #table exec c
select * from #table
end
procedure c
begin
...
select * from sometable
end
--여기서 a는 b의 결과 집합을 조정하고 b에도 그러한 응용 프로그램이 있습니다. 이는 허용되지 않습니다.
-"INSERT EXEC 문은 사용할 수 없습니다. 중첩되었습니다."라는 메시지가 보고됩니다. "실수입니다. 실제 응용에서는 이러한 유형의 응용을 피해야 합니다.
3) 세 번째 방법: 변수를 선언하고 exec(@sql)로 실행:
2.3 저장 프로시저 삭제,
drop 프로시저 sp_name//
참고: 저장 프로시저 내에서 다른 저장 프로시저를 삭제할 수 없으며 다른 저장 프로시저만 호출할 수 있습니다.
2.4 저장 프로시저 정보 보기
1.프로시저 상태 표시
속해 있는 데이터베이스, 저장 프로시저의 이름, 생성 시간 등을 포함하여 데이터베이스에 있는 모든 저장 프로시저의 기본 정보를 표시합니다.
2.show create Procedure sp_name
표시 특정 mysql 저장 프로시저의 세부 정보
댓글 2.5개
MySQL 저장 프로시저는 두 가지 스타일의 댓글을 사용할 수 있습니다.
이중 가로 막대: --
이 스타일은 일반적으로 한 줄 주석에 사용됩니다.
c 스타일: /* Comment content */ 여러 줄 주석에 일반적으로 사용됩니다.
2.6 루프 문 2.6.1 If
IF 조건
BEGIN
실행문
END
ELSE
BEGIN
실행문
END
IF @d = 1
BEGIN
-- 인쇄
'올바름' 인쇄
END
ELSE BEGIN
'잘못' 인쇄
END
2.6.2 다중 조건 선택 문
SQL의 다중 조건 선택 문입니다.
DECLARE @ iRet INT, @PKDisp VARCHAR(20)
SET @iRet = 1
@iRet =
CASE
선택 @ PKDisp = '一' THEN 1
WHEN @PKDisp = '이' THEN 2
WHEN @PKDisp = '3' THEN 3
WHEN @PKDisp = '4' THEN 4
WHEN @PKDisp = 'five' THEN 5
ELSE 100
END
2.6.3 루프문
WHILE 조건 BEGIN
실행 문
END
예: CREATE PROCEDURE [dbo].[P_TestWhilr]
as
@i INT 선언
SET @i = 1
WHILE @i<1000000 BEGIN
set @i=@i+1
END
--인쇄
PRINT @i
exec [dbo].[P_TestWhilr]
3. 매개변수 변수 3.1 변수 및 정의
사용자 정의 변수: DECLARE a INT a=100; DECLARE a INT DEFAULT 100;
변수는 사용자 변수와 시스템 변수로 구분됩니다. 변수, 시스템 변수는 세션 변수와 전역 수준 변수로 구분됩니다.
사용자 변수: 사용자 변수 이름은 일반적으로 @로 시작합니다. .사용자 변수를 남용하면 프로그램의 이해와 관리가 어려워집니다.
--변수 선언, SQL에서 변수를 선언할 때 변수 앞에 @ 기호를 추가해야 합니다.
DECLARE @I INT
-- 변수 할당, 변수 할당 시 set을 추가해야 함
SET @I = 30
--여러 변수 선언
DECLARE @s varchar(10) ,@a INT
3.2 연산자 3.2.1 산술 연산자
+ SET var1=2+2 4
빼기 SET var2=3-2 ; 1
* 곱하기 SET var3=3*2; 6
/ 나누기 SET var4=10/3; 3.3333
DIV 분할성 SET var5=10 DIV 3; %3; 1
> 1보다 큼>2 False
<= 2보다 작거나 같음<=2 True
>= 3보다 크거나 같음>=2 True
BETWEEN 두 값 사이 5 BETWEEN 1 AND 10 True
NOT BETWEEN 두 값 사이가 아님 5 NOT BETWEEN 1 AND 10 False
IN 집합에 있음 5 IN(1,2,3,4) False
NOT IN이 집합에 없음 5 NOT IN(1,2 ,3,4) True
=는 2=3과 같습니다 False
<>, !=는 2<>3과 같지 않습니다. False
< ;=> 동치 NULL<=>NULL True
LIKE 단순 패턴 매칭 "Guy Harrison" LIKE "Guy%" True
REGEXP 정규식 매칭 "Guy Harrison" REGEXP "[ Gg]reg" False
IS NULL은 비어 있음 0 IS NULL False
IS NOT NULL은 비어 있지 않음 0 IS NOT NULL True
<< 왼쪽 시프트
>> 오른쪽 시프트
~ 아님(단항 연산, 비트 단위 부정)
프로시저 생성 |function([[IN |OUT |INOUT ] 매개변수 이름 데이터 유형...])
IN 입력 매개변수
는 저장 프로시저를 호출할 때 매개변수 값을 지정해야 함을 나타냅니다. 이 매개변수의 수정된 값은 반환될 수 없습니다. , 기본값입니다
OUT 출력 매개변수
저장 프로시저 내부에서 값을 변경하고 반환할 수 있습니다
INOUT 입출력 매개변수
호출 시 지정하고,
if (@a>@b)
-- 호출
@Returnc int 선언
exec P_Max 2,3,@Returnc 출력
@Returnc 선택
5. 함수 라이브러리
MySQL 저장 프로시저 기본 함수에는 문자열 유형, 숫자 유형, 날짜 유형
5.1 문자열 class
CHARSET(str) //문자열 문자 집합 반환
CONCAT(string2 [,… ]) //연결 문자열
INSTR(string, substring) // 문자열이 있는 위치를 반환합니다. 하위 문자열이 문자열에 먼저 나타납니다. 존재하지 않으면 0을 반환합니다.
LCASE(string2) //소문자로 변환
LEFT(string2, length) //string2의 왼쪽부터 length 문자를 가져옵니다.
LENGTH( string) //문자열 길이
LOAD_FILE(file_name) //파일에서 내용 읽기
LOCATE(하위 문자열, 문자열 [,start_position]) INSTR과 동일하지만 시작 위치를 지정할 수 있습니다
LPAD(string2, length,pad) //문자열 길이가 length가 될 때까지 문자열의 시작 부분에 pad를 반복해서 추가
LTRIM (string2) //앞 공백 제거
REPEAT (string2,count) //횟수 반복
REPLACE (str, search_str, replacement_str) //search_str
RPAD를 str의 replacement_str로 교체(string2, length, pad) //길이가 길이가 될 때까지 str 뒤에 패드 추가
RTRIM(string2) //백엔드 공간 제거
STRCMP(string1, string2) //두 문자열의 크기를 문자별로 비교합니다.
SUBSTRING(str, position [,length]) //str 위치에서 시작하고 길이 문자를 취합니다.
참고 : MySQL에서 문자열을 처리할 때 기본 첫 번째 문자 첨자는 1입니다. 즉, 매개변수 위치는 1보다 크거나 같아야 합니다.
mysql> select substring('abcd',0,2);
+ —— ——————–+
| 하위 문자열('abcd',0,2) |
+———————–+
+—— ———— —–+
세트의 1개 행(0.00초)
+———————— –+
| 하위 문자열('abcd',1,2) |
+————————+
|ab |
+———————– +
세트의 1행(0.02초)
UCASE( string2) //대문자로 변환
RIGHT(string2,length) //string2의 마지막 길이 문자 가져오기
SPACE(count) //카운트 공백 생성
BIN(십진수) //십진수에서 이진수로
CEILING(숫자2) //반올림
CONV(number2,from_base,to_base) //변환
FLOOR (number2) // 내림
FORMAT (number,decimal_places) //소수점 자릿수 유지
HEX (DecimalNumber) //16진수로 변환
참고: 문자열은 HEX( ), HEX('DEF') 반환 4142143
과 같은 ASC-11 코드가 반환됩니다. 또한 10진수 정수를 전달하고 HEX(25) 반환 19LEAST(숫자, 숫자2 [, ..]) //최소값 찾기
MOD(분자,분모) //나머지 찾기
POWER(숫자,제곱) //지수 찾기
RAND([seed]) //난수
ROUND (number [,decimals ]) //반올림, 소수는 소수 자릿수입니다.]
참고: 다음과 같이 모든 반환 유형이 정수는 아닙니다. :
(1)은 기본적으로 정수 값이 됩니다.
mysql> select round(1.23);+————-+
| round(1.23) |
+ ————-+
| 1 |
+ ————-+
1행(0.00초)
mysql> 라운드 선택(1.56);
| 라운드(1.56) |
+————-+
| 2 |
+————-+
세트 1개( 0.00초)
(2) 소수는 자릿수 설정 가능, 부동 소수점 데이터 반환
mysql> select round(1.567,2);
+—————— -+| 라운드(1.567,2) |
+ ——————-+
| 1.57 |
+——————-+
1행 세트 (0.00초)
SIGN(숫자2 ) //기호 반환, 양수 또는 음수 또는 0
5.3 날짜 유형
ADDTIME (date2 ,time_interval ) //date2에 time_interval 추가
CONVERT_TZ (datetime2 ,fromTZ ,toTZ ) //시간대 변환
CURRENT_DATE ( ) //현재 날짜
CURRENT_TIME ( ) //현재 Time
CURRENT_TIMESTAMP( ) //현재 타임스탬프
DATE(datetime) //datetime의 날짜 부분을 반환
DATE_ADD(date2, INTERVAL d_value d_type) //date2에 날짜 또는 시간 추가
DATE_FORMAT( datetime, FormatCodes) //formatcodes 형식을 사용하여 날짜시간 표시
DATE_SUB(date2, INTERVAL d_value d_type) //date2에서 시간 빼기
DATEDIFF(date1, date2) //두 날짜의 차이
DAY(날짜) //날짜의 요일을 반환
DAYNAME(날짜) //영어 평일
DAYOFWEEK(날짜) //요일(1~7), 1은 일요일
DAYOFYEAR(날짜) / / 일자
EXTRACT (interval_name FROM date) //date에서 날짜의 지정된 부분을 추출
MAKEDATE (년,일) //연도와 일자를 입력받아 날짜를 생성 String
MAKETIME(시,분,초) //시간 문자열 생성
MONTHNAME(날짜) //영어 월 이름
NOW() //현재 시간
SEC_TO_TIME(초) //수 초 시간으로 변환
STR_TO_DATE(string,format) //문자열을 시간으로 변환하여 형식으로 표시
TIMEDIFF(datetime1, datetime2) //두 시간의 차이
TIME_TO_SEC(time) //시간을 시간으로 변환 초 숫자]
WEEK (date_time [,start_of_week ]) //주 수
YEAR(datetime) //연도
DAYOFMONTH(datetime) //일
HOUR( datetime) / /hour
LAST_DAY(date) //date가 속한 달의 마지막 날짜
MICROSECOND(datetime) //마이크로초
MONTH(datetime) //Month
MINUTE(datetime) / /Minute
참고: INTERVAL에서 사용 가능한 유형: DAY ,DAY_HOUR ,DAY_MINUTE ,DAY_SECOND ,HOUR ,HOUR_MINUTE ,HOUR_SECOND ,MINUTE ,MINUTE_SECOND,MONTH ,SECOND ,YEAR
DECLARE 변수 이름 [,variable_name...] datatype [ DEFAULT value];
그 중 datatype은 INT, FLOAT, DATE, VARCHAR(length)
예:
DECLARE l_int INT와 같은 mysql의 데이터 유형입니다. unsigned default 4000000;
DECLARE l_numeric NUMERIC(8,2) DEFAULT 9.95;
DECLARE l_date DATE DEFAULT '1999-12-31'; >DECLARE l_varchar VARCHAR(255) DEFAULT '이것은 패딩되지 않습니다.';
6. 저장 프로시저 적용
SQL 저장 프로시저 페이징 방법:
저장 프로시저:CREATE 프로시저 p_splitpage
@sql nvarchar(4000), --실행할 sql 명령문
@page int=1, --표시할 페이지 번호
@pageSize int, --각 페이지의 크기
@pageCount int=0 out, --총 페이지 수
@recordCount int =0 out --총 레코드 수
as
nocount 설정
@p1 int 선언
exec sp_cursoropen @p1 출력,@sql,@scrollopt=1,@ccopt=1,@rowcount= @pagecount 출력
@recordCount = @pageCount
select @pagecount=ceiling(1.0*@pagecount/@pagesize)
,@page=(@page-1)*@pagesize+1
exec sp_cursorfetch @p1,16,@page,@pagesize
exec sp_cursorclose @p1
GO
ASP 페이지 내용
sql = "삭제된 tabNews에서 id, c_s_name 선택<>1 Order By id Desc"
page = cint(page_get)
if page_post<>""then
page = cint(page_post)
end if
if not page > 0 then
page = 1
end if
pagesize= 20'페이지당 항목 수
set cmd = server.CreateObject("adodb.command")
cmd.ActiveConnection = conn
cmd.CommandType = 4
cmd.CommandText = "p_SplitPage"
cmd.Parameters.Append cmd.CreateParameter("@sql",8,1, 4000, sql)
cmd.Parameters.Append cmd.CreateParameter(" @page",4,1, 4, 페이지)
cmd.Parameters.Append cmd.CreateParameter("@pageSize",4,1, 4, pageSize)
cmd.Parameters.Append cmd.CreateParameter(" @pageCount",4,2, 4, pageCount)
cmd.Parameters.Append cmd.CreateParameter("@recordCount",4,2, 4, RecordCount)
set rs = cmd.Execute
set rs = rs.NextRecordSet
pageCount = cmd.Parameters ("@pageCount").value
recordCount = cmd.Parameters("@recordCount").value
if pageCount = 0 then pageCount = 1
if page>pageCount then
response.Redirect( "?page="&pageCount)
end if
set rs = cmd.Execute
커서
1. (커서)를 사용하면 사용자가 SQL Server에서 행 단위로 반환한 결과 집합에 액세스할 수 있습니다.
커서를 사용하는 주요 이유 중 하나는 수집 작업을 단일 레코드 처리로 변환하는 것입니다. SQL 언어를 사용하여 데이터베이스에서 데이터를 검색한 후 결과는 메모리 영역에 배치되며 결과는 여러 레코드를 포함하는 모음인 경우가 많습니다. 커서 메커니즘을 통해 사용자는 SQL Server에서 이러한 레코드에 행별로 액세스하고 사용자 자신의 희망에 따라 이러한 레코드를 표시하고 처리할 수 있습니다.
2. 커서의 장점
커서 정의에서 다음과 같은 커서의 장점을 얻을 수 있으며, 이로 인해 실제 응용 프로그램에서 커서가 중요한 역할을 하게 됩니다.
1) 프로그램이 반환된 행 집합의 각 행에서 동일하거나 다른 실행을 수행할 수 있도록 허용합니다. 전체 행 집합에 대해 동일한 작업을 수행하는 대신 쿼리 문 선택 작업을 사용합니다.
2) 커서 위치를 기준으로 테이블의 행을 삭제하고 업데이트하는 기능을 제공합니다.
3) 커서는 실제로 집합 지향 데이터베이스 관리 시스템(RDBMS)과 행 지향 프로그래밍 간의 브리지 역할을 하여 두 가지 처리 방법이 커서를 통해 통신할 수 있도록 해줍니다.
3. 커서의 활용
에서는 다중 커서의 장점에 대해 이야기했습니다. 이제 커서의 신비를 직접 공개하겠습니다.
커서 사용 순서: 커서 선언, 커서 열기, 데이터 읽기, 커서 닫기, 커서 삭제
CREATE PROCEDURE PK_Test
AS
--변수 선언
declare @O_ID nvarchar(20)
declare @A_Salary float
--선언 커서 mycursor,
AddSalary에서 O_ID,A_Salary를 선택하기 위해 mycursor 커서 선언
--커서 열기
mycursor 열기
--커서에서 데이터를 가져와(select 문의 매개변수 수는 커서에서 가져온 변수 이름과 동일해야 함) 방금 선언한 변수에 할당합니다.
mycursor에서 @O_ID,@A_Salary로 다음 가져오기
/*//커서 상태 확인
//0 가져오기 문 성공
//-1 가져오기 명령문이 실패했거나 행이 결과 세트에 없습니다
//-2 추출된 행이 존재하지 않습니다*/
--루프는 커서를 계속해서 읽고, @O_ID, @A_Salary
값을 가져옵니다(@@fetch_status=0)
--읽기 시작
시작
--@O_ID, @A_Salary를 알려진 수량으로 처리하고 원하는 대로 사용하세요.
--커서를 사용할 때마다 검색한 값을 표시합니다.
print '커서가 데이터 조각을 성공적으로 검색했습니다.'
print @O_ID
print @A_Salary
--커서를 사용하여 레코드를 가져옵니다
mycursor에서 @O_ID,@A_Salary로 다음 가져오기
end
--커서 닫기
mycursor 닫기
--커서 할당 해제
할당 해제 mycursor
GO
상위 사용량
작업 목록에서 상위 5개 lngWorkID,strWorkName,strExecHumanName,strBeginDate
선택 where lngExecHumanID= @lngUserID
sql 문을 사용하여 얻은 레코드의 처음 5개 행을 검색합니다