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 10045 게시물 읽기
No. 10045
bom 관련 Function 만들기 error좀 봐주세요
작성자
이규석(comboss)
작성일
2019-03-06 11:18ⓒ
2019-03-06 11:19ⓜ
조회수
3,296
 
-------------------------------------------------------------table
CREATE TABLE ferp.mol_bom
(
  mol_pcd character varying(20) NOT NULL, -- 모금형코드
  mol_ccd character varying(20) NOT NULL, -- 자금형코드
  reqvl integer, --정수
  CONSTRAINT mol_bom_pkey PRIMARY KEY (mol_pcd, mol_ccd, sdate)
)
------------------------------------------------------------------------------------
 
 
 
CREATE OR REPLACE FUNCTION ferp.fun_mol_partlist(as_mol_no character varying)
  RETURNS TABLE( mol_pcd character varying, mol_ccd character varying, reqvl  numeric, qty  numeric) AS
$BODY$
 
begin
WITH RECURSIVE MOL_PARTLIST AS (
    SELECT a.mol_pcd
         , a.mol_ccd
         , a.reqvl
         , 1 * a.reqvl AS qty
      FROM mol_bom a
     WHERE a.mol_pcd   = as_mol_no
    UNION ALL
    SELECT b.mol_pcd
         , b.mol_ccd
         , b.reqvl
         , (c.qty * b.reqvl)  AS qty
      FROM mol_bom b
         , MOL_PARTLIST c
     where b.mol_pcd = c.mol_ccd
)
 
SELECT d.mol_pcd
     , d.mol_ccd
     , d.reqvl
     , d.qty
  FROM MOL_PARTLIST d;
end ;
 
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
  
ALTER FUNCTION ferp.fun_mol_partlist(character varying)
 
---------------------------------------------------------------------------- 실행
SELECT mol_pcd FROM fun_mol_partlist('MO-0001')
 
ERROR:  쿼리에 결과 데이터의 대상이 없음
HINT:  SELECT의 결과를 취소하려면 대신 PERFORM을 사용하십시오.
CONTEXT:  PL/pgSQL 함수 "fun_mol_partlist(character varying)" 의 4번째 SQL 문
 
********** Error **********
 
ERROR: 쿼리에 결과 데이터의 대상이 없음
SQL state: 42601
Hint: SELECT의 결과를 취소하려면 대신 PERFORM을 사용하십시오.
Context: PL/pgSQL 함수 "fun_mol_partlist(character varying)" 의 4번째 SQL 문
 
이 글에 대한 댓글이 총 3건 있습니다.

리턴값이 안보이네요. 
table 형 변수에 담을라고 만든 것 같은데 
with ~ select 문으로 자료만 가져오고 끝나고 있습니다. 

table / 레코드 자료형에 대한 데이터 패치 방법을 
연구해보세요.  loop 패치하는 방식입니다. 

http://www.postgresqltutorial.com/plpgsql-function-returns-a-table/

lucky님이 2019-03-06 11:54에 작성한 댓글입니다.
이 댓글은 2019-03-06 13:55에 마지막으로 수정되었습니다. Edit
--- 감사합니다.
 
CREATE OR REPLACE FUNCTION ferp.fun_mol_partlist(as_mol_no character varying)
  RETURNS TABLE( mol_pcd character varying, mol_ccd character varying, reqvl  numeric, qty  numeric) AS
$BODY$
 
DECLARE 
    var_r record;
begin
 
FOR var_r IN
(
WITH RECURSIVE MOL_PARTLIST AS (
    SELECT a.mol_pcd
         , a.mol_ccd
         , a.reqvl
         , 1 * a.reqvl AS qty
      FROM mol_bom a
     WHERE a.mol_pcd   = as_mol_no
    UNION ALL
    SELECT b.mol_pcd
         , b.mol_ccd
         , b.reqvl
         , (c.qty * b.reqvl)  AS qty
      FROM mol_bom b
         , MOL_PARTLIST c
     where b.mol_pcd = c.mol_ccd
)
 
 
 
SELECT d.mol_pcd
     , d.mol_ccd
     , d.reqvl
     , d.qty
  FROM MOL_PARTLIST d)
 
LOOP
        mol_pcd := var_r.mol_pcd; 
mol_ccd := var_r.mol_ccd;
reqvl := var_r.reqvl;
qty := var_r.qty;
        RETURN NEXT;
END LOOP
;
  
end ;
 
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
  
ALTER FUNCTION ferp.fun_mol_partlist(character varying)
  OWNER TO ferp;
이규석(comboss)님이 2019-03-06 12:09에 작성한 댓글입니다.

 윗 경우라면, return query 로 간단하게 풀릴 것 같네요. 

https://www.postgresql.org/docs/current/plpgsql-control-structures.html#PLPGSQL-STATEMENTS-RETURNING

문서 좀 아래에 보면, return query 에 대한 이야기가 있습니다. 

그거 살펴보시면 도움이 되지 않을까싶네요.

김상기(ioseph)님이 2019-03-06 12:24에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
10048query plan에 merge append 는 언제 하게되는건가요?? [1]
test
2019-03-11
2861
10047select 쿼리가 너무 느려요 제발 도와주세요 [1]
김민혁
2019-03-08
3142
10046컬럼값 find ?? 같은 기능 없나요? [2]
이기자
2019-03-06
3016
10045bom 관련 Function 만들기 error좀 봐주세요 [3]
이규석
2019-03-06
3296
10044postgresql login 패스워드 확인 [5]
인규리
2019-03-05
3208
10043streaming replication 적용 상태에서 DB 재기동 [1]
카비
2019-02-28
3004
10042pg_basebackup : could not connect to server : FATAL : number of requested standby connections exceeds [1]
카비
2019-02-27
3139
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2023 DSN, All rights reserved.
작업시간: 0.055초, 이곳 서비스는
	PostgreSQL v16.1로 자료를 관리합니다