반응형
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
반응형
'programing' 카테고리의 다른 글
PowerShell에서 특정 확장자를 가진 파일을 재귀적으로 검색하는 방법은 무엇입니까? (0) | 2023.07.31 |
---|---|
치명적 오류: 선택적 값의 래핑을 해제하는 동안 예기치 않게 0이(가) 발견되었습니다. (0) | 2023.07.31 |
모든 호출을 수정하지 않고 Retrofit을 사용하여 OAuth 토큰 새로 고침 (0) | 2023.07.31 |
Powershell 배열의 각 항목을 새 배열로 선택/매핑 (0) | 2023.07.31 |
스프링 부트 애플리케이션 내부에 리액트 웹 애플리케이션과 jar 패키징을 통합하는 방법 (0) | 2023.07.31 |