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
'programing' 카테고리의 다른 글
개발자용 PowerShell (0) | 2023.10.18 |
---|---|
카산드라를 사용하지 않을 때? (0) | 2023.10.18 |
SQL에서 NULL이 부울 식으로 전파되지 않는 이유는 무엇입니까? (0) | 2023.10.18 |
자동 호출 기능 전 세미콜론? (0) | 2023.10.18 |
MySQL 월별/년 단위 반복 이벤트 (0) | 2023.10.18 |