programing

PL/SQL BEGIN을 중첩해야 하는 시기...END 블록?

lastmoon 2023. 7. 31. 21:49
반응형

PL/SQL BEGIN을 중첩해야 하는 시기...END 블록?

BEGIN에서 코드의 하위 섹션을 임의로 그룹화했습니다.END는 올바른 것처럼 보일 때 차단합니다.대부분 더 긴 저장 프로시저를 작업할 때 한 지점에 임시 변수가 필요할 때 코드의 해당 부분에만 해당 변수를 선언합니다.특정 코드에 대해 발생한 예외를 식별하고 처리하려는 경우에도 이 작업을 수행합니다.

프로시저, 기능 또는 PL/SQL의 다른 더 큰 블록 내에 블록을 중첩해야 하는 다른 이유는 무엇입니까?

다음과 같이 예외를 로컬로 처리하려는 경우:

begin
   for emp_rec in (select * from emp) loop
      begin
         my_proc (emp_rec);
      exception
         when some_exception then
            log_error('Failed to process employee '||emp_rec.empno);
      end;
   end loop;
end;

이 예에서는 예외를 처리한 다음 다음 직원을 처리합니다.

또 다른 용도는 다음과 같이 제한된 범위를 갖는 로컬 변수를 선언하는 것입니다.

declare
    l_var1 integer;
    -- lots of variables
begin
   -- lots of lines of code
   ...
   for emp_rec in (select * from emp) loop
      declare
         l_localvar integer := 0;
      begin
         -- Use l_localvar
         ...
      end
   end loop;

end;

이 작업을 수행하려는 것은 프로그램이 너무 커서 중단되어야 한다는 신호인 경우가 많습니다.

declare
   l_var1 integer;
   -- lots of variables
   ...
   procedure local_proc (emp_rec emp%rowtype):
      l_localvar integer := 0;
   begin
      -- Use l_localvar
      ...
   end
begin
   -- lots of lines of code
   ...
   for emp_rec in (select * from emp) loop
      local_proc (emp_rec);
   end loop;

end; 

블록 내에만 존재하는 데이터와 관련된 프로시저를 만들고 싶을 때 블록을 중첩하는 경향이 있습니다.다음은 고안된 예입니다.

BEGIN
  FOR customer IN customers LOOP
    DECLARE

      PROCEDURE create_invoice(description VARCHAR2, amount NUMBER) IS
      BEGIN
        some_complicated_customer_package.create_invoice(
            customer_id => customer.customer_id,
            description => description,
            amount => amount
          );
      END;

    BEGIN

      /* All three calls are being applied to the current customer,
         even if we're not explicitly passing customer_id.
       */
      create_invoice('Telephone bill',  150.00);
      create_invoice('Internet bill',   550.75);
      create_invoice('Television bill', 560.45);

    END;
  END LOOP;
END;

물론, 일반적으로 필요한 것은 아니지만 여러 곳에서 절차를 호출할 수 있을 때 매우 유용하게 사용되었습니다.

BEGIN/END 블록을 중첩하는 한 가지 이유는 코드의 특정 로컬 섹션에 대한 예외를 처리하고 예외가 처리될 경우 처리를 계속할 수 있기 때문입니다.

언급URL : https://stackoverflow.com/questions/2334659/when-should-i-nest-pl-sql-begin-end-blocks

반응형