programing

PL/SQL: 스크립트 실행을 완전히 중지하는 지침이 있습니까?

testmans 2023. 7. 29. 08:17
반응형

PL/SQL: 스크립트 실행을 완전히 중지하는 지침이 있습니까?

PL/SQL 스크립트의 시작 부분에서 DB 스키마를 확인하려고 합니다.

검사 결과가 실패할 경우 스크립트를 중지하여 다음 명령이 실행되지 않도록 합니다.

이런 게 있어요

-- 1st line of PL/SQL script

DECLARE
  SOME_COUNT INTEGER;
BEGIN
  SELECT COUNT(*) INTO SOME_COUNT FROM SOME_TABLE WHERE <SOME_CONDITIONS>;
  IF (SOME_COUNT > 0) THEN
    DBMS_OUTPUT.PUT_LINE('Test failed, I don''want the rest of the script'
      || ' to be executed.');
    --EXIT or something like that?... <= STOP EXECUTION HERE
  END IF;
END;
/

-- OTHER SQL INSTRUCTIONS...
ALTER TABLE SOME_TABLE ...

다음을 수행할 수 있는 지침을 찾고 있습니다.STOP EXECUTION HERE".

질문에는 다중 문 배치 스크립트가 표시됩니다.RAISE_APPLICATION_ERROR()는 PL/SQL 블록(하위 프로그램)에서만 종료되며 전체 스크립트(Justin이 지적한 대로)에서 종료되지 않으므로 다음 문으로 계속 진행됩니다.

배치 스크립트의 경우에는 항상 SQLERROR EXIT를 사용하는 것이 좋습니다.예, 표준 SQL이 아닌 SQLPlus 지시어이지만 상당히 이동이 가능합니다. 스크립트를 지원하는 대부분의 일반적인 Oracle 도구는 최소한 부분적으로 이 지시어를 지원합니다. 다음 예제는 SQLPlus, SQL*Developer, Toad, SQLsmith 등에서 작동하며, 이에 대해 설명하는 경우 문제를 보여줍니다.

set serveroutput on

-- Without this line, things keep going
WHENEVER SQLERROR EXIT SQL.SQLCODE ROLLBACK;

BEGIN
  IF (1 > 0) THEN
    DBMS_OUTPUT.PUT_LINE('First thing');
    RAISE_APPLICATION_ERROR(-20000, 'Test failed'); -- not enough
  END IF;
END;
/

-- This will execute if you remove WHEN SQLERROR.., so RAISE_APPLICATION_ERROR is not enough
BEGIN
   DBMS_OUTPUT.PUT_LINE('Second thing - Executes anyway');
END;
/

WHEN SQL ERROR를 제거하면 스크립트가 계속 진행되고 두 번째 블록 등이 실행되며, 이는 질문이 회피하도록 요청하는 것과 정확히 일치합니다.

이 경우 sqlplus를 에뮬레이트하는 그래픽 도구의 장점은 스크립트를 실제로 중지하고 나머지 스크립트를 셸 명령으로 제출하지 않는다는 것입니다. 이는 콘솔 창에서 실행되는 SQLPlus에 스크립트를 붙여넣으면 발생합니다. SQLPlus는 오류가 발생하면 종료될 수 있지만, 나머지 버퍼링된 명령은 OS 셸에서 처리됩니다. 이는 주석에 셸 명령이 있으면 다소 지저분하고 잠재적으로 위험합니다.SQLPlus에서는 스크립트를 연결한 다음 실행하거나 명령줄 인수(sqlplus scott/tiger @foo.sql)에 전달하는 것이 항상 가장 좋습니다.

예외를 제기하지 않으려면 다음과 같은 방법을 시도할 수 있습니다(테스트되지 않음).

declare
  SOME_COUNT INTEGER;
begin
  SELECT COUNT(*) INTO SOME_COUNT FROM SOME_TABLE WHERE <SOME_CONDITIONS>;
  IF (SOME_COUNT > 0) THEN
    DBMS_OUTPUT.PUT_LINE('Test failed, I don''want the rest of the script'
      || ' to be executed.');

    goto end_proc;
  END IF;

  -- A bunch of great code here

  <<end_proc>>
  null;  -- this could be a commit or other lines of code
end;

어떤 사람들은 GOTO 문이 남용되면 스파게티 코드로 이어질 수 있기 때문에 싫어하지만, 이런 간단한 상황에서는 (다시 말하지만, 예외를 제기하고 싶지 않다고 가정하면) 잘 작동합니다. imo.

응용프로그램 오류를 발생시키는 것보다 현재 PL/SQL 블록을 매우 부드럽게 종료하는 키워드를 사용하는 것이 훨씬 더 간단합니다.

꼭해보세요요.DBMS_OUTPUT.PUT_LINE('Exited because <error')사용자에게 당신이 왜 탈퇴하는지에 대한 좋은 메시지를 제공하기 전에!

언급URL : https://stackoverflow.com/questions/8908210/pl-sql-is-there-an-instruction-to-completely-stop-the-script-execution

반응형