2010-08-06 5 views
5

나는 이것을 잠시 동안 알아 내려고 노력했다. 나는 도움을 청할 때가되었다고 생각한다. 나는 스키마 프로비저닝 스크립트를 만들고 있는데, 스크립트 출력을 추가하고 싶다. 오류 처리. 아이디어는 스크립트 출력 창이 모든 잡음이없는 주요 메시지 만 보여줄 것이라는 것입니다. 이 (- 우리가 오라클 버전 : 필요한 힌트, 레드 게이트 힌트) 파악했다 나는 일반적으로 단지 Red Gate's SQL Packager이 할 것 SQL 서버 세계에서 오라클 스크립트에서의 에러 처리

Create Temporary Error Table 
Begin Transaction 

-- begin work block 
Print "Doing some types of work" 
-- do work here 

If Error and Active Transactions > 0 Then Rollback 
If Active Transactions = 0 Then Insert Error In Temp Error Table and Start Another Transaction 
-- end work block 

-- once all all work complete 
If Active Transactions > 0 Then Commit Transactions 

. 비슷한 것을 얻기 위해 Oracle을 어디서부터 사용해야할까요?

+2

_ 스키마 프로비저닝 스크립트를 작성 중입니다. _ 테이블 등을 작성/변경한다는 의미 인 경우; 롤백은 도움이되지 않습니다. Oracle 내에서 DDL 명령은 현재 트랜잭션이 미해결 상태 인 경우 트랜잭션을 커밋하고 트랜잭션 내에서 실행되고 성공하면 커밋되며 실패하면 롤백합니다. 따라서 DDL 명령을 실행 한 후 미해결 트랜잭션이 없습니다.유일한 예외는 DB가 DDL 명령을 실행하기로되어 있음을 알지 못하고 구문 분석 오류가있는 경우이며, 첫 번째 암시 적 커밋을 수행하지 않으며 DDL에 대한 트랜잭션을 시작하지 않습니다. 이것은 SQL Server와 매우 다릅니다. –

+0

내 의견은 답을 제공하지 않습니다. 단지 당신이 알고 있거나 아는 적이없는 함정을 지적하기위한 것입니다. –

+0

@Shannon - 감사합니다. DDL이 포함 된보다 광범위한 범위의 트랜잭션을 수행 할 수 없다는 점이 정말 짜증납니다. 문제가 발생하면 데이터베이스를 절반 구운 상태로 두어 프로비저닝 프로세스에서 오류 처리를 훨씬 어렵게 만듭니다. –

답변

2

을했습니다, 당신은 트랜잭션 경계를 정의합니다.

SET ECHO ON 
SPOOL /some/path/to/logfile.log 
WHENEVER SQLERROR EXIT SQL.CODE ROLLBACK 

-- run your code or DML statements 

COMMIT; 
EXIT; 

이 밖으로 폭탄됩니다 : 당신은 SQL을 사용하는 경우 문제 발생시

은 * 플러스 당신이 커밋 전혀 아무것도하지 않으려는, 당신은 SQL 스크립트에 다음을 넣어 할 수 있습니다 처음 오류가 발생하면 오류가있는 명령문이 로그 파일의 끝에있게됩니다. 또한 변경 내용을 롤백하므로 COMMIT (또는 CREATE, ALTER, DROP, GRANT 또는 REVOKE과 같은 오류 메시지를 발생시키는 명령문)이 없으면 전체 업그레이드가 모두 또는 적용되지 않습니다.

0

대부분의 경우 스크립트를 사용하여 자동화 된 작업을 반복합니다.

우리가하는 한 가지 방법은 현재 주어진 디렉터리에서 모든 .sql 파일을 실행하고 .log 파일을 생성하는 UNIX 스크립트입니다. 프로세스가 끝나면 로그 파일을 grep하고 오류가 있는지 확인합니다.

sqlplus가 이미 오류를 인쇄하고 로그 파일에 캡처되므로 수동으로 오류를 인쇄 할 필요가 없습니다. 다음은

매우 간단한 예입니다

...

.ksh 파일

#!/usr/bin/ksh 
echo "Starting provisioning script.." 

sqlplus scott/[email protected] > file1.log << ! 
@file1.sql 
@file1.sql 
! 

echo "end of provisioning script" 

(이 예를 들어, 같은 디렉토리에) file1.sql의 내용

create table test123(
    id number, 
    name varchar2(200) 
); 

이 스크립트를 실행하면 첫 번째 생성이 성공하고 두 번째 생성이 실패하고 로그 파일이 .. ..

01이됩니다.
SQL*Plus: Release 10.2.0.4.0 - Production on Fri Aug 6 20:44:08 2010 

Copyright (c) 1982, 2007, Oracle. All Rights Reserved. 


Connected to: 
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production 
With the Partitioning, OLAP, Data Mining and Real Application Testing options 

SQL> 
Table created. 

SQL> create table test123(
      * 
ERROR at line 1: 
ORA-00955: name is already used by an existing object 


SQL> Disconnected from Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production 
With the Partitioning, OLAP, Data Mining and Real Application Testing options 

이 줄을 따라 스크립트를 준비한 다음 실행이 완료되면 로그 파일에서 오류를 검색 할 수 있습니다. 다양한 sqlplus 세션 명령을 사용하여 원하지 않는 주석 등을 제거 할 수 있습니다.

동일한 기능을하는 자동화 된 도구에 대해 알지 못합니다. 이 완료되면 커밋, 각 문장은 원자입니다 - 그 이유 난 항상이 도움이

희망 ... 오라클에서

+0

가능한 경우 셸 스크립트를 혼합하지 않으려합니다. 너무 많은 의존성을 만듭니다. –