패키지 구현 질문 0 3 1,261

by 앗싸 [PL/SQL] Max [2018.01.05 17:22:31]


개발 언어 C#, DB : Oracle 11g

 

질문사항

- 클라이언드에서 배열로 오라클 package 호출하여 데이타 저장 시

- 아래 구현한 delete 부분을 한번만  실행 할 수 있게 하는 방법 있는지요?

- 물론 따로 구현 하면 되지만, 한번에 처리 할 수 있는 방법이 있는가 해서요.

 

procedure Mat_SetMenuGrant
  ( 
    pGrantGroup in SetMenuGrant.GrantGroup%type,
    pMenuKey in SetMenuGrant.MenuKey%type
  )
  Is 
  begin   
    Delete From SetMenuGrant; <--- 이부분을 처음 한번만 실행 하고 싶은데 어떻게 해야 하나요 ??????????????????????????

    Merge Into SetMenuGrant
    USING DUAL
    ON (GrantGroup = pGrantGroup and MenuKey = pMenuKey)
    When Matched Then
        Update Set MenuUse   = pMenuUse Where GrantGroup = pGrantGroup and MenuKey = pMenuKey
    When Not Matched Then       
        Insert(GrantGroup, MenuKey, MenuUse) Values(pGrantGroup, pMenuKey, pMenuUse);  
      
    Commit;  
  end Mat_SetMenuGrant;

by 마농 [2018.01.08 08:43:52]

클라이언트에서 루푸문 안에서 프로시져를 반복 호출하는 듯 하네요?
클라이언트에서 루푸문 전에 delete 한번만 하세요.
프로시져 안의 delete 문은 제거하세요.
Merge 구문 안의 Where 절은 불필요합니다.


by 앗싸 [2018.01.08 09:08:51]

마농님 답변 감사합니다.

제가 설명이 좀 부족 했네요. 

클라이언트에서는 루프안에 프로시저가 있는 것은 아님니다. 프로시저는 한번만 호출합니다.

 

- 클라이어트에서 그리드에 있는 데이터를 루프를 사용하여 배열에 저장 (벌크인서트 구현을 위함)

- 클라이언드에서 오라클 프로시저 한번만 호출

- 기존 저장된 데이터 삭제

- 오라클에 데이터 저장

 

위 처럼 하려고 하는데,,,

- 간단하게 처리 하는 방법은, 프로시저를 두개 만들어 

첫번째 프로시저는 기존 데이터 삭제를 하고

두번째 프로시저는 데이터 저장을 하면 되지만

- 첫번째 와 두번째를 하나에 프로시저로 구현 하고 싶어어서 입니다.

 

감사합니다.


by 마농 [2018.01.08 09:14:32]

delete 한번만 하는게 핵심이 아닌것 같네요?
작성하신 프로시져는 배열처리 부분이 전혀 고려되지 않았네요?
배열 처리하도록 하는게 우선인 듯 합니다.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입