안녕하세요? 요즘 여기서 많이 배우고 있답니다. 먼저 감사드려요!!
오늘도 테스트 중에 막히는 부분이 있어서요.
리턴값 2개 이상을 out 인자로 선언하여 테스트 하다가 잘 안되어, 여기서 힌트를 얻은 방법을 사용하여 2개의 리턴값을 받아오는 함수를 작성했습니다.
함수 : TEST_CALLED3
OUTPUT 받아오기용으로 테이블을 하나 만들어 ROWTYPE을 선언했습니다.
CREATE TABLE TAB1 (A1 VARCHAR(10),A2 VARCHAR(10))
CREATE OR REPLACE FUNCTION TEST_CALLED3
(
)
RETURNS RECORD AS
$$
DECLARE
T_RET TAB1%ROWTYPE;
BEGIN
T_RET.A1 := '1234567890';
T_RET.A2 := 'ABCD';
RETURN T_RET;
END;
$$
LANGUAGE PLPGSQL;
그리고 이렇게 호출하는 함수를 하나 짰습니다. 실제로 이런 식으로 다른 함수에서 그 함수를 호촐할 거 거든요.
CREATE OR REPLACE FUNCTION TEST_CALL2()
RETURNS RECORD AS
$$
DECLARE
T_RET TAB1%ROWTYPE;
BEGIN
SELECT TEST_CALLED3() INTO T_RET;
RETURN T_RET;
END;
$$
LANGUAGE PLPGSQL;
SELECT TEST_CALL2();
이렇게 실행했더니, 아래와 같은 오류가 발생합니다. 레코드 타입으로 선언한 T_RET 변수가 레코드타입 길이만큼 할당이 안된듯 보입니다.
상식적으로 잘 이해가 안가는 상황이라서 헤매고 있어요. CREATE TABLE TAB1 (A1 VARCHAR(10),A2 VARCHAR(10)) 이므로 레코드 타입은 20자리는 잡혀야 하는 거 아닌가요?
ERROR: value too long for type character varying(10)
CONTEXT: PL/pgSQL function test_call2() line 5 at SQL statement
약간 값을 달리해서 테스트를 하면요.. 아래와 같이 데이터 값을 좀 짧게 주면 실행이 되긴 하는데..
CREATE OR REPLACE FUNCTION TEST_CALLED3
(
)
RETURNS RECORD AS
$$
DECLARE
T_RET TAB1%ROWTYPE;
BEGIN
T_RET.A1 := '1234';
T_RET.A2 := 'ABC';
RETURN T_RET;
END;
$$
LANGUAGE PLPGSQL;
CREATE OR REPLACE FUNCTION TEST_CALL3()
RETURNS VARCHAR AS
$$
DECLARE
T_RET TAB1%ROWTYPE;
BEGIN
SELECT TEST_CALLED3() INTO T_RET;
RETURN T_RET.A1; --A1컬럼만 따로 보고싶음.
END;
$$
LANGUAGE PLPGSQL;
SELECT TEST_CALL3(); 결과가 아래와 같이 레코드값 전체가 나와요. 제가 하고 싶은 건 OUTPUT 값 각각을 따로따로 구분해서 얻고 싶은 건데 그게 잘 안되네요.
"("(1234,ABC)",)"
어떻게 하면 될까요?
다시 요약하면, 함수의 OUTPUT 파라미터 리턴값을 각각 따로따로 구분해서 가져올 수 있는 방법이 어떤건가 하는 거예요.
보석같은 조언 기다리겠습니다. 감사합니다^_^
|