java, c#등의 언어에서 jdbc, odp.net등 을 이용하여 DB에 연결한다.

해당 커넥터를 사용할때

PL/SQL, Pro*C에서 사용했던 exception중


아래 2개 

"ORA-01403 no data found", 

"ORA-01422 TOO_MANY_ROWS"

는 에러코드로 받지 못한다.


특정 자료형에 db에서 구한 값을 담으려고 할떄 나는 오류로 해당 에러를 catch 하고자 한다면 그 case에 맞는 로직을 구현하여 catch 하는게 맞겠다.

처리방안)

"ORA-01403 not data found" => null 체크, 결과값 count 

"ORA-01422 TOO_MANY_ROWS" => 리턴될 결과/받는 데이타의 type이 배열 형태인지 아닌지 확인하여 처리



참고1) https://ko.wikipedia.org/wiki/PL/SQL

PL/SQL(피엘에스큐엘) : 상용 관계형 데이터베이스 시스템인 오라클 DBMS에서 SQL 언어를 확장하기 위해 사용하는 컴퓨터 프로그래밍 언어 중 하나이다. 


특징 : 자료 내부에서 SQL 명령문만으로 처리하기에는 복잡한 자료의 저장이나 프로시저와 트리거 등을 작성하는 데 쓰인다. 

PL/SQL의 구조는 에이다 프로그래밍 언어를 본떠 만들어졌다고 알려졌다. 따라서 두 언어는 그 구조가 범용 언어인 파스칼의 구문과 비슷하다. 

범용 언어인 C와 C++ 그리고 파스칼 및 포트란 등의 프로그래밍 언어와는 다른 점으로 범용 언어들이 컴퓨터 시스템에서 특정한 작업을 처리하기 위해 만들어진 언어라고 볼 때 PL/SQL은 단지 오라클의 관계형 데이터베이스 (RDBMS)에서만 사용된다는 점이다.

PL/SQL 외에도 각 관계형 데이터베이스마다 확장 언어들이 있다. 이러한 확장 언어의 대표적인 예로 마이크로소프트의 마이크로소프트 SQL 서버와 SybaseASE에는 트랜잭트 SQL(Transact SQ; TSQL)이 있고 PostgreSQL에는 PL/pgSQL 마지막으로 IBM DB2는 ISO SQL의 SQL/PSM 표준을 따르는 SQL Procedural를 포함한다.


PL/SQL 프로그램 단위 : 

PL/SQL 익명 블록

함수

프로시저

패키지

패키지 사양

패키지 바디

트리거


참고2) https://www.ibm.com/support/knowledgecenter/ko/SSEPGG_10.5.0/com.ibm.db2.luw.sql.ref.doc/doc/r0002212.html

Pro*C에서 사용되는 SQLCA

SQLCA : 모든 SQL문의 실행 끝에 갱신되는 변수의 콜렉션입니다.


오류 보고:서버 오류 조건이 항상 보고됩니다. 서버 오류가 보고되면 SQLCA에 대한 추가는 없습니다.

심각한 오류가 발생하지 않는 경우 교착 상태 오류는 다른 오류보다 우선합니다.

다른 모든 오류의 경우, 첫 번째 음수 SQL 코드의 SQLCA가 리턴됩니다.

음수 SQL 코드가 감지되지 않는 경우, 첫 번째 경고(즉, 양수 SQL 코드)의 SQLCA가 리턴됩니다.

파티션된 데이터베이스 시스템에서, 데이터 처리 조작이 하나의 데이터베이스 파티션에서 비어 있지만 다른 데이터베이스 파티션에 데이터가 있는 테이블에 대해 호출되는 경우 이 규칙에 대한 예외가 발생합니다. 테이블이 모든 데이터베이스 파티션에서 비어 있거나 UPDATE문에서 WHERE절을 충족하는 행이 없기 때문에 모든 데이터베이스 파티션에서 에이전트가 SQL0100W를 리턴하는 경우 SQLCODE +100만이 애플리케이션에 리턴됩니다.


'DataBase > Oracle' 카테고리의 다른 글

ORA-01403 no data found, ORA-01422 TOO_MANY_ROWS  (0) 2018.12.16
select for update wait/nowait  (0) 2018.07.22
Oracle Error Code description  (0) 2018.04.20

