오라클 PL/SQL문법 및 파이프 라인 함수 질문 올려봅니다. 0 2 6,362

by 나는짱이야 [PL/SQL] [2016.08.23 20:30:23]


안녕하세요. 오라클로 Function만들다 오류가 나서 어떤 의미의 오류인지 알 수 없어서 질문 올립니다.

오라클 에서 아래와 같이 Function 생성 하려고 합니다.

1.

create or replace FUNCTION UF_어쩌구_저쩌구(
  pi_strText              VARCHAR2,
  pi_strDelim             CHAR
)...

(중략)..

pi_strText := LTRIM(RTRIM(pi_strText));

=>이렇게 사용하니 "PLS-00363: 'PI_STRTEXT' 식은 피할당자로 사용될 수 없습니다" 라는 오류가 발생하는데 함수에서 input변수를 함수 구현부 내에서 할당이 불가한가요?

2.1번에서 생성되는 함수는 파이프 라인 함수인데요. 파이프 라인 함수 안에 insert구문 사용은 불가한가요?

  INSERT INTO OBJ_SPLIT_TABLE(IDX,VALUE)
                VALUES(v_intIDX,v_strValue);..

요렇게 구문 작성하니 "ORA-04044: 프로시저, 함수, 패키지 또는 유형이 이곳에서 허용되지 않습니다"라는 오류가 발생합니다.

제가 파이프 라인 함수 개념을 잘못 이해하고 있는지 문의 드립니다.

by 마농 [2016.08.24 07:39:59]

파라미터 관련
  IN 으로 선언한 변수는 값을 입력받는 용도로 수정 불가능 합니다. (생략시 기본 IN 임)
  OUT 으로 선언한 변수에는 값을 지정할 수 있구요.
  IN OUT 으로 선언하면 입력값도 받으면서 수정도 가능합니다.


함수 안에서 DML 사용은
  함수를 그냥 실행(Execute) 하는 경우엔 실행 가능합니다.
  그러나 함수를 Select 절에서 사용한다면 실행 오류 나죠.


by atumlee [2016.08.25 12:07:37]
--* 1. OBJECT 유형 생성
CREATE OR REPLACE TYPE TTYP_SPLIT AS OBJECT
    (
    IDX                 NUMBER
  , VAL                 VARCHAR2(200)
    );
--* 2. COLLECTION 유형 생성
CREATE OR REPLACE TYPE TTAB_SPLIT IS TABLE OF TTYP_SPLIT;

--* 3. PIPELINED 함수 생성
CREATE OR REPLACE FUNCTION FN_TEST
    (
    PV_TEXT                 IN      VARCHAR2
  , PV_DELIMETER            IN      VARCHAR2        DEFAULT ','
    ) RETURN TTAB_SPLIT PIPELINED
IS
    VN_IDX                  NUMBER := 0;
    VV_TEXT                 VARCHAR2(4000);
    VV_DELIMETER            VARCHAR2(100);
    VTYP_SPLIT              TTYP_SPLIT;
BEGIN
    VV_TEXT := TRIM(PV_TEXT);
    VV_DELIMETER := NVL(PV_DELIMETER,',');
    FOR R IN    (
                SELECT  LEVEL AS IDX
                      , REGEXP_SUBSTR(VV_TEXT,'[^'||VV_DELIMETER||']+',1,LEVEL) AS VALUE
                FROM    DUAL
                CONNECT BY LEVEL <= (LENGTH(VV_TEXT)-LENGTH(REPLACE(VV_TEXT,VV_DELIMETER)))/LENGTH(VV_DELIMETER)+1
                ) LOOP
        VTYP_SPLIT := TTYP_SPLIT(R.IDX, R.VALUE);
        PIPE ROW (VTYP_SPLIT);
    END LOOP;
    RETURN;
END;

--* 4. PIPELINED 함수 조회
SELECT  A.*
FROM    TABLE(FN_TEST('A,B,C,D')) A
;

--* 5. 함수 내에서 불가피하게 DML문을 사용해야 할 경우
CREATE OR REPLACE FUNCTION FN_TEST
RETURN VARCHAR2
IS PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
    /* DML 문장 */
    RETURN;
END;

 

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입