Oracle/PLSQL

Oracle/PLSQL

Unpivot Pipelined Function

APEX 개발에 사용하기 위해 Ref 커서를 입력받아 Unpivot한 결과를 반환하는 Pipelined Function을 작성했습니다. 아래와 같이 패키지를 생성하겠습니다. DBMS_SQL.TO_CURSOR_NUMBER 프로시저로 Ref 커서를 DBMS_SQL 커서로 변경하는 부분을 제외하면 Tom Kyte가 개발한 print_table 프로시저와 동작 방식이 동일합니다. -- 1-1 CREATE OR REPLACE PACKAGE pkg_unpivot IS TYPE trd IS RECORD ( name VARCHAR2(4000) , value VARCHAR2(4000) ); TYPE tnt IS TABLE OF trd; FUNCTION fnc_get_value ( i_cursor IN SYS_REFCUR..

Oracle/PLSQL

컬렉션 할당 기능 개선

개요 Oracle 21c부터 Iterator Choice로 컬렉션에 값을 할당할 수 있습니다. 테스트를 위해 아래와 같이 테이블을 생성하겠습니다. -- 1 DROP TABLE t1 PURGE; CREATE TABLE t1 (c1 NUMBER, c2 VARCHAR2(1)); INSERT INTO t1 VALUES (2, 'A'); INSERT INTO t1 VALUES (4, 'B'); INSERT INTO t1 VALUES (6, 'C'); COMMIT; Basic Iterator Choice Basic Iterator Choice는 컬렉션에 값을 할당할 수 없습니다. 아래 예제는 에러가 발생합니다. -- 2 DECLARE TYPE taa IS TABLE OF VARCHAR2(1) INDEX BY PLS..

Oracle/PLSQL

Qualified Expression 기능 개선

개요 Oracle 21c에서 Qualified Expression 기능이 대폭 개선되었습니다. PL/SQL Language Reference는 Qualified Expression를 아래와 같이 구분합니다. qualified_expression empty_qualified_expression simple_qualified_expression aggregate_qualified_expression positional_choice_list expr sequence_iterator_choice explicit_choice_list named_choice_list indexed_choice_list basic_iterator_choice index_iterator_choice others_choice 이 글은 ..

Oracle/PLSQL

FOR LOOP 문 기능 개선

개요 Oracle 21c에서 FOR LOOP 문의 기능이 대폭 개선되었습니다. 테스트를 위해 아래와 같이 테이블을 생성하겠습니다. -- 1 DROP TABLE t1 PURGE; CREATE TABLE t1 (c1 NUMBER, c2 VARCHAR2(1)); INSERT INTO t1 VALUES (2, 'A'); INSERT INTO t1 VALUES (4, 'B'); INSERT INTO t1 VALUES (6, 'C'); COMMIT; Iterand FOR LOOP 문의 iterand에 MUTABLE 키워드와 constrained type을 사용할 수 있습니다. pls_identifier [ MUTABLE | IMMUTABLE ] [constrained_type] 아래 예제는 iterand에 MUTA..

Oracle/PLSQL

UPDATE 문의 RETURNING INTO 절 개선

Oracle 23c부터 UPDATE 문의 RETURNING INTO 절에 OLD 키워드와 NEW 키워드를 사용하여 갱신 전후 값을 반환할 수 있습니다. The RETURNING INTO clause for INSERT, UPDATE, and DELETE statements are enhanced to report old and new values affected by the respective statement. This allows developers to use the same logic for each of these DML types to obtain values pre- and post-statement execution. Old and new values are valid only for UP..

Oracle/PLSQL

단순 CASE 문 평가식 개선

Oracle 23c부터 단순(simple) CASE 문과 CASE 표현식에 단항 조건(dangling predicates)을 사용할 수 있습니다. The CASE statement is extended in PL/SQL to be consistent with the updated definitions of CASE expressions and CASE statements in the SQL:2003 Standard [ISO03a, ISO03b]. Dangling predicates allow tests other than equality to be performed in simple CASE operations. Multiple choices in WHEN clauses allow CASE operati..

Oracle/PLSQL

PL/SQL 오브젝트 컴파일 시 ORA-29275 에러 발생

아래 함수는 오타로 인해 컴파일 경고가 발생합니다. SHOW ERROR 명령어를 수행하면 "ORA-29275: 부분 다중 바이트 문자" 에러 메시지가 출력되고 에러가 발생한 라인이 표시되지 않습니다. -- 1-1 CREATE OR REPLACE FUNCTION f1 (i_v1 IN NUMBER) RETURN VARCHAR2 IS BEGIN RETURN CASE WHEN i_v1 =< 10 THEN 'A' END; -- ! END; / 경고: 컴파일 오류와 함께 함수가 생성되었습니다. -- 1-2 SHOW ERROR ERROR: ORA-29275: 부분 다중 바이트 문자 오류가 없음. 오타를 수정한 후 함수를 컴파일하면 에러가 발생하지 않습니다. 단순한 오타로 인해 발생한 컴파일 경고지만 불명확한 에러 메..

Oracle/PLSQL

DBMS_XPLAN.FORMAT_* 함수

DBMS_XPLAN 패키지에는 숫자 값의 포맷팅할 수 있는 다수의 함수가 포함되어 있습니다. 참고로 이 함수들은 문서화되지 않았습니다. FORMAT_NUMBER, FORMAT_NUMBER2 함수는 숫자 값을 1000 기준의 SI 단위 문자 값으로 포맷팅합니다. SI 단위는 대문자로 표시됩니다. -- 1 SELECT POWER (10, ROWNUM) AS c1 , DBMS_XPLAN.FORMAT_NUMBER (POWER (10, ROWNUM)) AS c2 , DBMS_XPLAN.FORMAT_NUMBER2 (POWER (10, ROWNUM)) AS c3 FROM XMLTABLE ('1 to 10'); C1 C2 C3 ----------- ----- ----- 10 10 10 100 100 100 1000 1..

Oracle/PLSQL

숫자 값을 SI 단위로 표시

2018년 12월 31일 블로그에 작성한 "단위 변환 함수" 글을 보완한 글입니다. 크기가 큰 숫자 값을 SI 단위로 표시하면 데이터의 가독성을 높일 수 있습니다. 아래 fnc_fmt_num 함수는 숫자 값을 SI 단위로 변환한 문자 값을 반환합니다. -- 1 CREATE OR REPLACE FUNCTION fnc_fmt_num ( i_val IN NUMBER , i_div IN NUMBER DEFAULT 1024 ) RETURN VARCHAR2 IS v_val NUMBER := i_val; v_idx NUMBER := 1; v_unit VARCHAR2(8) := CASE WHEN i_div = 1024 THEN ' kmgtpez' ELSE ' KMGTPEZ' END; BEGIN IF i_val IS N..

정희락
'Oracle/PLSQL' 카테고리의 글 목록