programing

SQLPlus의 연결을 끊거나 종료하지 않고 오류가 발생할 때 SQLPlus에서 스크립트를 종료하고 SQLPlus 프롬프트로 돌아가려면 어떻게 해야 합니까?

muds 2023. 10. 18. 23:08
반응형

SQLPlus의 연결을 끊거나 종료하지 않고 오류가 발생할 때 SQLPlus에서 스크립트를 종료하고 SQLPlus 프롬프트로 돌아가려면 어떻게 해야 합니까?

항상 연결된 SQLPlus 세션 내에서 자주 실행되는 스크립트가 있습니다.

SQLPlus 자체의 연결을 끊거나 종료하지 않고 오류가 발생했을 때 스크립트를 종료할 수 있는 방법이 필요합니다.오류가 발생하면 연결된 DBA가 세션에 하나 이상의 명령을 실행해야 하는 경우가 100%입니다.100% 오류가 발생할 때 다른 SQLPlus 문이 있으므로 해당 문을 벗어나야 합니다.BEGIN..END;) 나중에 실행하면 안되는 스크립트나 심각한 문제가 발생할 수 있습니다.

참고: 제안하는 경우WHENEVER SQLERROR EXIT위의 글을 읽지 않으셨군요그러면 스크립트 에 SQLPlus의 연결이 끊어지고 종료되는데, 허용되지 않는 동작입니다.

여기spencer7593의 답변과 결합하면 선택적인 서브스크립트 호출을 할 수 있고 PL/SQL 출력값을 전달할 수 있는 흥미로운 아이디어를 발견했습니다.참고할 내용:

VAR continue number;
EXEC :continue := 1;
BEGIN
   SELECT some_bool_test() INTO :continue FROM dual;
END;

SET termout OFF
COLUMN script_name NEW_VALUE v_script_name
SELECT decode(:continue, 1, 'run_stuff.sql', 'skip.sql') script_name FROM dual;
SET termout ON

@&v_script_name :some_other_values

어디에skip.sql는 빈 텍스트 파일입니다.
 

업데이트: 대부분의 정보를 A/S로 옮겼습니다.RUN.SQL파일, 여기서 부울(0 또는 1)을 다음과 같이 전달합니다.&1, 성공을 기원하는 대본 이름&2, 호출된 스크립트에 전달되는 다른 예상 매개 변수가 있습니다.따라서 결국 다음과 같이 보입니다.

VAR continue number;
EXEC :continue := 1;
BEGIN
   SELECT some_bool_test() INTO :continue FROM dual;
END;

@run.sql :continue 'run_stuff.sql' :some_other_values

그럴 리가 없습니다.

SQLPlus는 스크립트 실행에 대한 수준의 제어 기능을 제공하지 않습니다.

분명히, 당신은 인터넷을 사용하는 것을 피해야 할 것입니다.WHENEVER SQLERROR EXIT ...지휘.

PL/SQL을 사용하여 예외(오류)가 증가하여 SQL 문이 실행되거나 실행되지 않는 조건부 제어가 가능합니다. 그러나 이것은 (PL/SQL 블록 내에서 실행될 수 없는) SQLPlus 명령을 다루지 않습니다.

DECLARE
  lb_continue BOOLEAN;
BEGIN
  lb_continue := TRUE;
  BEGIN 

    sql statement

  EXCEPTION
    WHEN OTHERS THEN
      lb_continue = FALSE;
  END;
  IF lb_continue THEN
  BEGIN

    sql statements

  EXCEPTION
    WHEN OTHERS THEN
      lb_continue := FALSE;
  END; 
END;

물론, 그 접근법은 나름의 한계와 문제점을 가지고 있습니다.든 DDL. 가장 쉬운 방법은EXECUTE IMMEDIATE statement.

가장 큰 문제는 PL/SQL 블록 내부에서 SQLPlus 명령을 실행할 수 없다는 것입니다.

스크립트를 종료하고 SQL*Plus에 머물 수는 없지만 실행을 중지할 수는 있습니다.보기 좋지는 않지만 스크립트를 수정하여 제어 흐름을 추가할 수 있다고 가정하면 바인딩 변수를 사용하여 이 작업을 수행할 수 있습니다.

set serveroutput on

var flag char;
exec :flag := 'Y';

begin
    if :flag != 'Y' then
        raise program_error;
    end if;
    dbms_output.put_line('Doing some work');
    /* Check for some error condition */
    if 0 != 1 then
        raise program_error;
    end if;
    /* Only reach this if earlier statements didn't fail
     * but could wrap in another flag check if needed */
    dbms_output.put_line('Doing some more work');
    exception
        when program_error then
            dbms_output.put_line(sqlerrm);
            :flag := 'N';
        when others then
            /* Real exception handling, obviously */
            dbms_output.put_line(sqlerrm);    
            :flag := 'N';
end;
/

-- DML only does anything if flag stayed Y
select sysdate from dual
where :flag = 'Y';

-- Optional status message at the end of the script, for DBA info
set feedback off
set head off
select 'Something went wrong' from dual where :flag != 'Y';
set feedback on
set head on

실행 시:

SQL> @script

PL/SQL procedure successfully completed.

Doing some work
ORA-06501: PL/SQL: program error

PL/SQL procedure successfully completed.


no rows selected


Something went wrong
SQL> 

스크립트에 있는 모든 PL/SQL 블록은 시작 시 플래그 상태를 확인할 수 있고, 상승할 수 있습니다.program_error(미리 정의된 편리한 예외처럼) 다시 뛰어내립니다.PL/SQL 블록 내부에서 오류가 발생하는 모든 것은 직접 또는 예외 처리기에서 바인딩 변수 플래그를 업데이트할 수 있습니다.그리고 PL/SQL DML이 아닌 어떤 것이든 추가적으로where플래그 상태를 확인하기 위한 절을 지정합니다.N그 진술에 도달할 때까지, 일은 이루어지지 않습니다. (for an.insert제 생각에 그것은 사용하지 않는 것을 의미할 것 같습니다.values형식).

이것은 일반적인 SQL 문에서 발생하는 오류를 처리할 수 없지만 문제가 되는지는 잘 모르겠습니다.그렇다면 PL/SQL 블록 내에서 동적 SQL로 변경해야 할 수도 있습니다.

오래된 것은 알지만 SQL 스크립트의 맨 처음에 있는 두 가지 지침이 효과가 있습니다.

SQL ERROR가 실패 롤백을 종료할 때마다

OS 오류 종료 실패 롤백 시마다

언급URL : https://stackoverflow.com/questions/11197088/how-do-i-exit-a-script-in-sqlplus-when-an-error-occurs-and-return-to-the-sqlplus

반응형