⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rangefuncs.out

📁 PostgreSQL 8.1.4的源码 适用于Linux下的开源数据库系统
💻 OUT
📖 第 1 页 / 共 2 页
字号:
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 + -