📄 rangefuncs.out
字号:
INSERT INTO foorescan values(5007,4,'abc.5007.4');INSERT INTO foorescan values(5008,4,'abc.5008.4');INSERT INTO foorescan values(5009,4,'abc.5009.4');INSERT INTO foorescan values(5000,5,'abc.5000.5');INSERT INTO foorescan values(5001,5,'abc.5001.5');INSERT INTO foorescan values(5002,5,'abc.5002.5');INSERT INTO foorescan values(5003,5,'abc.5003.5');INSERT INTO foorescan values(5004,5,'abc.5004.5');INSERT INTO foorescan values(5005,5,'abc.5005.5');INSERT INTO foorescan values(5006,5,'abc.5006.5');INSERT INTO foorescan values(5007,5,'abc.5007.5');INSERT INTO foorescan values(5008,5,'abc.5008.5');INSERT INTO foorescan values(5009,5,'abc.5009.5');CREATE FUNCTION foorescan(int,int) RETURNS setof foorescan AS 'SELECT * FROM foorescan WHERE fooid >= $1 and fooid < $2 ;' LANGUAGE SQL;--invokes ExecFunctionReScanSELECT * FROM foorescan f WHERE f.fooid IN (SELECT fooid FROM foorescan(5002,5004)) ORDER BY 1,2; fooid | foosubid | fooname -------+----------+------------ 5002 | 1 | abc.5002.1 5002 | 2 | abc.5002.2 5002 | 3 | abc.5002.3 5002 | 4 | abc.5002.4 5002 | 5 | abc.5002.5 5003 | 1 | abc.5003.1 5003 | 2 | abc.5003.2 5003 | 3 | abc.5003.3 5003 | 4 | abc.5003.4 5003 | 5 | abc.5003.5(10 rows)CREATE VIEW vw_foorescan AS SELECT * FROM foorescan(5002,5004);--invokes ExecFunctionReScanSELECT * FROM foorescan f WHERE f.fooid IN (SELECT fooid FROM vw_foorescan) ORDER BY 1,2; fooid | foosubid | fooname -------+----------+------------ 5002 | 1 | abc.5002.1 5002 | 2 | abc.5002.2 5002 | 3 | abc.5002.3 5002 | 4 | abc.5002.4 5002 | 5 | abc.5002.5 5003 | 1 | abc.5003.1 5003 | 2 | abc.5003.2 5003 | 3 | abc.5003.3 5003 | 4 | abc.5003.4 5003 | 5 | abc.5003.5(10 rows)CREATE TABLE barrescan (fooid int primary key);NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "barrescan_pkey" for table "barrescan"INSERT INTO barrescan values(5003);INSERT INTO barrescan values(5004);INSERT INTO barrescan values(5005);INSERT INTO barrescan values(5006);INSERT INTO barrescan values(5007);INSERT INTO barrescan values(5008);CREATE FUNCTION foorescan(int) RETURNS setof foorescan AS 'SELECT * FROM foorescan WHERE fooid = $1;' LANGUAGE SQL;--invokes ExecFunctionReScan with chgParam != NULLSELECT f.* FROM barrescan b, foorescan f WHERE f.fooid = b.fooid AND b.fooid IN (SELECT fooid FROM foorescan(b.fooid)) ORDER BY 1,2; fooid | foosubid | fooname -------+----------+------------ 5003 | 1 | abc.5003.1 5003 | 2 | abc.5003.2 5003 | 3 | abc.5003.3 5003 | 4 | abc.5003.4 5003 | 5 | abc.5003.5 5004 | 1 | abc.5004.1 5004 | 2 | abc.5004.2 5004 | 3 | abc.5004.3 5004 | 4 | abc.5004.4 5004 | 5 | abc.5004.5 5005 | 1 | abc.5005.1 5005 | 2 | abc.5005.2 5005 | 3 | abc.5005.3 5005 | 4 | abc.5005.4 5005 | 5 | abc.5005.5 5006 | 1 | abc.5006.1 5006 | 2 | abc.5006.2 5006 | 3 | abc.5006.3 5006 | 4 | abc.5006.4 5006 | 5 | abc.5006.5 5007 | 1 | abc.5007.1 5007 | 2 | abc.5007.2 5007 | 3 | abc.5007.3 5007 | 4 | abc.5007.4 5007 | 5 | abc.5007.5 5008 | 1 | abc.5008.1 5008 | 2 | abc.5008.2 5008 | 3 | abc.5008.3 5008 | 4 | abc.5008.4 5008 | 5 | abc.5008.5(30 rows)SELECT b.fooid, max(f.foosubid) FROM barrescan b, foorescan f WHERE f.fooid = b.fooid AND b.fooid IN (SELECT fooid FROM foorescan(b.fooid)) GROUP BY b.fooid ORDER BY 1,2; fooid | max -------+----- 5003 | 5 5004 | 5 5005 | 5 5006 | 5 5007 | 5 5008 | 5(6 rows)CREATE VIEW fooview1 AS SELECT f.* FROM barrescan b, foorescan f WHERE f.fooid = b.fooid AND b.fooid IN (SELECT fooid FROM foorescan(b.fooid)) ORDER BY 1,2;SELECT * FROM fooview1 AS fv WHERE fv.fooid = 5004; fooid | foosubid | fooname -------+----------+------------ 5004 | 1 | abc.5004.1 5004 | 2 | abc.5004.2 5004 | 3 | abc.5004.3 5004 | 4 | abc.5004.4 5004 | 5 | abc.5004.5(5 rows)CREATE VIEW fooview2 AS SELECT b.fooid, max(f.foosubid) AS maxsubid FROM barrescan b, foorescan f WHERE f.fooid = b.fooid AND b.fooid IN (SELECT fooid FROM foorescan(b.fooid)) GROUP BY b.fooid ORDER BY 1,2;SELECT * FROM fooview2 AS fv WHERE fv.maxsubid = 5; fooid | maxsubid -------+---------- 5003 | 5 5004 | 5 5005 | 5 5006 | 5 5007 | 5 5008 | 5(6 rows)DROP VIEW vw_foorescan;DROP VIEW fooview1;DROP VIEW fooview2;DROP FUNCTION foorescan(int,int);DROP FUNCTION foorescan(int);DROP TABLE foorescan;DROP TABLE barrescan;---- Test cases involving OUT parameters--CREATE FUNCTION foo(in f1 int, out f2 int)AS 'select $1+1' LANGUAGE sql;SELECT foo(42); foo ----- 43(1 row)SELECT * FROM foo(42); f2 ---- 43(1 row)SELECT * FROM foo(42) AS p(x); x ---- 43(1 row)-- explicit spec of return type is OKCREATE OR REPLACE FUNCTION foo(in f1 int, out f2 int) RETURNS intAS 'select $1+1' LANGUAGE sql;-- error, wrong result typeCREATE OR REPLACE FUNCTION foo(in f1 int, out f2 int) RETURNS floatAS 'select $1+1' LANGUAGE sql;ERROR: function result type must be integer because of OUT parameters-- with multiple OUT params you must get a RECORD resultCREATE OR REPLACE FUNCTION foo(in f1 int, out f2 int, out f3 text) RETURNS intAS 'select $1+1' LANGUAGE sql;ERROR: function result type must be record because of OUT parametersCREATE OR REPLACE FUNCTION foo(in f1 int, out f2 int, out f3 text)RETURNS recordAS 'select $1+1' LANGUAGE sql;ERROR: cannot change return type of existing functionHINT: Use DROP FUNCTION first.CREATE OR REPLACE FUNCTION foor(in f1 int, out f2 int, out text)AS $$select $1-1, $1::text || 'z'$$ LANGUAGE sql;SELECT f1, foor(f1) FROM int4_tbl; f1 | foor -------------+---------------------------- 0 | (-1,0z) 123456 | (123455,123456z) -123456 | (-123457,-123456z) 2147483647 | (2147483646,2147483647z) -2147483647 | (-2147483648,-2147483647z)(5 rows)SELECT * FROM foor(42); f2 | column2 ----+--------- 41 | 42z(1 row)SELECT * FROM foor(42) AS p(a,b); a | b ----+----- 41 | 42z(1 row)CREATE OR REPLACE FUNCTION foob(in f1 int, inout f2 int, out text)AS $$select $2-1, $1::text || 'z'$$ LANGUAGE sql;SELECT f1, foob(f1, f1/2) FROM int4_tbl; f1 | foob -------------+---------------------------- 0 | (-1,0z) 123456 | (61727,123456z) -123456 | (-61729,-123456z) 2147483647 | (1073741822,2147483647z) -2147483647 | (-1073741824,-2147483647z)(5 rows)SELECT * FROM foob(42, 99); f2 | column2 ----+--------- 98 | 42z(1 row)SELECT * FROM foob(42, 99) AS p(a,b); a | b ----+----- 98 | 42z(1 row)-- Can reference function with or without OUT params for DROP, etcDROP FUNCTION foo(int);DROP FUNCTION foor(in f2 int, out f1 int, out text);DROP FUNCTION foob(in f1 int, inout f2 int);---- For my next trick, polymorphic OUT parameters--CREATE FUNCTION dup (f1 anyelement, f2 out anyelement, f3 out anyarray)AS 'select $1, array[$1,$1]' LANGUAGE sql;SELECT dup(22); dup ---------------- (22,"{22,22}")(1 row)SELECT dup('xyz'); -- failsERROR: could not determine anyarray/anyelement type because input has type "unknown"SELECT dup('xyz'::text); dup ------------------- (xyz,"{xyz,xyz}")(1 row)SELECT * FROM dup('xyz'::text); f2 | f3 -----+----------- xyz | {xyz,xyz}(1 row)-- equivalent specificationCREATE OR REPLACE FUNCTION dup (inout f2 anyelement, out f3 anyarray)AS 'select $1, array[$1,$1]' LANGUAGE sql;SELECT dup(22); dup ---------------- (22,"{22,22}")(1 row)DROP FUNCTION dup(anyelement);-- fails, no way to deduce outputsCREATE FUNCTION bad (f1 int, out f2 anyelement, out f3 anyarray)AS 'select $1, array[$1,$1]' LANGUAGE sql;ERROR: cannot determine result data typeDETAIL: A function returning "anyarray" or "anyelement" must have at least one argument of either type.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -