database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
ㆍPostgreSQL
Firebird
Oracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
PostgreSQL Q&A 9876 게시물 읽기
No. 9876
plpgsql 내에서 table type 정의하여 사용할 때 이상한 점.
작성자
개발이하고싶어요
작성일
2017-08-28 16:42ⓒ
2017-08-28 16:53ⓜ
조회수
7,102

 

 

목적은 MAP 기능을 구현하기 위해서 찾아보기 시작했습니다.

TABEL정의를 해서 사용하면 된다고 하더군요.

 

DECLARE

    TYPE t_cpn_map IS TABLE OF numeric(10) INDEX BY VARCHAR2(14);

    cncl_cpn_map t_cpn_map;

begin

    begin

        dbms_output.put_line(cncl_cpn_map('A'));

        EXCEPTION

        when NO_DATA_FOUND then

            cncl_cpn_map('A') := 444;    

    end;

dbms_output.put_line(cncl_cpn_map('A'));

cncl_cpn_map('A') := 323;

dbms_output.put_line(cncl_cpn_map('A'));

END;

 

처럼 작성해서 테스트 해 보았습니다.

수행해보니 잘 나옵니다.

444

323

Query returned successfully ...

 

하지만 제대로 function으로 컴파일 하기 위해 아래와 같이 변경하니 TYPE에서 오류가 난다고 합니다.

 

CREATE OR REPLACE FUNCTION fn_check_item(in p_value1 character varying)

RETURNS TABLE(rtn_cd character varying, rtn_msg character varying) as

$BODY$

DECLARE

v_rtn_cd                 varchar;       -- 결과 코드        

v_rtn_msg                varchar;       -- 결과 메시지   

 

    TYPE t_cpn_map IS TABLE OF numeric(10) INDEX BY VARCHAR2(14);

    cncl_cpn_map t_cpn_map;

begin

 

    begin

        dbms_output.put_line(cncl_cpn_map('A'));

        EXCEPTION

        when NO_DATA_FOUND then

            cncl_cpn_map('A') := 444;    

    end;

 

dbms_output.put_line(cncl_cpn_map('A'));

cncl_cpn_map('A') := 323;

dbms_output.put_line(cncl_cpn_map('A'));

 

    v_rtn_cd := '00';

    v_rtn_msg := '정상';

    

RETURN QUERY

SELECT v_rtn_cd as rtn_cd

     ,v_rtn_msg as rtn_msg

;

end;

$BODY$

  LANGUAGE plpgsql VOLATILE

  COST 100

  ROWS 1000;

 

 

컴파일 하면 오류가 발생합니다.

 

ERROR:  syntax error at or near "TABLE"

LINE 36:  TYPE cpn_map IS TABLE OF numeric(10) INDEX BY VARCHAR2(14);

               ^

CONTEXT:  invalid type name "cpn_map IS TABLE OF numeric(10) INDEX BY VARCHAR2(14)"

********** Error **********

 

ERROR: syntax error at or near "TABLE"

SQL state: 42601

Character: 2354

Context: invalid type name "cpn_map IS TABLE OF numeric(10) INDEX BY VARCHAR2(14)"

 

이렇게요.

 

왜 그런걸까요?

MAP 처럼 순차가 아닌 특정 ID로 접근하는 기능은 어떻게 구현할 수 있을까요?

이 글에 대한 댓글이 총 1건 있습니다.

enterprisedb 사의 Postgres Advanced Server 인가봅니다.

둘 차이가 하나는 오라클 호환성을 가지는 함수고, 하나는 plpgsql 로 프로시져 언어를 강제화 해서 오라클 호환성을 못가지도록 지정해서 생긴 문제가 아닐까생각합니다.

 

사용하려는 프로시져 언어가 뭔지 명확하게 지정해서 그에 맞는 문법을 사용하셔야 할 것 같습니다.

PostgreSQL은 프로시져를 만들 때, 사용할 수 언어가 다양하거든요. 그에 맞게 쓰셔야 합니다.

김상기(ioseph)님이 2017-08-28 17:13에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
9881시간대별 조회 쿼리 궁금 합니다 [2]
추성민
2017-09-08
7950
9880AutoVacuum 이 실행되는 조건 [5]
지현명
2017-09-08
7204
9878유저,스키마,테이블에 설정한 권한들 확인할 수 있는 것 [6]
postgres
2017-09-05
9079
9876plpgsql 내에서 table type 정의하여 사용할 때 이상한 점. [1]
개발이하고싶어요
2017-08-28
7102
9875postgres 설치 오류 문의 입니다. [3]
이은성
2017-08-23
8428
9874아카이브모드 백업 할때 [1]
postgres
2017-08-23
6915
9873TO_TIMESTAMP로 형변환 질문이요 [1]
개병
2017-08-21
6830
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2023 DSN, All rights reserved.
작업시간: 0.048초, 이곳 서비스는
	PostgreSQL v16.1로 자료를 관리합니다