[SQL] 함수의 반환 SETOF 레코드 (가상 테이블)
SQL함수의 반환 SETOF 레코드 (가상 테이블)
나는 사용자 정의 컨텐츠 (오라클에서 같은) 가상 테이블을 반환하는 포스트 그레스 기능이 필요합니다. 표 3 열 및 행의 알 수있을 것입니다.
난 그냥 인터넷에서 올바른 구문을 찾을 수 없습니다.
이 상상 :
CREATE OR REPLACE FUNCTION "public"."storeopeninghours_tostring" (numeric)
RETURNS setof record AS
DECLARE
open_id ALIAS FOR $1;
returnrecords setof record;
BEGIN
insert into returnrecords('1', '2', '3');
insert into returnrecords('3', '4', '5');
insert into returnrecords('3', '4', '5');
RETURN returnrecords;
END;
어떻게 이런 일이 제대로 작성?
해결법
-
==============================
1.(이 모든 단지 "$ 1에 대한 ALIAS"의 사용을보고 8.3.7-- PostgreSQL을 사용하면? 이전 버전이 있습니까 테스트)
(이 모든 단지 "$ 1에 대한 ALIAS"의 사용을보고 8.3.7-- PostgreSQL을 사용하면? 이전 버전이 있습니까 테스트)
CREATE OR REPLACE FUNCTION storeopeninghours_tostring(numeric) RETURNS SETOF RECORD AS $$ DECLARE open_id ALIAS FOR $1; result RECORD; BEGIN RETURN QUERY SELECT '1', '2', '3'; RETURN QUERY SELECT '3', '4', '5'; RETURN QUERY SELECT '3', '4', '5'; END $$;
당신은 (대신 쿼리 결과의) 반환 할 레코드 또는 행 변수가있는 경우, 사용 "RETURN NEXT"보다는 "RETURN QUERY".
당신이 좋아하는 일을 할 필요가있는 함수를 호출합니다 :
select * from storeopeninghours_tostring(1) f(a text, b text, c text);
그래서 당신은 당신이 함수의 출력 행 스키마 쿼리에있을 것으로 예상을 정의해야합니다. 이를 방지하려면 함수 정의에 출력 변수를 지정할 수 있습니다 :
CREATE OR REPLACE FUNCTION storeopeninghours_tostring(open_id numeric, a OUT text, b OUT text, c OUT text) RETURNS SETOF RECORD LANGUAGE 'plpgsql' STABLE STRICT AS $$ BEGIN RETURN QUERY SELECT '1'::text, '2'::text, '3'::text; RETURN QUERY SELECT '3'::text, '4'::text, '5'::text; RETURN QUERY SELECT '3'::text, '4'::text, '5'::text; END $$;
(확실히 확인 추가 :: 텍스트 캐스트가 필요한 이유는 ... '1'은 기본적으로 VARCHAR 어쩌면입니까?)
-
==============================
2.모든 기존의 대답은 오래된 또는 시작하는 것이 비효율적된다.
모든 기존의 대답은 오래된 또는 시작하는 것이 비효율적된다.
세 정수 열을 반환 할 가정.
여기에 당신이 (나중에 PostgreSQL을 8.4) 현대 PL / pgSQL에 함께 할 방법은 다음과 같습니다
CREATE OR REPLACE FUNCTION f_foo() -- (open_id numeric) -- parameter not used RETURNS TABLE (a int, b int, c int) AS $func$ BEGIN RETURN QUERY VALUES (1,2,3) , (3,4,5) , (3,4,5) ; END $func$ LANGUAGE plpgsql IMMUTABLE ROWS 3;
포스트 그레스 9.6 이상에서는 또한 병렬 SAFE를 추가 할 수 있습니다.
요구:
SELECT * FROM f_foo();
이 같은 간단한 사례를 들어, 대신 일반 SQL 문을 사용할 수 있습니다 :
VALUES (1,2,3), (3,4,5), (3,4,5)
또는 당신이 원하는 (또는이) 특정 열 이름과 유형을 정의 할 경우 :
SELECT * FROM ( VALUES (1::int, 2::int, 3::int) , (3, 4, 5) , (3, 4, 5) ) AS t(a, b, c);
대신 간단한 SQL 함수로 포장 할 수 있습니다
CREATE OR REPLACE FUNCTION f_foo() RETURNS TABLE (a int, b int, c int) AS $func$ VALUES (1, 2, 3) , (3, 4, 5) , (3, 4, 5); $func$ LANGUAGE sql IMMUTABLE ROWS 3;
-
==============================
3.내 기능에 임시 테이블을 꽤 사용합니다. 당신은 데이터베이스에 대한 반환 유형을 만든 다음 반환에 해당 유형의 변수를 작성해야합니다. 아래는 그냥 않는 샘플 코드입니다.
내 기능에 임시 테이블을 꽤 사용합니다. 당신은 데이터베이스에 대한 반환 유형을 만든 다음 반환에 해당 유형의 변수를 작성해야합니다. 아래는 그냥 않는 샘플 코드입니다.
CREATE TYPE storeopeninghours_tostring_rs AS (colone text, coltwo text, colthree text ); CREATE OR REPLACE FUNCTION "public"."storeopeninghours_tostring" () RETURNS setof storeopeninghours_tostring_rs AS $BODY$ DECLARE returnrec storeopeninghours_tostring_rs; BEGIN BEGIN CREATE TEMPORARY TABLE tmpopeninghours ( colone text, coltwo text, colthree text ); EXCEPTION WHEN OTHERS THEN TRUNCATE TABLE tmpopeninghours; -- TRUNCATE if the table already exists within the session. END; insert into tmpopeninghours VALUES ('1', '2', '3'); insert into tmpopeninghours VALUES ('3', '4', '5'); insert into tmpopeninghours VALUES ('3', '4', '5'); FOR returnrec IN SELECT * FROM tmpopeninghours LOOP RETURN NEXT returnrec; END LOOP; END; $BODY$ LANGUAGE 'plpgsql' VOLATILE; select * from storeopeninghours_tostring()
-
==============================
4.:( PostgreSQL을에 존재하지 않는 임시 테이블을 만들고 수익으로 그 기록을 투기의 MSSQL에 해당 ... 찾고 여기에 착륙 한 사람들에게 -. 당신이 반환 유형을 정의해야 할 두 가지 방법이 있습니다 이 함수 생성시 또는 쿼리 생성시.
:( PostgreSQL을에 존재하지 않는 임시 테이블을 만들고 수익으로 그 기록을 투기의 MSSQL에 해당 ... 찾고 여기에 착륙 한 사람들에게 -. 당신이 반환 유형을 정의해야 할 두 가지 방법이 있습니다 이 함수 생성시 또는 쿼리 생성시.
여기를 봐: http://wiki.postgresql.org/wiki/Return_more_than_one_row_of_data_from_PL/pgSQL_functions
-
==============================
5.
CREATE OR REPLACE FUNCTION foo(open_id numeric, OUT p1 varchar, OUT p2 varchar, OUT p3 varchar) RETURNS SETOF RECORD AS $$ BEGIN p1 := '1'; p2 := '2'; p3 := '3'; RETURN NEXT; p1 := '3'; p2 := '4'; p3 := '5'; RETURN NEXT; p1 := '3'; p2 := '4'; p3 := '5'; RETURN NEXT; RETURN; END; $$ LANGUAGE plpgsql;
from https://stackoverflow.com/questions/955167/return-setof-record-virtual-table-from-function by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 포스트 그레스 jsonb에 배열의 구조를 쿼리에 대한 적절한 지수는 무엇입니까? (0) | 2020.05.01 |
---|---|
[SQL] 어떻게 다른 컴퓨터에서 SQL 서버에 연결하는 방법? (0) | 2020.05.01 |
[SQL] SQL 기본 키 VARCHAR VS 정수 [폐쇄] (0) | 2020.05.01 |
[SQL] PostgreSQL의에서 대량 / 배치 갱신 / upsert (0) | 2020.05.01 |
[SQL] 트리거가 테이블에있을 때 OUTPUT 절을 사용하여 UPDATE를 사용할 수 없습니다 (0) | 2020.05.01 |