관계 데이터베이스 SQL 의 프로 그래 밍 가능 한 사무

머리말
앞의 관계 데이터베이스 SQL 의 프로 그래 밍 가능 함수 (사용자 정의 함수) 는 관계 형 데이터 베 이 스 는 프로 그래 밍 가능 한 함수, 저장 과정, 사무, 트리거 와 커서 를 제공 합 니 다. 앞에서 함수, 저장 과정 을 소 개 했 습 니 다. 본 고 는 업무 의 사용 을 소개 합 니 다.(아니면 앞의 은행 시스템 을 예 로 들 면)
개술
하나의 논리 작업 단원 으로 실행 되 는 일련의 조작 을 말한다. 완전히 실행 하거나 완전히 실행 하지 않 는 다.하나의 논리 적 작업 단원 이 업무 가 되 려 면 이른바 ACID (원자 성, 일치 성, 격 리 성과 지속 성) 특성 을 만족 시 켜 야 한다.
문법
시작 사무: 사무 가 시작 되 는 위 치 는 하나의 논리 작업 단원 의 시작 입 니 다.스크롤 백 트 랜 잭 션: 데 이 터 를 트 랜 잭 션 이 시 작 된 상태 로 복원 하 는 것 입 니 다. 일반적으로 조건 이 충족 되 지 않 거나 오류 가 발생 했 을 때 이 작업 을 수행 합 니 다.제출 사무: 업무 가 끝 난 위 치 는 하나의 논리 작업 단원 이 성공 적 으로 실 행 된 후에 데이터 상 태 를 바 꾸 는 것 입 니 다.
--    
BEGIN TRAN[SACTION]
--    ,TRAN[SACTION]   
ROLLBACK TRAN[SACTION]
--    
COMMIT TRAN[SACTION]

--    
BEGIN TRAN[SACTION]
--   SQL   

