2017-12-11 1 views
0

데이터를 텍스트로 가져와 postgresql 함수에서 배열로 반환해야합니다. 나는 파일이있는 클립 미디어 테이블을 가지고 있으며 각 클립 ID마다 미디어 클립에서 모든 파일을 가져오고 싶습니다. 이 같은 기능을 만들어 :SQL 함수에서 루프에서 데이터를 가져 오는 방법

CREATE OR REPLACE FUNCTION clips_media_array(INT) 
RETURNS text[] AS $$ 
    DECLARE 
    r clips_media%ROWTYPE; 
    t text[]; 
    BEGIN 
    FOR r IN 
    SELECT file_name 
    FROM clips_media WHERE id_clips = $1 AND file_type = 2 
    LOOP 
    t := t.file_name; 
    END LOOP; 

    END; 
$$ 
LANGUAGE plpgsql; 

을하고 난 오류가 : 이 ERROR: invalid input syntax for integer: "bfeO4RbZ5R1CUT8.jpg" CONTEXT: PL/pgSQL function clips_media_array(integer) line 6 at FOR over SELECT rows

이 사람이 나를 도울 수 있습니까?

+0

이 (오류 메시지와 일치하지 않습니다 코드 당신의 코드에서'over'는 없습니다). 하지만 루프 나 함수가 필요 없습니다. 간단한'select array_agg (file_name) from clips_media where ...'는 잘 할 것입니다 –

답변

1

너는 것들을 너무 복잡하게 만들고있어.

루프가 필요하지 않습니다. PL/pgSQL 기능조차 필요하지 않습니다.

단일 SQL 쿼리와 함께 간단한 SQL 함수에 그 넣을 수 있습니다 :

CREATE OR REPLACE FUNCTION clips_media_array(INT) 
RETURNS text[] AS 
$$ 
    SELECT array_agg(file_name) 
    FROM clips_media 
    WHERE id_clips = $1 
    AND file_type = 2; 
$$ 
LANGUAGE sql; 

물론 당신은 함수의 오버 헤드없이 코드에서 직접이 SQL 쿼리를 사용할 수 있습니다. 당신은 PL/pgSQL의 기능을 원하는 경우


당신은 루프 내부의 커서 변수의 값을 CONCAT해야합니다 :

다음 코드는 잘못된 것입니다 :

LOOP 
    t := t.file_name; 
END LOOP; 

및 다음과 같아야합니다.

LOOP 
    t := t || R.file_name; 
END LOOP; 

루프 레코드는 R.file_name을 사용하고 배열에 요소를 추가하려면 ||을 사용해야합니다.

DECLARE 
    r clips_media%ROWTYPE; 
    t text[] := array[]::text[]; 

그리고 마지막으로 당신은 return 문을 누락 :

당신은 또한 당신의 결과 변수를 초기화해야

, 그렇지 않으면 그것은 null

LOOP 
    t := t || r.file_name; 
    END LOOP; 
    return t; --<< required to return something from a PL/pgSQL function 
END; 
$$ 
관련 문제