오라클 쿼리중 

조회하려는 row(s)단위로 lock설정이가능한데,

"FOR UPDATE 구문"을 사용한다



select * from employees

where empno = 1234

for update nowait;


해당 empno=1234에 lock을 획득하지 못하면 ORA-00054로 에러발생시키고 종료한다.

현재 해당 rows가 lock상태라고 이해하면 되겠다.

(ORA-00054:자원이 사용중이고,NOWAIT가 지정되어 있음)


select * from employees

where empno = 1234

for update wait 10  --(10 seconds동안 lock잡기위해 대기);


10초이후도 lock을 얻지 못하면 ORA-00054 에러 발생시키고 종료된다.


아래 출처의 내용을 보게되면

ORA-00054에러 발생시 계속해서 try하는 로직이 있다.

반드시 수행되어야 하는 내용이 있으면 이렇게 반복적인 작업을 진행하더라고 진행되도록 처리한다.

(예, 프로세스 처리를 위해 중요한 key, 값이 되는 것의 채번/값수정 할때 사용할 수 있겠다.)



예)로직수행시 기lock이 있을경우 sleep후 재시도하여 처리

샘플)출처: http://www.java2s.com/Tutorial/Oracle/0500__Cursor/CursorFORUPDATENOWAIT.htm

'DataBase > Oracle' 카테고리의 다른 글

ORA-01403 no data found, ORA-01422 TOO_MANY_ROWS  (0) 2018.12.16
select for update wait/nowait  (0) 2018.07.22
Oracle Error Code description  (0) 2018.04.20

Oracle DB를 사용하다보면 항상 찾아보게되는 에러코드


Exception name Oracle Database
error number
SQLCODE Description
ACCESS_INTO_NULL ORA-06530 -6530 Program attempted to assign values to the attributes of an uninitialized object.
CASE_NOT_FOUND ORA-06592 -6592 None of the choices in the WHEN clauses of a CASE statement were selected and there is no ELSE clause.
COLLECTION_IS_NULL ORA-06531 -6531 Program attempted to apply collection methods other than EXISTS to an uninitialized nested table or varray, or program attempted to assign values to the elements of an uninitialized nested table or varray.
CURSOR_ALREADY_OPENED ORA-06511 -6511 Program attempted to open an already opened cursor.
DUP_VAL_ON_INDEX ORA-00001 -1 Program attempted to insert duplicate values in a column that is constrained by a unique index.
INVALID_CURSOR ORA-01001 -1001 There is an illegal cursor operation.
INVALID_NUMBER ORA-01722 -1722 Conversion of character string to number failed.
NO_DATA_FOUND ORA-01403 100 Single row SELECT returned no rows or your program referenced a deleted element in a nested table or an uninitialized element in an associative array (index-by table).
PROGRAM_ERROR ORA-06501 -6501 PL/SQL has an internal problem.
ROWTYPE_MISMATCH ORA-06504 -6504 Host cursor variable and PL/SQL cursor variable involved in an assignment statement have incompatible return types.
STORAGE_ERROR ORA-06500 -6500 PL/SQL ran out of memory or memory was corrupted.
SUBSCRIPT_BEYOND_COUNT ORA-06533 -6533 A program referenced a nested table or varray using an index number larger than the number of elements in the collection.
SUBSCRIPT_OUTSIDE_LIMIT ORA-06532 -6532 A program referenced a nested table or varray element using an index number that is outside the legal range (for example, -1).
SYS_INVALID_ROWID ORA-01410 -1410 The conversion of a character string into a universal rowid failed because the character string does not represent a ROWID value.
TOO_MANY_ROWS ORA-01422 -1422 Single row SELECT returned multiple rows.
VALUE_ERROR ORA-06502 -6502 An arithmetic, conversion, truncation, or size constraint error occurred.
ZERO_DIVIDE ORA-01476 -1476 A program attempted to divide a number by zero.

reference url : https://docs.oracle.com/cd/E11882_01/timesten.112/e21639/exceptions.htm#TTPLS192


'DataBase > Oracle' 카테고리의 다른 글

ORA-01403 no data found, ORA-01422 TOO_MANY_ROWS  (0) 2018.12.16
select for update wait/nowait  (0) 2018.07.22
Oracle Error Code description  (0) 2018.04.20

+ Recent posts