위의 SQL 문 구 는 적당 한 위치 에 COMMIT TRAN[SACTION] 를 더 해 야 하고 스크롤 백 이 필요 하 다 면 ROLLBACK TRAN[SACTION] 이 있 을 수 있 습 니 다.
사 무 는 저장 과정 과 공동으로 사용 할 수 있다.
특성
  • 원자 성 (Atomic) (Atomicity)
  • 사 무 는 원자 작업 단위 여야 합 니 다. 데이터 수정 은 모두 실행 되 거나 실행 되 지 않 습 니 다. 일반적으로 특정한 업무 와 관련 된 작업 은 공 통 된 목 표를 가지 고 있 으 며 서로 의존 합 니 다. 시스템 이 이러한 작업 의 한 부분 만 수행 하면 업무 의 전체적인 목 표를 파괴 할 수 있 습 니 다. 원자 성 은 시스템 처리 작업 부분 집합 가능성 을 제거 합 니 다.
  • 일치 성 (일관성) (일관성)
  • 트 랜 잭 션 이 완료 되 었 을 때 모든 데이터 가 일치 하 는 상 태 를 유지 해 야 합 니 다. 관련 데이터베이스 에 서 는 모든 규칙 을 트 랜 잭 션 의 수정 에 적용 하여 모든 데이터 의 완전 성 을 유지 해 야 합 니 다. 트 랜 잭 션 이 끝 났 을 때 모든 내부 데이터 구조 (예 를 들 어 B 트 리 색인 이나 양 방향 링크)모두 정확 해 야 합 니 다. 일부 일치 성 을 유지 하 는 책임 은 응용 프로그램 개발 자가 져 야 합 니 다. 그들 은 응용 프로그램 이 이미 알 고 있 는 모든 완전 성 제약 을 강제 하 는 지 확인 해 야 합 니 다. 예 를 들 어 이체 에 사용 되 는 응용 프로그램 을 개발 할 때 이체 과정 에서 작은 숫자 를 임의로 이동 하 는 것 을 피해 야 합 니 다.
  • 격 리 성 (절연) (절연)
  • 병발 사무소 의 수정 은 다른 병발 사무소 의 수정 과 격 리 되 어야 합 니 다. 업 무 는 데 이 터 를 볼 때 데이터 가 처 한 상 태 를 확인 하거나, 다른 병발 사무 가 이전의 상 태 를 수정 하거나, 다른 업무 가 그 후의 상 태 를 수정 하거나, 업 무 는 중간 상태의 데 이 터 를 보지 않 습 니 다. 이 를 격 리 성 이 라 고 합 니 다. 시작 데 이 터 를 다시 불 러 오고 다시 불 러 올 수 있 기 때 문 입 니 다.데이터 가 끝 날 때의 상태 가 원본 트 랜 잭 션 의 상태 와 같 도록 일련의 트 랜 잭 션 을 재생 합 니 다. 트 랜 잭 션 을 정렬 할 수 있 을 때 가장 높 은 격 리 단 계 를 얻 습 니 다. 이 단계 에서 병렬 실행 가능 한 트 랜 잭 션 에서 얻 은 결 과 는 각 사무 소 를 연속 으로 실행 하여 얻 은 결과 와 같 습 니 다. 고도 격 리 는 병렬 실행 가능 한 트 랜 잭 션 수 를 제한 하기 때문에 일부 응용 프로그램 은프로그램 은 더 큰 스루풋 으로 바 꾸 기 위해 격 리 단 계 를 낮 추 었 다.
  • 지속 성 (Duration) (Durability)
  • 업무 가 완료 되면 시스템 에 미 치 는 영향 은 영구적 입 니 다. 이 수정 은 치 명 적 인 시스템 고장 이 발생 하 더 라 도 계속 유 지 됩 니 다.
    예시
  • 사무 가 있 는 저장 과정 을 만 듭 니 다. 손오공 은 돈 을 찾 으 려 고 하고 거래 정보 표 에 거래 정 보 를 삽입 하 는 동시에 계좌 표 안의 잔액
  • 을 변경 해 야 합 니 다.
    begin transaction
        if exists(select * from sysobjects where name = 'proc_getMoney')
        drop procedure proc_getMoney
        go
        create proc proc_getMoney
            @cardId varchar(19),
            @tranMoney money
        as
        declare @balance money
        select @balance = LeftMoney from CardInfo where CardID = @cardId
        if(@tranMoney <= @balance)
        begin
            insert into TransInfo values(@cardId,'  ',@tranMoney,default)
            if(@@ERROR=0)
            begin
                update CardInfo set LeftMoney = LeftMoney - @tranMoney where CardID = @cardId
                if(@@ERROR=0)
                begin
                    commit transaction
                    print 'OK'    
                end    
            end
            else
            begin
                rollback
                print 'error'
            end
        end
        else
                print '    '
    go
    exec proc_getMoney '1324 3626 7532 1935',520
    go
    exec proc_getMoney '1027 3526 1536 1135',520
    go
  • 저장 과정 에서 사 무 를 만 들 고 사용자 가 입력 한 개인 정보 에 따라 은행 카드 계 좌 를 개설 하고 수출 매개 변 수 를 사용자 의 은행 카드 번호 와 은행 카드 잔액 으로 한다.(계 좌 를 개설 할 때 사용자 정보 표 와 은행 카드 표 에 데 이 터 를 추가 해 야 할 뿐만 아니 라 거래 정보 표 에 저금 의 기록 도 삽입 해 야 한다. 카드 를 개설 할 때 카드 개설 금액 을 지정 해 야 하기 때문에 은행 카드 번호 가 자동 으로 생 성 된다)
  • if exists(select * from sysobjects where name = 'proc_openAccount')
    drop procedure proc_openAccount
    go
    create proc proc_openAccount
        @CustName varchar(20),        --         
        @IDCard varchar(18),        --           
        @TelePhone varchar(13),        --           
        @Address varchar(50),        --         
        @openMoney money            --            
    as
    begin
    begin transaction
        declare @CustID int,@CardID varchar(19)     --            ,     
        exec proc_getCardNo  @CardID output --             ,        @CardID
            --         
            insert into AccountInfo values
            (@CustName,@IDCard,@TelePhone,@Address)
        if(@@error != 0)--    
            rollback--    
        else
            begin
                set @CustID = @@identity     --         CustID
                --          
                insert into CardInfo values
                (@CardID,default,@CustID,'  ',getdate(),@openMoney,@openMoney,' ')
                    if(@@error != 0)
                        rollback
                    else
                        begin
                        --         
                        insert into TransInfo values
                        (@CardID,'  ',@openMoney,default)
                        if(@@error != 0)
                            begin
                                rollback
                                print '    ,      !'
                            end
                        else
                            begin
                                print '    !'
                                print '   :' + @CardID
                            end
                        end
            end
    commit transaction
    end
    go
    exec proc_openAccount '  ','422322001550135015','027-8658888','   ',250
    go

    첨부: 생산 은행 카드 의 저장 과정 을 실현 하고 이 저장 과정 은 랜 덤 으로 카드 번호 출력 을 만 들 수 있 습 니 다.
    if exists(select * from sysobjects where name = 'proc_getCardNo')
        drop procedure proc_getCardNo
        go
        create proc proc_getCardNo
            @CardNo varchar(19) output    --         
        as
        begin
            declare @day varchar(2) --    
            set @day = dateName(dd,getdate())
            if @day<10    --      10,    '0'
            set @day = '0'+@day
            set @CardNo = convert(varchar(9),(dateName(yyyy,getdate())+' '
    + dateName(mm,getdate())))+@day+' '+ convert(varchar(10),(dateName(hh,getdate())
    +dateName(mi,getdate())+' '+ subString(convert(varchar(6),rand(datepart(ms,getdate()))*1000000),1,5)))    
        end
    go
    declare @card varchar(19)
    exec proc_getCardNo  @card output
    print '   :' + @card
    go

    본문 은 여기까지 소개 하 겠 습 니 다. 궁금 한 점 이 있 으 면 연락 주세요.
    약서

    좋은 웹페이지 즐겨찾기