{"kind": "language", "major": "18", "item": {"slug": "sql", "name": "sql", "name_zh": "", "category": "\u539f\u751f\u51fd\u6570\u8bed\u8a00", "summary": "SQL \u8bed\u8a00\u51fd\u6570", "aliases": [], "content_hash": "170d2dd2d513b715458abe7e463ea25e98239f16b42670597afcd3c45944c8f6", "versions": {"10": {"facts": [{"label": "\u79cd\u7c7b", "value": "\u539f\u751f\u51fd\u6570\u8bed\u8a00"}, {"label": "\u53ef\u4fe1", "value": "t"}, {"label": "\u6821\u9a8c\u51fd\u6570", "value": "fmgr_sql_validator"}], "tables": [], "aliases": [], "catalog": {"oid": "14", "descr": "SQL-language functions", "lanacl": "_null_", "lanispl": "f", "lanname": "sql", "lanowner": "PGUID", "laninline": "0", "lanpltrusted": "t", "lanvalidator": "2248", "lanplcallfoid": "0"}, "related": [], "release": {"ref": "https://ftp.postgresql.org/pub/source/v10.23/postgresql-10.23.tar.bz2", "label": "10.23", "major": "10", "channel": "historical", "revision": "94a4b2528372458e5662c18d406629266667c437198160a18cdfd2c4a4d6eee9", "source_sha256": "94a4b2528372458e5662c18d406629266667c437198160a18cdfd2c4a4d6eee9", "catalog_fingerprint": "691be281b476dde4374d7f805b2bacc2e75bdef40f1e9d3d42e91f97fe95cfd0"}, "sources": [{"url": "https://ftp.postgresql.org/pub/source/v10.23/postgresql-10.23.tar.bz2", "label": "Matching PostgreSQL source archive", "sha256": "94a4b2528372458e5662c18d406629266667c437198160a18cdfd2c4a4d6eee9"}, {"url": "https://pg.center/docs/10/xfunc-sql.html", "path": "xfunc-sql.html", "label": "PostgreSQL 10 English manual", "sha256": "ff0881e91b696e9623fa16151582d6d3b75b21baf28230eff05e2c973dcc8f9f", "language": "en", "original_url": "/docs/10/xfunc-sql.html"}], "sections": [], "signature": "", "attributes": {"kind": "Native function language", "handler": "", "trusted": "t", "validator": "fmgr_sql_validator"}, "description": ["SQL \u8bed\u8a00\u51fd\u6570"], "manual_html": "<div class=\"sect1\" id=\"XFUNC-SQL\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h2 class=\"title\" lang=\"zh\">37.4. \u67e5\u8be2\u8bed\u8a00\uff08SQL\uff09\u51fd\u6570</h2>\n</div>\n</div>\n</div>\n<p lang=\"zh\">SQL \u51fd\u6570\u6267\u884c\u7531\u4efb\u610f SQL \u8bed\u53e5\u7ec4\u6210\u7684\u4e00\u4e2a\u5217\u8868\uff0c\u5e76\u8fd4\u56de\u5217\u8868\u4e2d\u6700\u540e\u4e00\u4e2a\u67e5\u8be2\u7684\u7ed3\u679c\u3002\u5728\u7b80\u5355\uff08\u975e\u96c6\u5408\uff09\u60c5\u51b5\u4e0b\uff0c\u5c06\u8fd4\u56de\u6700\u540e\u4e00\u4e2a\u67e5\u8be2\u7ed3\u679c\u7684\u7b2c\u4e00\u884c\u3002\uff08\u8bf7\u8bb0\u4f4f\uff0c\u9664\u975e\u4f7f\u7528 <code class=\"literal\">ORDER BY</code>\uff0c\u5426\u5219\u591a\u884c\u7ed3\u679c\u4e2d\u7684<span class=\"quote\">\u201c<span class=\"quote\">\u7b2c\u4e00\u884c</span>\u201d</span>\u5e76\u6ca1\u6709\u660e\u786e\u5b9a\u4e49\u3002\uff09\u5982\u679c\u6700\u540e\u4e00\u4e2a\u67e5\u8be2\u5b8c\u5168\u6ca1\u6709\u8fd4\u56de\u4efb\u4f55\u884c\uff0c\u5219\u8fd4\u56de\u7a7a\u503c\u3002</p>\n<p lang=\"zh\">\u6216\u8005\uff0c\u4e00\u4e2a SQL \u51fd\u6570\u53ef\u4ee5\u901a\u8fc7\u6307\u5b9a\u51fd\u6570\u7684\u8fd4\u56de\u7c7b\u578b\u4e3a<code class=\"literal\">SETOF <em class=\"replaceable\"><code>sometype</code></em></code>\u88ab\u58f0\u660e\u4e3a\u8fd4\u56de\u4e00\u4e2a\u96c6\u5408\uff08\u4e5f\u5c31\u662f\u591a\u4e2a\u884c\uff09\uff0c\u6216\u8005\u7b49\u6548\u5730\u58f0\u660e\u5b83\u4e3a<code class=\"literal\">RETURNS TABLE(<em class=\"replaceable\"><code>columns</code></em>)</code>\u3002\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b\uff0c\u6700\u540e\u4e00\u4e2a\u67e5\u8be2\u7684\u7ed3\u679c\u7684\u6240\u6709\u884c\u4f1a\u88ab\u8fd4\u56de\u3002\u4e0b\u6587\u5c06\u7ed9\u51fa\u8fdb\u4e00\u6b65\u7684\u7ec6\u8282\u3002</p>\n<p lang=\"zh\">SQL \u51fd\u6570\u7684\u51fd\u6570\u4f53\u5fc5\u987b\u662f\u4e00\u4e2a\u7531\u5206\u53f7\u5206\u9694\u7684 SQL \u8bed\u53e5\u5217\u8868\u3002\u6700\u540e\u4e00\u6761\u8bed\u53e5\u540e\u7684\u5206\u53f7\u662f\u53ef\u9009\u7684\u3002\u9664\u975e\u8be5\u51fd\u6570\u88ab\u58f0\u660e\u4e3a\u8fd4\u56de <code class=\"type\">void</code>\uff0c\u5426\u5219\u6700\u540e\u4e00\u6761\u8bed\u53e5\u5fc5\u987b\u662f <code class=\"command\">SELECT</code>\uff0c\u6216\u8005\u662f <code class=\"command\">INSERT</code>\u3001<code class=\"command\">UPDATE</code> \u6216 <code class=\"command\">DELETE</code> \u5e76\u5e26\u6709 <code class=\"literal\">RETURNING</code> \u5b50\u53e5\u3002</p>\n<p lang=\"zh\">\u4efb\u610f\u4e00\u7ec4 <acronym class=\"acronym\">SQL</acronym> \u8bed\u8a00\u547d\u4ee4\u90fd\u53ef\u4ee5\u6253\u5305\u5e76\u5b9a\u4e49\u6210\u51fd\u6570\u3002\u9664 <code class=\"command\">SELECT</code> \u67e5\u8be2\u5916\uff0c\u8fd9\u4e9b\u547d\u4ee4\u8fd8\u53ef\u4ee5\u5305\u542b\u6570\u636e\u4fee\u6539\u67e5\u8be2\uff08<code class=\"command\">INSERT</code>\uff0c<code class=\"command\">UPDATE</code>\u3001<code class=\"command\">DELETE</code>\uff09\uff0c\u4ee5\u53ca\u5176\u4ed6 SQL \u547d\u4ee4\u3002\uff08\u4e0d\u80fd\u4f7f\u7528\u4e8b\u52a1\u63a7\u5236\u547d\u4ee4\uff0c\u4f8b\u5982 <code class=\"command\">COMMIT</code>\uff0c<code class=\"command\">SAVEPOINT</code>\uff0c\u4ee5\u53ca\u67d0\u4e9b\u5de5\u5177\u547d\u4ee4\uff0c\u4f8b\u5982 <code class=\"literal\">VACUUM</code>\uff0c\u6765\u7f16\u5199 <acronym class=\"acronym\">SQL</acronym> \u51fd\u6570\u3002\uff09\u4e0d\u8fc7\uff0c\u6700\u540e\u4e00\u6761\u547d\u4ee4\u5fc5\u987b\u662f <code class=\"command\">SELECT</code>\uff0c\u6216\u8005\u5e26\u6709 <code class=\"literal\">RETURNING</code> \u5b50\u53e5\uff0c\u5e76\u8fd4\u56de\u4e0e\u51fd\u6570\u58f0\u660e\u8fd4\u56de\u7c7b\u578b\u76f8\u7b26\u7684\u7ed3\u679c\u3002\u6216\u8005\uff0c\u5982\u679c\u4f60\u60f3\u5b9a\u4e49\u4e00\u4e2a\u6267\u884c\u52a8\u4f5c\u4f46\u6ca1\u6709\u6709\u7528\u8fd4\u56de\u503c\u7684 SQL \u51fd\u6570\uff0c\u4e5f\u53ef\u4ee5\u628a\u5b83\u5b9a\u4e49\u4e3a\u8fd4\u56de <code class=\"type\">void</code>\u3002\u4f8b\u5982\uff0c\u4e0b\u9762\u8fd9\u4e2a\u51fd\u6570\u4f1a\u5220\u9664 <code class=\"literal\">emp</code> \u8868\u4e2d\u85aa\u8d44\u4e3a\u8d1f\u7684\u884c\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION clean_emp() RETURNS void AS '\n    DELETE FROM emp\n        WHERE salary &lt; 0;\n' LANGUAGE SQL;\n\nSELECT clean_emp();\n\n clean_emp\n-----------\n\n(1 row)\n</pre>\n<div class=\"note\">\n<h3 class=\"title\" lang=\"zh\">\u6ce8\u610f</h3>\n<p lang=\"zh\">SQL \u51fd\u6570\u7684\u6574\u4e2a\u51fd\u6570\u4f53\u90fd\u4f1a\u5148\u7ecf\u8fc7\u89e3\u6790\uff0c\u7136\u540e\u624d\u5f00\u59cb\u6267\u884c\u3002\u867d\u7136 SQL \u51fd\u6570\u53ef\u4ee5\u5305\u542b\u4fee\u6539\u7cfb\u7edf\u76ee\u5f55\u7684\u547d\u4ee4\uff08\u4f8b\u5982 <code class=\"command\">CREATE TABLE</code>\uff09\uff0c\u4f46\u5728\u5bf9\u51fd\u6570\u4e2d\u7684\u540e\u7eed\u547d\u4ee4\u8fdb\u884c\u89e3\u6790\u5206\u6790\u65f6\uff0c\u8fd9\u4e9b\u547d\u4ee4\u7684\u6548\u679c\u8fd8\u4e0d\u53ef\u89c1\u3002\u56e0\u6b64\uff0c\u4f8b\u5982\u5c06 <code class=\"literal\">CREATE TABLE foo (...); INSERT INTO foo VALUES(...);</code> \u6253\u5305\u5230\u540c\u4e00\u4e2a SQL \u51fd\u6570\u4e2d\uff0c\u5c31\u4e0d\u4f1a\u6309\u9884\u671f\u5de5\u4f5c\uff0c\u56e0\u4e3a <code class=\"structname\">foo</code> \u5728\u89e3\u6790 <code class=\"command\">INSERT</code> \u547d\u4ee4\u65f6\u8fd8\u4e0d\u5b58\u5728\u3002\u5728\u8fd9\u7c7b\u60c5\u51b5\u4e0b\uff0c\u5efa\u8bae\u4f7f\u7528 <span class=\"application\">PL/pgSQL</span> \u800c\u4e0d\u662f SQL \u51fd\u6570\u3002</p>\n</div>\n<p lang=\"zh\"><code class=\"command\">CREATE FUNCTION</code> \u547d\u4ee4\u7684\u8bed\u6cd5\u8981\u6c42\u628a\u51fd\u6570\u4f53\u5199\u6210\u4e00\u4e2a\u5b57\u7b26\u4e32\u5e38\u91cf\u3002\u5bf9\u4e8e\u5b57\u7b26\u4e32\u5e38\u91cf\uff0c\u901a\u5e38\u4f7f\u7528\u7f8e\u5143\u5f15\u7528\u6700\u65b9\u4fbf\uff08\u89c1<a class=\"xref\" href=\"/docs/10/sql-syntax.html#SQL-SYNTAX-DOLLAR-QUOTING\" title=\"4.1.2.4.\u00a0\u7f8e\u5143\u5f15\u7528\u7684\u5b57\u7b26\u4e32\u5e38\u91cf\">\u7b2c\u00a04.1.2.4\u00a0\u8282</a>\uff09\u3002\u5982\u679c\u4f60\u9009\u62e9\u4f7f\u7528\u5e38\u89c4\u7684\u5355\u5f15\u53f7\u5b57\u7b26\u4e32\u5e38\u91cf\u8bed\u6cd5\uff0c\u90a3\u4e48\u5fc5\u987b\u5728\u51fd\u6570\u4f53\u4e2d\u5c06\u5355\u5f15\u53f7\uff08<code class=\"literal\">'</code>\uff09\u548c\u53cd\u659c\u7ebf\uff08<code class=\"literal\">\\</code>\uff09\u5199\u6210\u53cc\u4efd\uff08\u5047\u5b9a\u4f7f\u7528\u8f6c\u4e49\u5b57\u7b26\u4e32\u8bed\u6cd5\uff0c\u89c1<a class=\"xref\" href=\"/docs/10/sql-syntax.html#SQL-SYNTAX-STRINGS\" title=\"4.1.2.1.\u00a0\u5b57\u7b26\u4e32\u5e38\u91cf\">\u7b2c\u00a04.1.2.1\u00a0\u8282</a>\uff09\u3002</p>\n<div class=\"sect2\" id=\"XFUNC-SQL-FUNCTION-ARGUMENTS\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/10/xfunc-sql.html#XFUNC-SQL-FUNCTION-ARGUMENTS\">37.4.1. <acronym class=\"acronym\">SQL</acronym>\u51fd\u6570\u7684\u53c2\u6570</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\">\u4e00\u4e2a SQL \u51fd\u6570\u7684\u53c2\u6570\u53ef\u4ee5\u5728\u51fd\u6570\u4f53\u4e2d\u7528\u540d\u79f0\u6216\u7f16\u53f7\u5f15\u7528\u3002\u4e0b\u9762\u4f1a\u6709\u4e24\u79cd\u65b9\u6cd5\u7684\u793a\u4f8b\u3002</p>\n<p lang=\"zh\">\u8981\u4f7f\u7528\u4e00\u4e2a\u540d\u79f0\uff0c\u5c06\u51fd\u6570\u53c2\u6570\u58f0\u660e\u4e3a\u5e26\u6709\u4e00\u4e2a\u540d\u79f0\uff0c\u7136\u540e\u5728\u51fd\u6570\u4f53\u4e2d\u53ea\u5199\u8be5\u540d\u79f0\u3002\u5982\u679c\u53c2\u6570\u540d\u79f0\u4e0e\u51fd\u6570\u5185\u5f53\u524d SQL \u547d\u4ee4\u4e2d\u7684\u4efb\u610f\u5217\u540d\u76f8\u540c\uff0c\u5217\u540d\u5c06\u4f18\u5148\u3002\u5982\u679c\u4e0d\u60f3\u8fd9\u6837\uff0c\u53ef\u4ee5\u7528\u51fd\u6570\u672c\u8eab\u7684\u540d\u79f0\u6765\u9650\u5b9a\u53c2\u6570\u540d\uff0c\u4e5f\u5c31\u662f<code class=\"literal\"><em class=\"replaceable\"><code>function_name</code></em>.<em class=\"replaceable\"><code>argument_name</code></em></code>\uff08\u5982\u679c\u8fd9\u4f1a\u4e0e\u4e00\u4e2a\u88ab\u9650\u5b9a\u7684\u5217\u540d\u51b2\u7a81\uff0c\u7167\u4f8b\u8fd8\u662f\u5217\u540d\u8d62\u5f97\u4f18\u5148\u3002\u4f60\u53ef\u4ee5\u901a\u8fc7\u4e3a SQL \u547d\u4ee4\u4e2d\u7684\u8868\u9009\u62e9\u4e00\u4e2a\u4e0d\u540c\u7684\u522b\u540d\u6765\u907f\u514d\u8fd9\u79cd\u6df7\u6dc6\uff09\u3002</p>\n<p lang=\"zh\">\u5728\u66f4\u65e7\u7684\u6570\u5b57\u65b9\u6cd5\u4e2d\uff0c\u53c2\u6570\u53ef\u4ee5\u7528\u8bed\u6cd5<code class=\"literal\">$<em class=\"replaceable\"><code>n</code></em></code>\u5f15\u7528\uff1a<code class=\"literal\">$1</code>\u6307\u7684\u662f\u7b2c\u4e00\u4e2a\u8f93\u5165\u53c2\u6570\uff0c<code class=\"literal\">$2</code>\u6307\u7684\u662f\u7b2c\u4e8c\u4e2a\uff0c\u4ee5\u6b64\u7c7b\u63a8\u3002\u4e0d\u7ba1\u7279\u5b9a\u7684\u53c2\u6570\u662f\u5426\u4f7f\u7528\u540d\u79f0\u58f0\u660e\uff0c\u8fd9\u79cd\u65b9\u6cd5\u90fd\u6709\u6548\u3002</p>\n<p lang=\"zh\">\u5982\u679c\u4e00\u4e2a\u53c2\u6570\u662f\u4e00\u79cd\u590d\u5408\u7c7b\u578b\uff0c\u90a3\u4e48\u70b9\u53f7\u8bb0\u6cd5\uff08\u5982 <code class=\"literal\"><em class=\"replaceable\"><code>argname</code></em>.<em class=\"replaceable\"><code>fieldname</code></em></code> \u6216<code class=\"literal\">$1.<em class=\"replaceable\"><code>fieldname</code></em></code>\uff09\u4e5f\u53ef\u4ee5\u88ab\u7528\u6765\u8bbf\u95ee\u8be5\u53c2\u6570\u7684\u5c5e\u6027\u3002\u540c\u6837\uff0c\u4f60\u53ef\u80fd\u9700\u8981\u7528\u51fd\u6570\u7684\u540d\u79f0\u6765\u9650\u5b9a\u53c2\u6570\u7684\u540d\u79f0\u4ee5\u907f\u514d\u6b67\u4e49\u3002</p>\n<p lang=\"zh\">SQL \u51fd\u6570\u53c2\u6570\u53ea\u80fd\u88ab\u7528\u505a\u6570\u636e\u503c\u800c\u4e0d\u80fd\u4f5c\u4e3a\u6807\u8bc6\u7b26\u3002\u4f8b\u5982\u8fd9\u662f\u5408\u7406\u7684\uff1a</p>\n<pre class=\"programlisting\">INSERT INTO mytable VALUES ($1);\n</pre>\n<p lang=\"zh\">\u4f46\u8fd9\u6837\u5c31\u4e0d\u884c\uff1a</p>\n<pre class=\"programlisting\">INSERT INTO $1 VALUES (42);\n</pre>\n<div class=\"note\">\n<h3 class=\"title\" lang=\"zh\">\u6ce8\u610f</h3>\n<p lang=\"zh\">PostgreSQL 9.2 \u5f00\u59cb\u652f\u6301\u901a\u8fc7\u540d\u79f0\u5f15\u7528 SQL \u51fd\u6570\u53c2\u6570\u3002\u9700\u8981\u7528\u4e8e\u66f4\u65e9\u7248\u672c\u670d\u52a1\u5668\u7684\u51fd\u6570\u5fc5\u987b\u4f7f\u7528 $n \u8bb0\u6cd5\u3002</p>\n</div>\n</div>\n<div class=\"sect2\" id=\"XFUNC-SQL-BASE-FUNCTIONS\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/10/xfunc-sql.html#XFUNC-SQL-BASE-FUNCTIONS\">37.4.2. \u57fa\u7840\u7c7b\u578b\u4e0a\u7684<acronym class=\"acronym\">SQL</acronym>\u51fd\u6570</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\">\u6700\u7b80\u5355\u7684 <acronym class=\"acronym\">SQL</acronym> \u51fd\u6570\u6ca1\u6709\u53c2\u6570\uff0c\u53ea\u662f\u8fd4\u56de\u4e00\u4e2a\u57fa\u7840\u7c7b\u578b\uff0c\u4f8b\u5982 <code class=\"type\">integer</code>\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION one() RETURNS integer AS $$\n    SELECT 1 AS result;\n$$ LANGUAGE SQL;\n\n-- Alternative syntax for string literal:\nCREATE FUNCTION one() RETURNS integer AS '\n    SELECT 1 AS result;\n' LANGUAGE SQL;\n\nSELECT one();\n\n one\n-----\n   1\n</pre>\n<p lang=\"zh\">\u6ce8\u610f\u6211\u4eec\u4e3a\u8be5\u51fd\u6570\u7684\u7ed3\u679c\u5728\u51fd\u6570\u4f53\u5185\u5b9a\u4e49\u4e86\u4e00\u4e2a\u5217\u522b\u540d\uff08\u540d\u4e3a<code class=\"literal\">result</code>\uff09\uff0c\u4f46\u662f\u8fd9\u4e2a\u5217\u522b\u540d\u5728\u51fd\u6570\u4ee5\u5916\u662f\u4e0d\u53ef\u89c1\u7684\u3002\u56e0\u6b64\uff0c\u7ed3\u679c\u88ab\u6807\u8bb0\u4e3a<code class=\"literal\">one</code>\u800c\u4e0d\u662f<code class=\"literal\">result</code>\u3002</p>\n<p lang=\"zh\">\u5b9a\u4e49\u63a5\u53d7\u57fa\u7840\u7c7b\u578b\u53c2\u6570\u7684 <acronym class=\"acronym\">SQL</acronym> \u51fd\u6570\u4e5f\u51e0\u4e4e\u540c\u6837\u5bb9\u6613\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION add_em(x integer, y integer) RETURNS integer AS $$\n    SELECT x + y;\n$$ LANGUAGE SQL;\n\nSELECT add_em(1, 2) AS answer;\n\n answer\n--------\n      3\n</pre>\n<p lang=\"zh\">\u6216\u8005\uff0c\u6211\u4eec\u4e5f\u53ef\u4ee5\u4e0d\u7528\u53c2\u6570\u540d\uff0c\u800c\u6539\u7528\u6570\u5b57\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION add_em(integer, integer) RETURNS integer AS $$\n    SELECT $1 + $2;\n$$ LANGUAGE SQL;\n\nSELECT add_em(1, 2) AS answer;\n\n answer\n--------\n      3\n</pre>\n<p lang=\"zh\">\u4e0b\u9762\u662f\u4e00\u4e2a\u66f4\u6709\u7528\u7684\u51fd\u6570\uff0c\u5b83\u53ef\u4ee5\u7528\u6765\u4ece\u94f6\u884c\u8d26\u6237\u4e2d\u6263\u6b3e\uff1a</p>\n<pre class=\"programlisting\">CREATE FUNCTION tf1 (accountno integer, debit numeric) RETURNS numeric AS $$\n    UPDATE bank\n        SET balance = balance - debit\n        WHERE accountno = tf1.accountno;\n    SELECT 1;\n$$ LANGUAGE SQL;\n</pre>\n<p lang=\"zh\">\u7528\u6237\u53ef\u4ee5\u8fd9\u6837\u6267\u884c\u8be5\u51fd\u6570\uff0c\u4ece 17 \u53f7\u8d26\u6237\u4e2d\u6263\u9664 $100.00\uff1a</p>\n<pre class=\"programlisting\">SELECT tf1(17, 100.0);\n</pre>\n<p lang=\"zh\">\u5728\u8fd9\u4e2a\u793a\u4f8b\u4e2d\uff0c\u6211\u4eec\u4e3a\u7b2c\u4e00\u4e2a\u53c2\u6570\u9009\u62e9\u4e86\u540d\u79f0<code class=\"literal\">accountno</code>\uff0c\u4f46\u662f\u8fd9\u548c\u8868<code class=\"literal\">bank</code>\u4e2d\u7684\u4e00\u4e2a\u5217\u540d\u76f8\u540c\u3002\u5728<code class=\"command\">UPDATE</code>\u547d\u4ee4\u4e2d\uff0c<code class=\"literal\">accountno</code>\u5f15\u7528\u5217<code class=\"literal\">bank.accountno</code>\uff0c\u56e0\u6b64 <code class=\"literal\">tf1.accountno</code>\u5fc5\u987b\u88ab\u7528\u6765\u5f15\u7528\u8be5\u53c2\u6570\u3002\u6211\u4eec\u5f53\u7136\u53ef\u4ee5\u901a\u8fc7\u4e3a\u8be5\u53c2\u6570\u4f7f\u7528\u4e00\u4e2a\u4e0d\u540c\u7684\u540d\u79f0\u6765\u907f\u514d\u8fd9\u6837\u7684\u95ee\u9898\u3002</p>\n<p lang=\"zh\">\u5b9e\u9645\u4e0a\u6211\u4eec\u53ef\u80fd\u559c\u6b22\u4ece\u8be5\u51fd\u6570\u5f97\u5230\u4e00\u4e2a\u66f4\u6709\u7528\u7684\u7ed3\u679c\u800c\u4e0d\u662f\u4e00\u4e2a\u5e38\u6570 1\uff0c\u56e0\u6b64\u4e00\u4e2a\u66f4\u53ef\u80fd\u7684\u5b9a\u4e49\u662f\uff1a</p>\n<pre class=\"programlisting\">CREATE FUNCTION tf1 (accountno integer, debit numeric) RETURNS numeric AS $$\n    UPDATE bank\n        SET balance = balance - debit\n        WHERE accountno = tf1.accountno;\n    SELECT balance FROM bank WHERE accountno = tf1.accountno;\n$$ LANGUAGE SQL;\n</pre>\n<p lang=\"zh\">\u5b83\u4f1a\u8c03\u6574\u4f59\u989d\u5e76\u4e14\u8fd4\u56de\u65b0\u7684\u4f59\u989d\u3002\u540c\u6837\u7684\u4e8b\u60c5\u4e5f\u53ef\u4ee5\u7528\u4e00\u4e2a\u4f7f\u7528<code class=\"literal\">RETURNING</code>\u7684\u547d\u4ee4\u5b9e\u73b0\uff1a</p>\n<pre class=\"programlisting\">CREATE FUNCTION tf1 (accountno integer, debit numeric) RETURNS numeric AS $$\n    UPDATE bank\n        SET balance = balance - debit\n        WHERE accountno = tf1.accountno\n    RETURNING balance;\n$$ LANGUAGE SQL;\n</pre></div>\n<div class=\"sect2\" id=\"XFUNC-SQL-COMPOSITE-FUNCTIONS\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/10/xfunc-sql.html#XFUNC-SQL-COMPOSITE-FUNCTIONS\">37.4.3. \u590d\u5408\u7c7b\u578b\u4e0a\u7684<acronym class=\"acronym\">SQL</acronym>\u51fd\u6570</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\">\u7f16\u5199\u63a5\u53d7\u590d\u5408\u7c7b\u578b\u53c2\u6570\u7684\u51fd\u6570\u65f6\uff0c\u6211\u4eec\u4e0d\u4ec5\u5fc5\u987b\u6307\u5b9a\u8981\u7528\u54ea\u4e2a\u53c2\u6570\uff0c\u8fd8\u5fc5\u987b\u6307\u5b9a\u8be5\u53c2\u6570\u7684\u54ea\u4e2a\u5c5e\u6027\uff08\u5b57\u6bb5\uff09\u3002\u4f8b\u5982\uff0c\u5047\u8bbe <code class=\"type\">emp</code> \u662f\u4e00\u4e2a\u5305\u542b\u96c7\u5458\u6570\u636e\u7684\u8868\uff0c\u56e0\u6b64\u5b83\u4e5f\u662f\u8be5\u8868\u6bcf\u4e00\u884c\u5bf9\u5e94\u7684\u590d\u5408\u7c7b\u578b\u540d\u79f0\u3002\u4e0b\u9762\u7684\u51fd\u6570 <code class=\"function\">double_salary</code> \u7528\u6765\u8ba1\u7b97\u67d0\u4eba\u7684\u5de5\u8d44\u7ffb\u500d\u540e\u4f1a\u662f\u591a\u5c11\uff1a</p>\n<pre class=\"screen\">CREATE TABLE emp (\n    name        text,\n    salary      numeric,\n    age         integer,\n    cubicle     point\n);\n\nINSERT INTO emp VALUES ('Bill', 4200, 45, '(2,1)');\n\nCREATE FUNCTION double_salary(emp) RETURNS numeric AS $$\n    SELECT $1.salary * 2 AS salary;\n$$ LANGUAGE SQL;\n\nSELECT name, double_salary(emp.*) AS dream\n    FROM emp\n    WHERE emp.cubicle ~= point '(2,1)';\n\n name | dream\n------+-------\n Bill |  8400\n</pre>\n<p lang=\"zh\">\u6ce8\u610f\u8fd9\u91cc\u7528 <code class=\"literal\">$1.salary</code> \u8bed\u6cd5\u6765\u9009\u53d6\u53c2\u6570\u884c\u503c\u4e2d\u7684\u4e00\u4e2a\u5b57\u6bb5\u3002\u8fd8\u8981\u6ce8\u610f\uff0c\u8c03\u7528\u65f6\u7684 <code class=\"command\">SELECT</code> \u547d\u4ee4\u4f7f\u7528 <em class=\"replaceable\"><code>table_name</code></em><code class=\"literal\">.*</code> \u5c06\u8868\u7684\u5f53\u524d\u6574\u884c\u53d6\u4f5c\u4e00\u4e2a\u590d\u5408\u503c\u3002\u8be5\u8868\u884c\u4e5f\u53ef\u4ee5\u4ec5\u7528\u8868\u540d\u6765\u5f15\u7528\uff1a</p>\n<pre class=\"screen\">SELECT name, double_salary(emp) AS dream\n    FROM emp\n    WHERE emp.cubicle ~= point '(2,1)';\n</pre>\n<p lang=\"zh\">\u4f46\u8fd9\u79cd\u7528\u6cd5\u5df2\u88ab\u5f03\u7528\uff0c\u56e0\u4e3a\u5b83\u5f88\u5bb9\u6613\u8ba9\u4eba\u6df7\u6dc6\uff08\u5173\u4e8e\u8868\u884c\u590d\u5408\u503c\u8fd9\u4e24\u79cd\u8bb0\u6cd5\u7684\u66f4\u591a\u7ec6\u8282\uff0c\u89c1<a class=\"xref\" href=\"/docs/10/rowtypes.html#ROWTYPES-USAGE\" title=\"8.16.5.\u00a0\u5728\u67e5\u8be2\u4e2d\u4f7f\u7528\u590d\u5408\u7c7b\u578b\">\u7b2c\u00a08.16.5\u00a0\u8282</a>\uff09\u3002</p>\n<p lang=\"zh\">\u6709\u65f6\u5019\u5373\u65f6\u6784\u9020\u4e00\u4e2a\u590d\u5408\u53c2\u6570\u503c\u4f1a\u5f88\u65b9\u4fbf\u3002\u8fd9\u53ef\u4ee5\u7528<code class=\"literal\">ROW</code>\u6784\u9020\u5668\u5b8c\u6210\u3002\u4f8b\u5982\uff0c\u6211\u4eec\u53ef\u4ee5\u8c03\u6574\u88ab\u4f20\u9012\u7ed9\u51fd\u6570\u7684\u6570\u636e\uff1a</p>\n<pre class=\"screen\">SELECT name, double_salary(ROW(name, salary*1.1, age, cubicle)) AS dream\n    FROM emp;\n</pre>\n<p lang=\"zh\">\u4e5f\u53ef\u4ee5\u6784\u5efa\u4e00\u4e2a\u8fd4\u56de\u590d\u5408\u7c7b\u578b\u7684\u51fd\u6570\u3002\u8fd9\u662f\u4e00\u4e2a\u8fd4\u56de\u5355\u4e00<code class=\"type\">emp</code>\u884c\u7684\u51fd\u6570\u793a\u4f8b\uff1a</p>\n<pre class=\"programlisting\">CREATE FUNCTION new_emp() RETURNS emp AS $$\n    SELECT text 'None' AS name,\n        1000.0 AS salary,\n        25 AS age,\n        point '(2,2)' AS cubicle;\n$$ LANGUAGE SQL;\n</pre>\n<p lang=\"zh\">\u5728\u8fd9\u4e2a\u793a\u4f8b\u4e2d\uff0c\u6211\u4eec\u4e3a\u6bcf\u4e00\u4e2a\u5c5e\u6027\u6307\u5b9a\u4e86\u4e00\u4e2a\u5e38\u91cf\u503c\uff0c\u4f46\u662f\u53ef\u4ee5\u7528\u4efb\u4f55\u8ba1\u7b97\u6765\u66ff\u6362\u8fd9\u4e9b\u5e38\u91cf\u3002</p>\n<p lang=\"zh\">\u5b9a\u4e49\u8be5\u51fd\u6570\u65f6\u6709\u4e24\u70b9\u91cd\u8981\u6ce8\u610f\u4e8b\u9879\uff1a</p>\n<div class=\"itemizedlist\">\n<ul class=\"itemizedlist\">\n<li class=\"listitem\" lang=\"zh\">\n<p>\u67e5\u8be2\u4e2d\u7684\u9009\u62e9\u5217\u8868\u987a\u5e8f\u5fc5\u987b\u4e0e\u5217\u5728\u8be5\u590d\u5408\u7c7b\u578b\u6240\u5173\u8054\u7684\u8868\u4e2d\u51fa\u73b0\u7684\u987a\u5e8f\u5b8c\u5168\u76f8\u540c\u3002\uff08\u7cfb\u7edf\u4e0d\u8003\u8651\u50cf\u4e0a\u9762\u8fd9\u6837\u6307\u5b9a\u7684\u5217\u540d\u3002\uff09</p>\n</li>\n<li class=\"listitem\" lang=\"zh\">\n<p>\u4f60\u5fc5\u987b\u5bf9\u8868\u8fbe\u5f0f\u8fdb\u884c\u7c7b\u578b\u8f6c\u6362\uff0c\u4f7f\u4e4b\u4e0e\u590d\u5408\u7c7b\u578b\u7684\u5b9a\u4e49\u5339\u914d\uff0c\u5426\u5219\u4f1a\u5f97\u5230\u8fd9\u6837\u7684\u9519\u8bef\uff1a</p>\n<pre class=\"screen\">\n<code class=\"computeroutput\">ERROR:  function declared to return emp returns varchar instead of text at column 1</code>\n</pre></li>\n</ul>\n</div>\n<p lang=\"zh\">\u5b9a\u4e49\u540c\u4e00\u4e2a\u51fd\u6570\u7684\u53e6\u4e00\u79cd\u65b9\u6cd5\u662f\uff1a</p>\n<pre class=\"programlisting\">CREATE FUNCTION new_emp() RETURNS emp AS $$\n    SELECT ROW('None', 1000.0, 25, '(2,2)')::emp;\n$$ LANGUAGE SQL;\n</pre>\n<p lang=\"zh\">\u8fd9\u91cc\u6211\u4eec\u7f16\u5199\u4e86\u4e00\u4e2a <code class=\"command\">SELECT</code>\uff0c\u5b83\u53ea\u8fd4\u56de\u5177\u6709\u6b63\u786e\u590d\u5408\u7c7b\u578b\u7684\u5355\u5217\u3002\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b\uff0c\u8fd9\u6837\u505a\u5e76\u6ca1\u6709\u66f4\u597d\uff0c\u4f46\u5728\u67d0\u4e9b\u60c5\u51b5\u4e0b\u5b83\u662f\u4e00\u79cd\u65b9\u4fbf\u7684\u66ff\u4ee3\u65b9\u6cd5 \u2014 \u4f8b\u5982\uff0c\u5982\u679c\u6211\u4eec\u9700\u8981\u901a\u8fc7\u8c03\u7528\u53e6\u4e00\u4e2a\u8fd4\u56de\u6240\u9700\u590d\u5408\u503c\u7684\u51fd\u6570\u6765\u8ba1\u7b97\u7ed3\u679c\u3002</p>\n<p lang=\"zh\">\u6211\u4eec\u65e2\u53ef\u4ee5\u628a\u8fd9\u4e2a\u51fd\u6570\u76f4\u63a5\u5f53\u4f5c\u503c\u8868\u8fbe\u5f0f\u8c03\u7528\uff1a</p>\n<pre class=\"screen\">SELECT new_emp();\n\n         new_emp\n--------------------------\n (None,1000.0,25,\"(2,2)\")\n</pre>\n<p lang=\"zh\">\u4e5f\u53ef\u4ee5\u628a\u5b83\u5f53\u4f5c\u8868\u51fd\u6570\u6765\u8c03\u7528\uff1a</p>\n<pre class=\"screen\">SELECT * FROM new_emp();\n\n name | salary | age | cubicle\n------+--------+-----+---------\n None | 1000.0 |  25 | (2,2)\n</pre>\n<p lang=\"zh\">\u7b2c\u4e8c\u79cd\u65b9\u5f0f\u4f1a\u5728<a class=\"xref\" href=\"/docs/10/xfunc-sql.html#XFUNC-SQL-TABLE-FUNCTIONS\" title=\"37.4.7.\u00a0SQL \u51fd\u6570\u4f5c\u4e3a\u8868\u6765\u6e90\">\u7b2c\u00a037.4.7\u00a0\u8282</a>\u4e2d\u8fdb\u4e00\u6b65\u8bf4\u660e\u3002</p>\n<p lang=\"zh\">\u5f53\u4f60\u4f7f\u7528\u8fd4\u56de\u590d\u5408\u7c7b\u578b\u7684\u51fd\u6570\u65f6\uff0c\u53ef\u80fd\u53ea\u9700\u8981\u53d6\u5176\u7ed3\u679c\u4e2d\u7684\u4e00\u4e2a\u5b57\u6bb5\uff08\u5c5e\u6027\uff09\u3002\u53ef\u4ee5\u4f7f\u7528\u4e0b\u9762\u8fd9\u6837\u7684\u8bed\u6cd5\uff1a</p>\n<pre class=\"screen\">SELECT (new_emp()).name;\n\n name\n------\n None\n</pre>\n<p lang=\"zh\">\u8fd9\u91cc\u9700\u8981\u989d\u5916\u7684\u62ec\u53f7\uff0c\u4ee5\u514d\u89e3\u6790\u5668\u4ea7\u751f\u6b67\u4e49\u3002\u5982\u679c\u4e0d\u52a0\u62ec\u53f7\uff0c\u7ed3\u679c\u4f1a\u662f\u8fd9\u6837\uff1a</p>\n<pre class=\"screen\">SELECT new_emp().name;\nERROR:  syntax error at or near \".\"\nLINE 1: SELECT new_emp().name;\n                        ^\n</pre>\n<p lang=\"zh\">\u53e6\u4e00\u79cd\u9009\u62e9\u662f\u4f7f\u7528\u51fd\u6570\u8bb0\u6cd5\u6765\u63d0\u53d6\u5c5e\u6027\uff1a</p>\n<pre class=\"screen\">SELECT name(new_emp());\n\n name\n------\n None\n</pre>\n<p lang=\"zh\">\u5982<a class=\"xref\" href=\"/docs/10/rowtypes.html#ROWTYPES-USAGE\" title=\"8.16.5.\u00a0\u5728\u67e5\u8be2\u4e2d\u4f7f\u7528\u590d\u5408\u7c7b\u578b\">\u7b2c\u00a08.16.5\u00a0\u8282</a>\u6240\u8ff0\uff0c\u5b57\u6bb5\u8bb0\u6cd5\u548c\u51fd\u6570\u8bb0\u6cd5\u662f\u7b49\u4ef7\u7684\u3002</p>\n<p lang=\"zh\">\u53e6\u4e00\u79cd\u4f7f\u7528\u51fd\u6570\u8fd4\u56de\u590d\u5408\u7c7b\u578b\u7684\u65b9\u6cd5\u662f\u5c06\u7ed3\u679c\u4f20\u9012\u7ed9\u53e6\u4e00\u4e2a\u63a5\u53d7\u6b63\u786e\u884c\u7c7b\u578b\u4f5c\u4e3a\u8f93\u5165\u7684\u51fd\u6570\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION getname(emp) RETURNS text AS $$\n    SELECT $1.name;\n$$ LANGUAGE SQL;\n\nSELECT getname(new_emp());\n getname\n---------\n None\n(1 row)\n</pre></div>\n<div class=\"sect2\" id=\"XFUNC-OUTPUT-PARAMETERS\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/10/xfunc-sql.html#XFUNC-OUTPUT-PARAMETERS\">37.4.4. \u5e26\u6709\u8f93\u51fa\u53c2\u6570\u7684<acronym class=\"acronym\">SQL</acronym>\u51fd\u6570</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\">\u63cf\u8ff0\u51fd\u6570\u7ed3\u679c\u7684\u53e6\u4e00\u79cd\u65b9\u6cd5\u662f\u4f7f\u7528<em class=\"firstterm\">\u8f93\u51fa\u53c2\u6570</em>\uff0c\u4f8b\u5982\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION add_em (IN x int, IN y int, OUT sum int)\nAS 'SELECT x + y'\nLANGUAGE SQL;\n\nSELECT add_em(3,7);\n add_em\n--------\n     10\n(1 row)\n</pre>\n<p lang=\"zh\">\u8fd9\u4e0e<a class=\"xref\" href=\"/docs/10/xfunc-sql.html#XFUNC-SQL-BASE-FUNCTIONS\" title=\"37.4.2.\u00a0\u57fa\u7840\u7c7b\u578b\u4e0a\u7684SQL\u51fd\u6570\">\u7b2c\u00a037.4.2\u00a0\u8282</a>\u4e2d\u5c55\u793a\u7684 <code class=\"literal\">add_em</code> \u7248\u672c\u672c\u8d28\u4e0a\u5e76\u65e0\u4e0d\u540c\u3002\u8f93\u51fa\u53c2\u6570\u7684\u771f\u6b63\u4ef7\u503c\u5728\u4e8e\uff0c\u5b83\u4eec\u4e3a\u5b9a\u4e49\u8fd4\u56de\u591a\u5217\u7684\u51fd\u6570\u63d0\u4f9b\u4e86\u4e00\u79cd\u65b9\u4fbf\u7684\u65b9\u6cd5\u3002\u4f8b\u5982\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION sum_n_product (x int, y int, OUT sum int, OUT product int)\nAS 'SELECT x + y, x * y'\nLANGUAGE SQL;\n\n SELECT * FROM sum_n_product(11,42);\n sum | product\n-----+---------\n  53 |     462\n(1 row)\n</pre>\n<p lang=\"zh\">\u8fd9\u91cc\u672c\u8d28\u4e0a\u53d1\u751f\u7684\u4e8b\u60c5\u662f\uff1a\u6211\u4eec\u4e3a\u8be5\u51fd\u6570\u7684\u7ed3\u679c\u521b\u5efa\u4e86\u4e00\u4e2a\u533f\u540d\u590d\u5408\u7c7b\u578b\u3002\u4e0a\u9762\u7684\u793a\u4f8b\u4e0e\u4e0b\u9762\u8fd9\u79cd\u5199\u6cd5\u7684\u6700\u7ec8\u6548\u679c\u76f8\u540c\uff1a</p>\n<pre class=\"screen\">CREATE TYPE sum_prod AS (sum int, product int);\n\nCREATE FUNCTION sum_n_product (int, int) RETURNS sum_prod\nAS 'SELECT $1 + $2, $1 * $2'\nLANGUAGE SQL;\n</pre>\n<p lang=\"zh\">\u4f46\u901a\u5e38\u4e0d\u5fc5\u989d\u5916\u5b9a\u4e49\u4e00\u4e2a\u72ec\u7acb\u7684\u590d\u5408\u7c7b\u578b\u4f1a\u66f4\u65b9\u4fbf\u3002\u6ce8\u610f\uff0c\u9644\u5728\u8f93\u51fa\u53c2\u6570\u4e0a\u7684\u540d\u79f0\u5e76\u975e\u53ea\u662f\u88c5\u9970\uff0c\u5b83\u4eec\u51b3\u5b9a\u4e86\u8fd9\u4e2a\u533f\u540d\u590d\u5408\u7c7b\u578b\u7684\u5217\u540d\u3002\uff08\u5982\u679c\u7701\u7565\u8f93\u51fa\u53c2\u6570\u540d\u79f0\uff0c\u7cfb\u7edf\u4f1a\u81ea\u884c\u9009\u62e9\u4e00\u4e2a\u540d\u79f0\u3002\uff09</p>\n<p lang=\"zh\">\u5728\u4ece SQL \u8c03\u7528\u8fd9\u6837\u4e00\u4e2a\u51fd\u6570\u65f6\uff0c\u8f93\u51fa\u53c2\u6570\u4e0d\u4f1a\u88ab\u5305\u62ec\u5728\u8c03\u7528\u53c2\u6570\u5217\u8868\u4e2d\u3002\u8fd9\u662f\u56e0\u4e3a<span class=\"productname\">PostgreSQL</span>\u53ea\u8003\u8651\u8f93\u5165\u53c2\u6570\u6765\u5b9a\u4e49\u51fd\u6570\u7684\u8c03\u7528\u7b7e\u540d\u3002\u8fd9\u4e5f\u610f\u5473\u7740\u5728\u4e3a\u8bf8\u5982\u5220\u9664\u51fd\u6570\u7b49\u76ee\u7684\u5f15\u7528\u8be5\u51fd\u6570\u65f6\u53ea\u6709\u8f93\u5165\u53c2\u6570\u6709\u5173\u7cfb\u3002\u6211\u4eec\u53ef\u4ee5\u7528\u4e0b\u9762\u7684\u547d\u4ee4\u4e4b\u4e00\u5220\u9664\u4e0a\u8ff0\u51fd\u6570</p>\n<pre class=\"screen\">DROP FUNCTION sum_n_product (x int, y int, OUT sum int, OUT product int);\nDROP FUNCTION sum_n_product (int, int);\n</pre>\n<p lang=\"zh\">\u53c2\u6570\u53ef\u4ee5\u88ab\u6807\u8bb0\u4e3a<code class=\"literal\">IN</code>\uff08\u9ed8\u8ba4\uff09\u3001<code class=\"literal\">OUT</code>\u3001<code class=\"literal\">INOUT</code>\u6216\u8005<code class=\"literal\">VARIADIC</code>\u3002\u4e00\u4e2a<code class=\"literal\">INOUT</code>\u53c2\u6570\u65e2\u4f5c\u4e3a\u4e00\u4e2a\u8f93\u5165\u53c2\u6570\uff08\u8c03\u7528\u53c2\u6570\u5217\u8868\u7684\u4e00\u90e8\u5206\uff09\u53c8\u4f5c\u4e3a\u4e00\u4e2a\u8f93\u51fa\u53c2\u6570\uff08\u7ed3\u679c\u8bb0\u5f55\u7c7b\u578b\u7684\u4e00\u90e8\u5206\uff09\u3002<code class=\"literal\">VARIADIC</code>\u53c2\u6570\u662f\u8f93\u5165\u53c2\u6570\uff0c\u4f46\u88ab\u6309\u7167\u4e0b\u6587\u6240\u8ff0\u7279\u6b8a\u5bf9\u5f85\u3002</p>\n</div>\n<div class=\"sect2\" id=\"XFUNC-SQL-VARIADIC-FUNCTIONS\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/10/xfunc-sql.html#XFUNC-SQL-VARIADIC-FUNCTIONS\">37.4.5. \u5e26\u6709\u53ef\u53d8\u6570\u91cf\u53c2\u6570\u7684<acronym class=\"acronym\">SQL</acronym>\u51fd\u6570</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\"><acronym class=\"acronym\">SQL</acronym> \u51fd\u6570\u53ef\u4ee5\u88ab\u58f0\u660e\u4e3a\u63a5\u53d7\u53ef\u53d8\u6570\u91cf\u7684\u53c2\u6570\uff0c\u53ea\u8981\u6240\u6709<span class=\"quote\">\u201c<span class=\"quote\">\u53ef\u9009</span>\u201d</span>\u53c2\u6570\u90fd\u5c5e\u4e8e\u540c\u4e00\u79cd\u6570\u636e\u7c7b\u578b\u3002\u53ef\u9009\u53c2\u6570\u4f1a\u4ee5\u6570\u7ec4\u5f62\u5f0f\u4f20\u9012\u7ed9\u51fd\u6570\u3002\u5b9a\u4e49\u8fd9\u7c7b\u51fd\u6570\u65f6\uff0c\u9700\u8981\u628a\u6700\u540e\u4e00\u4e2a\u53c2\u6570\u6807\u8bb0\u4e3a <code class=\"literal\">VARIADIC</code>\uff1b\u8be5\u53c2\u6570\u5fc5\u987b\u88ab\u58f0\u660e\u4e3a\u6570\u7ec4\u7c7b\u578b\u3002\u4f8b\u5982\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION mleast(VARIADIC arr numeric[]) RETURNS numeric AS $$\n    SELECT min($1[i]) FROM generate_subscripts($1, 1) g(i);\n$$ LANGUAGE SQL;\n\nSELECT mleast(10, -1, 5, 4.4);\n mleast \n--------\n     -1\n(1 row)\n</pre>\n<p lang=\"zh\">\u5b9e\u9645\u4e0a\uff0c\u4f4d\u4e8e <code class=\"literal\">VARIADIC</code> \u4f4d\u7f6e\u53ca\u4e4b\u540e\u7684\u6240\u6709\u5b9e\u53c2\u90fd\u4f1a\u88ab\u6536\u96c6\u6210\u4e00\u4e2a\u4e00\u7ef4\u6570\u7ec4\uff0c\u5c31\u50cf\u4f60\u5199\u6210\u4e86\uff1a</p>\n<pre class=\"screen\">SELECT mleast(ARRAY[10, -1, 5, 4.4]);    -- doesn't work\n</pre>\n<p lang=\"zh\">\u4e0d\u8fc7\u4f60\u5b9e\u9645\u4e0a\u4e0d\u80fd\u8fd9\u6837\u5199\uff0c\u81f3\u5c11\u5b83\u4e0d\u4f1a\u5339\u914d\u8fd9\u4e2a\u51fd\u6570\u5b9a\u4e49\u3002\u88ab\u6807\u8bb0\u4e3a <code class=\"literal\">VARIADIC</code> \u7684\u53c2\u6570\u5339\u914d\u7684\u662f\u5176\u5143\u7d20\u7c7b\u578b\u51fa\u73b0\u4e00\u6b21\u6216\u591a\u6b21\uff0c\u800c\u4e0d\u662f\u5b83\u81ea\u8eab\u7684\u6570\u7ec4\u7c7b\u578b\u3002</p>\n<p lang=\"zh\">\u6709\u65f6\u5019\uff0c\u80fd\u591f\u628a\u4e00\u4e2a\u5df2\u7ecf\u6784\u9020\u597d\u7684\u6570\u7ec4\u4f20\u7ed9\u53ef\u53d8\u53c2\u6570\u51fd\u6570\u4f1a\u5f88\u6709\u7528\uff0c\u5c24\u5176\u662f\u5f53\u4e00\u4e2a\u53ef\u53d8\u53c2\u6570\u51fd\u6570\u60f3\u628a\u5b83\u7684\u6570\u7ec4\u53c2\u6570\u518d\u4f20\u7ed9\u53e6\u4e00\u4e2a\u51fd\u6570\u65f6\u3002\u6b64\u5916\uff0c\u5728\u5141\u8bb8\u4e0d\u53d7\u4fe1\u4efb\u7528\u6237\u521b\u5efa\u5bf9\u8c61\u7684\u6a21\u5f0f\u4e2d\u8c03\u7528\u53ef\u53d8\u53c2\u6570\u51fd\u6570\u65f6\uff0c\u8fd9\u662f\u552f\u4e00\u5b89\u5168\u7684\u65b9\u5f0f\uff0c\u89c1<a class=\"xref\" href=\"/docs/10/typeconv-func.html\" title=\"10.3.\u00a0\u51fd\u6570\">\u7b2c\u00a010.3\u00a0\u8282</a>\u3002\u4f60\u53ef\u4ee5\u5728\u8c03\u7528\u4e2d\u6307\u5b9a<code class=\"literal\">VARIADIC</code>\u6765\u505a\u5230\u8fd9\u4e00\u70b9\uff1a</p>\n<pre class=\"screen\">SELECT mleast(VARIADIC ARRAY[10, -1, 5, 4.4]);\n</pre>\n<p lang=\"zh\">\u8fd9\u6837\u4f1a\u963b\u6b62\u51fd\u6570\u7684\u53ef\u53d8\u53c2\u6570\u6309\u5176\u5143\u7d20\u7c7b\u578b\u5c55\u5f00\uff0c\u4ece\u800c\u8ba9\u6570\u7ec4\u5b9e\u53c2\u80fd\u591f\u6309\u5e38\u89c4\u65b9\u5f0f\u5339\u914d\u3002<code class=\"literal\">VARIADIC</code> \u53ea\u80fd\u9644\u52a0\u5728\u51fd\u6570\u8c03\u7528\u7684\u6700\u540e\u4e00\u4e2a\u5b9e\u53c2\u4e0a\u3002</p>\n<p lang=\"zh\">\u5728\u8c03\u7528\u4e2d\u6307\u5b9a<code class=\"literal\">VARIADIC</code>\u4e5f\u662f\u5411\u53ef\u53d8\u53c2\u6570\u51fd\u6570\u4f20\u9012\u7a7a\u6570\u7ec4\u7684\u552f\u4e00\u65b9\u5f0f\uff0c\u4f8b\u5982\uff1a</p>\n<pre class=\"screen\">SELECT mleast(VARIADIC ARRAY[]::numeric[]);\n</pre>\n<p lang=\"zh\">\u4ec5\u4ec5\u5199\u6210<code class=\"literal\">SELECT mleast()</code>\u662f\u884c\u4e0d\u901a\u7684\uff0c\u56e0\u4e3a\u53ef\u53d8\u53c2\u6570\u5fc5\u987b\u5339\u914d\u81f3\u5c11\u4e00\u4e2a\u5b9e\u53c2\u3002\uff08\u5982\u679c\u4f60\u5e0c\u671b\u5141\u8bb8\u8fd9\u79cd\u8c03\u7528\uff0c\u53ef\u4ee5\u518d\u5b9a\u4e49\u4e00\u4e2a\u540c\u540d\u4e14\u4e0d\u5e26\u53c2\u6570\u7684\u51fd\u6570<code class=\"literal\">mleast</code>\u3002\uff09</p>\n<p lang=\"zh\">\u4ece\u53ef\u53d8\u53c2\u6570\u6d3e\u751f\u51fa\u7684\u6570\u7ec4\u5143\u7d20\u53c2\u6570\u4f1a\u88ab\u89c6\u4e3a\u6ca1\u6709\u81ea\u5df1\u7684\u540d\u5b57\u3002\u8fd9\u610f\u5473\u7740\u9664\u975e\u4f60\u6307\u5b9a\u4e86 <code class=\"literal\">VARIADIC</code>\uff0c\u5426\u5219\u4e0d\u80fd\u4f7f\u7528\u547d\u540d\u53c2\u6570\u6765\u8c03\u7528\u53ef\u53d8\u53c2\u6570\u51fd\u6570\uff08<a class=\"xref\" href=\"/docs/10/sql-syntax-calling-funcs.html\" title=\"4.3.\u00a0\u8c03\u7528\u51fd\u6570\">\u7b2c\u00a04.3\u00a0\u8282</a>\uff09\u3002\u4f8b\u5982\uff0c\u4e0b\u9762\u7684\u8c03\u7528\u662f\u53ef\u884c\u7684\uff1a</p>\n<pre class=\"screen\">SELECT mleast(VARIADIC arr =&gt; ARRAY[10, -1, 5, 4.4]);\n</pre>\n<p lang=\"zh\">\u4f46\u8fd9\u4e9b\u5c31\u4e0d\u884c\uff1a</p>\n<pre class=\"screen\">SELECT mleast(arr =&gt; 10);\nSELECT mleast(arr =&gt; ARRAY[10, -1, 5, 4.4]);\n</pre></div>\n<div class=\"sect2\" id=\"XFUNC-SQL-PARAMETER-DEFAULTS\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/10/xfunc-sql.html#XFUNC-SQL-PARAMETER-DEFAULTS\">37.4.6. \u5e26\u6709\u53c2\u6570\u9ed8\u8ba4\u503c\u7684<acronym class=\"acronym\">SQL</acronym>\u51fd\u6570</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\">\u51fd\u6570\u53ef\u4ee5\u88ab\u58f0\u660e\u4e3a\u5bf9\u4e00\u4e9b\u6216\u8005\u6240\u6709\u8f93\u5165\u53c2\u6570\u5177\u6709\u9ed8\u8ba4\u503c\u3002\u53ea\u8981\u8c03\u7528\u51fd\u6570\u65f6\u6ca1\u6709\u7ed9\u51fa\u8db3\u591f\u591a\u7684\u5b9e\u53c2\uff0c\u5c31\u4f1a\u63d2\u5165\u9ed8\u8ba4\u503c\u6765\u5f25\u8865\u7f3a\u5931\u7684\u5b9e\u53c2\u3002\u7531\u4e8e\u53c2\u6570\u53ea\u80fd\u4ece\u5b9e\u53c2\u5217\u8868\u7684\u5c3e\u90e8\u5f00\u59cb\u88ab\u7701\u7565\uff0c\u5728\u4e00\u4e2a\u6709\u9ed8\u8ba4\u503c\u7684\u53c2\u6570\u4e4b\u540e\u7684\u6240\u6709\u53c2\u6570\u90fd\u4e0d\u5f97\u4e0d\u4e5f\u5177\u6709\u9ed8\u8ba4\u503c\uff08\u5c3d\u7ba1\u4f7f\u7528\u547d\u540d\u53c2\u6570\u8bb0\u6cd5\u53ef\u4ee5\u5141\u8bb8\u653e\u677e\u8fd9\u79cd\u9650\u5236\uff0c\u8fd9\u79cd\u9650\u5236\u4ecd\u7136\u4f1a\u88ab\u5f3a\u5236\u4ee5\u4fbf\u4f4d\u7f6e\u53c2\u6570\u8bb0\u6cd5\u80fd\u5de5\u4f5c\uff09\u3002\u4e0d\u7ba1\u4f60\u662f\u5426\u4f7f\u7528\u5b83\uff0c\u8fd9\u79cd\u80fd\u529b\u90fd\u8981\u6c42\u5728\u67d0\u4e9b\u7528\u6237\u4e0d\u4fe1\u4efb\u5176\u4ed6\u7528\u6237\u7684\u6570\u636e\u5e93\u4e2d\u8c03\u7528\u51fd\u6570\u65f6\u91c7\u53d6\u4e00\u4e9b\u9884\u9632\u63aa\u65bd\uff0c\u89c1<a class=\"xref\" href=\"/docs/10/typeconv-func.html\" title=\"10.3.\u00a0\u51fd\u6570\">\u7b2c\u00a010.3\u00a0\u8282</a>\u3002</p>\n<p lang=\"zh\">\u4f8b\u5982\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION foo(a int, b int DEFAULT 2, c int DEFAULT 3)\nRETURNS int\nLANGUAGE SQL\nAS $$\n    SELECT $1 + $2 + $3;\n$$;\n\nSELECT foo(10, 20, 30);\n foo \n-----\n  60\n(1 row)\n\nSELECT foo(10, 20);\n foo \n-----\n  33\n(1 row)\n\nSELECT foo(10);\n foo \n-----\n  15\n(1 row)\n\nSELECT foo();  -- fails since there is no default for the first argument\nERROR:  function foo() does not exist\n</pre>\n<p lang=\"zh\">\u4e5f\u53ef\u4ee5\u7528 <code class=\"literal\">=</code> \u7b26\u53f7\u4ee3\u66ff\u5173\u952e\u5b57 <code class=\"literal\">DEFAULT</code>\u3002</p>\n</div>\n<div class=\"sect2\" id=\"XFUNC-SQL-TABLE-FUNCTIONS\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/10/xfunc-sql.html#XFUNC-SQL-TABLE-FUNCTIONS\">37.4.7. <acronym class=\"acronym\">SQL</acronym> \u51fd\u6570\u4f5c\u4e3a\u8868\u6765\u6e90</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\">\u6240\u6709\u7684 SQL \u51fd\u6570\u90fd\u53ef\u4ee5\u88ab\u7528\u5728\u67e5\u8be2\u7684<code class=\"literal\">FROM</code>\u5b50\u53e5\u4e2d\uff0c\u4f46\u662f\u5bf9\u4e8e\u8fd4\u56de\u590d\u5408\u7c7b\u578b\u7684\u51fd\u6570\u7279\u522b\u6709\u7528\u3002\u5982\u679c\u51fd\u6570\u88ab\u5b9a\u4e49\u4e3a\u8fd4\u56de\u4e00\u79cd\u57fa\u7840\u7c7b\u578b\uff0c\u8be5\u8868\u51fd\u6570\u4f1a\u4ea7\u751f\u4e00\u4e2a\u5355\u5217\u8868\u3002\u5982\u679c\u8be5\u51fd\u6570\u88ab\u5b9a\u4e49\u4e3a\u8fd4\u56de\u4e00\u79cd\u590d\u5408\u7c7b\u578b\uff0c\u8be5\u8868\u51fd\u6570\u4f1a\u4e3a\u8be5\u590d\u5408\u7c7b\u578b\u7684\u6bcf\u4e00\u4e2a\u5c5e\u6027\u4ea7\u751f\u4e00\u5217\u3002</p>\n<p lang=\"zh\">\u4ee5\u4e0b\u662f\u4e00\u4e2a\u793a\u4f8b\uff1a</p>\n<pre class=\"screen\">CREATE TABLE foo (fooid int, foosubid int, fooname text);\nINSERT INTO foo VALUES (1, 1, 'Joe');\nINSERT INTO foo VALUES (1, 2, 'Ed');\nINSERT INTO foo VALUES (2, 1, 'Mary');\n\nCREATE FUNCTION getfoo(int) RETURNS foo AS $$\n    SELECT * FROM foo WHERE fooid = $1;\n$$ LANGUAGE SQL;\n\nSELECT *, upper(fooname) FROM getfoo(1) AS t1;\n\n fooid | foosubid | fooname | upper\n-------+----------+---------+-------\n     1 |        1 | Joe     | JOE\n(1 row)\n</pre>\n<p lang=\"zh\">\u5982\u793a\u4f8b\u6240\u793a\uff0c\u6211\u4eec\u53ef\u4ee5\u50cf\u64cd\u4f5c\u666e\u901a\u8868\u7684\u5217\u4e00\u6837\u64cd\u4f5c\u51fd\u6570\u7ed3\u679c\u4e2d\u7684\u5217\u3002</p>\n<p lang=\"zh\">\u6ce8\u610f\u6211\u4eec\u53ea\u4ece\u51fd\u6570\u5f97\u5230\u4e86\u4e00\u884c\u3002\u8fd9\u662f\u56e0\u4e3a\u6211\u4eec\u6ca1\u6709\u4f7f\u7528<code class=\"literal\">SETOF</code>\u3002\u8fd9\u4f1a\u5728\u4e0b\u4e00\u8282\u4e2d\u4ecb\u7ecd\u3002</p>\n</div>\n<div class=\"sect2\" id=\"XFUNC-SQL-FUNCTIONS-RETURNING-SET\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/10/xfunc-sql.html#XFUNC-SQL-FUNCTIONS-RETURNING-SET\">37.4.8. \u8fd4\u56de\u96c6\u5408\u7684<acronym class=\"acronym\">SQL</acronym>\u51fd\u6570</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\">\u5f53\u4e00\u4e2a SQL \u51fd\u6570\u88ab\u58f0\u660e\u4e3a\u8fd4\u56de<code class=\"literal\">SETOF <em class=\"replaceable\"><code>sometype</code></em></code>\u65f6\uff0c\u8be5\u51fd\u6570\u7684\u6700\u540e\u4e00\u4e2a\u67e5\u8be2\u4f1a\u88ab\u6267\u884c\u5b8c\uff0c\u5e76\u4e14\u5b83\u8f93\u51fa\u7684\u6bcf\u4e00\u884c\u90fd\u4f1a\u88ab\u4f5c\u4e3a\u7ed3\u679c\u96c6\u7684\u4e00\u4e2a\u5143\u7d20\u8fd4\u56de\u3002</p>\n<p lang=\"zh\">\u8fd9\u4e00\u7279\u6027\u901a\u5e38\u662f\u5728\u67e5\u8be2\u7684 <code class=\"literal\">FROM</code> \u5b50\u53e5\u4e2d\u8c03\u7528\u51fd\u6570\u65f6\u4f7f\u7528\u7684\u3002\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b\uff0c\u51fd\u6570\u8fd4\u56de\u7684\u6bcf\u4e00\u884c\u90fd\u4f1a\u6210\u4e3a\u67e5\u8be2\u6240\u89c1\u8868\u4e2d\u7684\u4e00\u884c\u3002\u4f8b\u5982\uff0c\u5047\u8bbe\u8868 <code class=\"literal\">foo</code> \u4e0e\u4e0a\u6587\u76f8\u540c\uff0c\u6211\u4eec\u5199\uff1a</p>\n<pre class=\"programlisting\">CREATE FUNCTION getfoo(int) RETURNS SETOF foo AS $$\n    SELECT * FROM foo WHERE fooid = $1;\n$$ LANGUAGE SQL;\n\nSELECT * FROM getfoo(1) AS t1;\n</pre>\n<p lang=\"zh\">\u90a3\u4e48\u4f1a\u5f97\u5230\uff1a</p>\n<pre class=\"screen\"> fooid | foosubid | fooname\n-------+----------+---------\n     1 |        1 | Joe\n     1 |        2 | Ed\n(2 rows)\n</pre>\n<p lang=\"zh\">\u4e5f\u53ef\u4ee5\u901a\u8fc7\u8f93\u51fa\u53c2\u6570\u5b9a\u4e49\u7684\u5217\u6765\u8fd4\u56de\u591a\u884c\uff0c\u4f8b\u5982\uff1a</p>\n<pre class=\"programlisting\">CREATE TABLE tab (y int, z int);\nINSERT INTO tab VALUES (1, 2), (3, 4), (5, 6), (7, 8);\n\nCREATE FUNCTION sum_n_product_with_tab (x int, OUT sum int, OUT product int)\nRETURNS SETOF record\nAS $$\n    SELECT $1 + tab.y, $1 * tab.y FROM tab;\n$$ LANGUAGE SQL;\n\nSELECT * FROM sum_n_product_with_tab(10);\n sum | product\n-----+---------\n  11 |      10\n  13 |      30\n  15 |      50\n  17 |      70\n(4 rows)\n</pre>\n<p lang=\"zh\">\u8fd9\u91cc\u7684\u5173\u952e\u70b9\u662f\uff1a\u4f60\u5fc5\u987b\u5199\u6210 <code class=\"literal\">RETURNS SETOF record</code>\uff0c\u4ee5\u8868\u660e\u8be5\u51fd\u6570\u8fd4\u56de\u7684\u662f\u591a\u884c\u800c\u4e0d\u662f\u5355\u884c\u3002\u5982\u679c\u53ea\u6709\u4e00\u4e2a\u8f93\u51fa\u53c2\u6570\uff0c\u5219\u5199\u8be5\u53c2\u6570\u7684\u7c7b\u578b\uff0c\u800c\u4e0d\u662f <code class=\"type\">record</code>\u3002</p>\n<p lang=\"zh\">\u901a\u8fc7\u591a\u6b21\u8c03\u7528\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u6765\u6784\u9020\u67e5\u8be2\u7ed3\u679c\u901a\u5e38\u5f88\u6709\u7528\uff0c\u5176\u4e2d\u6bcf\u6b21\u8c03\u7528\u7684\u53c2\u6570\u90fd\u6765\u81ea\u8868\u6216\u5b50\u67e5\u8be2\u7684\u8fde\u7eed\u884c\u3002\u9996\u9009\u65b9\u5f0f\u662f\u4f7f\u7528 <code class=\"literal\">LATERAL</code> \u5173\u952e\u5b57\uff0c\u8be6\u89c1<a class=\"xref\" href=\"/docs/10/queries-table-expressions.html#QUERIES-LATERAL\" title=\"7.2.1.5.\u00a0LATERAL\u5b50\u67e5\u8be2\">\u7b2c\u00a07.2.1.5\u00a0\u8282</a>\u3002\u4e0b\u9762\u662f\u4e00\u4e2a\u4f7f\u7528\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u679a\u4e3e\u6811\u7ed3\u6784\u5143\u7d20\u7684\u793a\u4f8b\uff1a</p>\n<pre class=\"screen\">SELECT * FROM nodes;\n   name    | parent\n-----------+--------\n Top       |\n Child1    | Top\n Child2    | Top\n Child3    | Top\n SubChild1 | Child1\n SubChild2 | Child1\n(6 rows)\n\nCREATE FUNCTION listchildren(text) RETURNS SETOF text AS $$\n    SELECT name FROM nodes WHERE parent = $1\n$$ LANGUAGE SQL STABLE;\n\nSELECT * FROM listchildren('Top');\n listchildren\n--------------\n Child1\n Child2\n Child3\n(3 rows)\n\nSELECT name, child FROM nodes, LATERAL listchildren(name) AS child;\n  name  |   child\n--------+-----------\n Top    | Child1\n Top    | Child2\n Top    | Child3\n Child1 | SubChild1\n Child1 | SubChild2\n(5 rows)\n</pre>\n<p lang=\"zh\">\u8fd9\u4e2a\u4f8b\u5b50\u5e76\u6ca1\u6709\u505a\u51fa\u4efb\u4f55\u65e0\u6cd5\u7528\u7b80\u5355\u8fde\u63a5\u5b9e\u73b0\u7684\u4e8b\uff0c\u4f46\u5728\u66f4\u590d\u6742\u7684\u8ba1\u7b97\u4e2d\uff0c\u628a\u4e00\u90e8\u5206\u5de5\u4f5c\u653e\u8fdb\u51fd\u6570\u91cc\u901a\u5e38\u4f1a\u975e\u5e38\u65b9\u4fbf\u3002</p>\n<p lang=\"zh\">\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u4e5f\u53ef\u4ee5\u51fa\u73b0\u5728\u67e5\u8be2\u7684\u9009\u62e9\u5217\u8868\u4e2d\u3002\u5bf9\u4e8e\u67e5\u8be2\u672c\u8eab\u751f\u6210\u7684\u6bcf\u4e00\u884c\uff0c\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u90fd\u4f1a\u88ab\u8c03\u7528\uff0c\u5e76\u4e3a\u5176\u7ed3\u679c\u96c6\u4e2d\u7684\u6bcf\u4e00\u4e2a\u5143\u7d20\u751f\u6210\u4e00\u884c\u8f93\u51fa\u3002\u524d\u9762\u7684\u4f8b\u5b50\u4e5f\u53ef\u4ee5\u5199\u6210\u8fd9\u6837\uff1a</p>\n<pre class=\"screen\">SELECT listchildren('Top');\n listchildren\n--------------\n Child1\n Child2\n Child3\n(3 rows)\n\nSELECT name, listchildren(name) FROM nodes;\n  name  | listchildren\n--------+--------------\n Top    | Child1\n Top    | Child2\n Top    | Child3\n Child1 | SubChild1\n Child1 | SubChild2\n(5 rows)\n</pre>\n<p lang=\"zh\">\u5728\u6700\u540e\u4e00\u4e2a <code class=\"command\">SELECT</code> \u4e2d\uff0c\u6ce8\u610f\u6ca1\u6709\u4e3a <code class=\"literal\">Child2</code>\u3001<code class=\"literal\">Child3</code> \u7b49\u663e\u793a\u4efb\u4f55\u8f93\u51fa\u884c\u3002\u8fd9\u662f\u56e0\u4e3a <code class=\"function\">listchildren</code> \u5bf9\u8fd9\u4e9b\u53c2\u6570\u8fd4\u56de\u7684\u662f\u7a7a\u96c6\uff0c\u56e0\u6b64\u4e0d\u4f1a\u751f\u6210\u7ed3\u679c\u884c\u3002\u8fd9\u4e0e\u4f7f\u7528 <code class=\"literal\">LATERAL</code> \u8bed\u6cd5\u628a\u51fd\u6570\u7ed3\u679c\u505a\u5185\u8fde\u63a5\u65f6\u5f97\u5230\u7684\u884c\u4e3a\u76f8\u540c\u3002</p>\n<p lang=\"zh\"><span class=\"productname\">PostgreSQL</span>\u5bf9\u67e5\u8be2\u9009\u62e9\u5217\u8868\u4e2d\u7684\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u7684\u5904\u7406\u65b9\u5f0f\uff0c\u51e0\u4e4e\u4e0e\u5c06\u8be5\u51fd\u6570\u5199\u5728 <code class=\"literal\">LATERAL FROM</code> \u5b50\u53e5\u9879\u4e2d\u65f6\u5b8c\u5168\u76f8\u540c\u3002\u4f8b\u5982\uff0c</p>\n<pre class=\"programlisting\">SELECT x, generate_series(1,5) AS g FROM tab;\n</pre>\n<p lang=\"zh\">\u51e0\u4e4e\u7b49\u4ef7\u4e8e</p>\n<pre class=\"programlisting\">SELECT x, g FROM tab, LATERAL generate_series(1,5) AS g;\n</pre>\n<p lang=\"zh\">\u4e24\u8005\u672c\u5e94\u5b8c\u5168\u76f8\u540c\uff0c\u4f46\u5728\u8fd9\u4e2a\u7279\u5b9a\u793a\u4f8b\u4e2d\uff0c\u89c4\u5212\u5668\u53ef\u4ee5\u9009\u62e9\u5c06 <code class=\"structname\">g</code> \u653e\u5728\u5d4c\u5957\u5faa\u73af\u8fde\u63a5\u7684\u5916\u4fa7\uff0c\u56e0\u4e3a <code class=\"structname\">g</code> \u5b9e\u9645\u4e0a\u5e76\u4e0d\u6a2a\u5411\u4f9d\u8d56\u4e8e <code class=\"structname\">tab</code>\u3002\u8fd9\u4f1a\u5bfc\u81f4\u8f93\u51fa\u884c\u7684\u987a\u5e8f\u4e0d\u540c\u3002\u5bf9\u9009\u62e9\u5217\u8868\u4e2d\u7684\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u6c42\u503c\u65f6\uff0c\u603b\u662f\u5c06\u5176\u89c6\u4e3a\u4f4d\u4e8e\u4e0e <code class=\"literal\">FROM</code> \u5b50\u53e5\u5176\u4f59\u90e8\u5206\u7684\u5d4c\u5957\u5faa\u73af\u8fde\u63a5\u7684\u5185\u4fa7\uff0c\u56e0\u6b64\u5728\u8003\u8651 <code class=\"literal\">FROM</code> \u5b50\u53e5\u7684\u4e0b\u4e00\u884c\u4e4b\u524d\uff0c\u8fd9\u4e9b\u51fd\u6570\u90fd\u4f1a\u8fd0\u884c\u5230\u5b8c\u6210\u3002</p>\n<p lang=\"zh\">\u5982\u679c\u5728\u67e5\u8be2\u7684\u9009\u62e9\u5217\u8868\u4e2d\u6709\u4e0d\u6b62\u4e00\u4e2a\u96c6\u5408\u8fd4\u56de\u51fd\u6570\uff0c\u5219\u884c\u4e3a\u7c7b\u4f3c\u4e8e\u628a\u90a3\u4e9b\u51fd\u6570\u653e\u5230\u4e00\u4e2a\u5355\u4e00\u7684<code class=\"literal\">LATERAL ROWS FROM( ... )</code> <code class=\"literal\">FROM</code>\u5b50\u53e5\u9879\u4e2d\u7684\u884c\u4e3a\u3002\u5bf9\u4e8e\u6765\u81ea\u5e95\u5c42\u67e5\u8be2\u7684\u6bcf\u4e00\u884c\uff0c\u90fd\u6709\u4e00\u4e2a\u7528\u5230\u6bcf\u4e2a\u51fd\u6570\u9996\u4e2a\u7ed3\u679c\u7684\u8f93\u51fa\u884c\uff0c\u7136\u540e\u662f\u4e00\u4e2a\u4f7f\u7528\u6bcf\u4e2a\u51fd\u6570\u7b2c\u4e8c\u4e2a\u7ed3\u679c\u7684\u8f93\u51fa\u884c\uff0c\u4ee5\u6b64\u7c7b\u63a8\u3002\u5982\u679c\u67d0\u4e9b\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u4ea7\u751f\u7684\u8f93\u51fa\u6bd4\u5176\u4ed6\u51fd\u6570\u5c11\uff0c\u4f1a\u7528\u7a7a\u503c\u4ee3\u66ff\u7f3a\u5931\u7684\u6570\u636e\uff0c\u56e0\u6b64\u4e3a\u4e00\u4e2a\u5e95\u5c42\u884c\u5f62\u6210\u7684\u603b\u884c\u6570\u7b49\u4e8e\u4ea7\u751f\u6700\u591a\u8f93\u51fa\u7684\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u7684\u8f93\u51fa\u884c\u6570\u3002\u56e0\u6b64\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u4f1a<span class=\"quote\">\u201c<span class=\"quote\">\u6b65\u8c03\u4e00\u81f4</span>\u201d</span>\u5730\u8fd0\u884c\u76f4\u5230\u5b83\u4eec\u7684\u8f93\u51fa\u88ab\u8017\u5c3d\uff0c\u7136\u540e\u7528\u4e0b\u4e00\u4e2a\u5e95\u5c42\u884c\u7ee7\u7eed\u6267\u884c\u3002</p>\n<p lang=\"zh\">\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u53ef\u4ee5\u88ab\u5d4c\u5957\u5728\u4e00\u4e2a\u9009\u62e9\u5217\u8868\u4e2d\uff0c\u4e0d\u8fc7\u5728<code class=\"literal\">FROM</code>\u5b50\u53e5\u9879\u4e2d\u4e0d\u5141\u8bb8\u8fd9\u6837\u505a\u3002\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b\uff0c\u5d4c\u5957\u7684\u6bcf\u4e00\u5c42\u4f1a\u88ab\u5355\u72ec\u5bf9\u5f85\uff0c\u5c31\u50cf\u5b83\u662f\u4e00\u4e2a\u5355\u72ec\u7684<code class=\"literal\">LATERAL ROWS FROM( ... )</code>\u9879\u4e00\u6837\u3002\u4f8b\u5982\uff0c\u5728</p>\n<pre class=\"programlisting\">SELECT srf1(srf2(x), srf3(y)), srf4(srf5(z)) FROM tab;\n</pre>\n<p lang=\"zh\">\u4e2d\uff0c\u96c6\u5408\u8fd4\u56de\u51fd\u6570<code class=\"function\">srf2</code>\u3001<code class=\"function\">srf3</code>\u548c<code class=\"function\">srf5</code>\u5c06\u4e3a<code class=\"structname\">tab</code>\u7684\u6bcf\u4e00\u884c\u6b65\u8c03\u4e00\u81f4\u5730\u8fd0\u884c\uff0c\u7136\u540e\u4f1a\u5bf9\u8f83\u4f4e\u5c42\u7684\u51fd\u6570\u4ea7\u751f\u7684\u6bcf\u4e00\u884c\u4ee5\u6b65\u8c03\u4e00\u81f4\u7684\u5f62\u5f0f\u5e94\u7528<code class=\"function\">srf1</code>\u548c<code class=\"function\">srf4</code>\u3002</p>\n<p lang=\"zh\">\u5728<code class=\"literal\">CASE</code>\u6216<code class=\"literal\">COALESCE</code>\u8fd9\u6837\u7684\u6761\u4ef6\u8ba1\u7b97\u7ed3\u6784\u4e2d\uff0c\u4e0d\u80fd\u4f7f\u7528\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u3002\u4f8b\u5982\uff0c\u8003\u8651</p>\n<pre class=\"programlisting\">SELECT x, CASE WHEN x &gt; 0 THEN generate_series(1, 5) ELSE 0 END FROM tab;\n</pre>\n<p lang=\"zh\">\u8868\u9762\u4e0a\u770b\uff0c\u8fd9\u5e94\u5f53\u8ba9 x &gt; 0 \u7684\u8f93\u5165\u884c\u91cd\u590d\u4e94\u6b21\uff0c\u5176\u4f59\u884c\u53ea\u51fa\u73b0\u4e00\u6b21\uff1b\u4f46\u5b9e\u9645\u4e0a\uff0cgenerate_series(1, 5) \u4f1a\u5728 CASE \u8868\u8fbe\u5f0f\u6c42\u503c\u4e4b\u524d\uff0c\u4f5c\u4e3a\u9690\u5f0f LATERAL FROM \u9879\u6267\u884c\uff0c\u56e0\u6b64\u6bcf\u4e2a\u8f93\u5165\u884c\u90fd\u4f1a\u91cd\u590d\u4e94\u6b21\u3002\u4e3a\u907f\u514d\u6df7\u6dc6\uff0c\u6b64\u7c7b\u5199\u6cd5\u4f1a\u5728\u89e3\u6790\u9636\u6bb5\u62a5\u9519\u3002</p>\n<div class=\"note\">\n<h3 class=\"title\" lang=\"zh\">\u6ce8\u610f</h3>\n<p lang=\"zh\">\u5982\u679c\u4e00\u4e2a\u51fd\u6570\u7684\u6700\u540e\u4e00\u6761\u547d\u4ee4\u662f <code class=\"command\">INSERT</code>\u3001<code class=\"command\">UPDATE</code> \u6216 <code class=\"command\">DELETE</code> \u5e76\u5e26\u6709 <code class=\"literal\">RETURNING</code>\uff0c\u90a3\u4e48\u5373\u4f7f\u8be5\u51fd\u6570\u6ca1\u6709\u58f0\u660e\u4e3a <code class=\"literal\">SETOF</code>\uff0c\u6216\u8005\u8c03\u7528\u5b83\u7684\u67e5\u8be2\u5e76\u672a\u53d6\u8d70\u5168\u90e8\u7ed3\u679c\u884c\uff0c\u8be5\u547d\u4ee4\u4e5f\u603b\u4f1a\u6267\u884c\u5230\u5b8c\u6210\u3002<code class=\"literal\">RETURNING</code> \u5b50\u53e5\u4ea7\u751f\u7684\u989d\u5916\u7ed3\u679c\u884c\u4f1a\u88ab\u9759\u9ed8\u4e22\u5f03\uff0c\u4f46\u76f8\u5e94\u7684\u8868\u4fee\u6539\u4ecd\u7136\u4f1a\u53d1\u751f\uff0c\u5e76\u4e14\u4f1a\u5728\u51fd\u6570\u8fd4\u56de\u524d\u5168\u90e8\u5b8c\u6210\u3002</p>\n</div>\n<div class=\"note\">\n<h3 class=\"title\" lang=\"zh\">\u6ce8\u610f</h3>\n<p lang=\"zh\">\u5728 <span class=\"productname\">PostgreSQL</span> 10 \u4e4b\u524d\uff0c\u9664\u975e\u591a\u4e2a\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u59cb\u7ec8\u4ea7\u751f\u76f8\u540c\u6570\u91cf\u7684\u884c\uff0c\u5426\u5219\u628a\u5b83\u4eec\u653e\u5728\u540c\u4e00\u4e2a\u9009\u62e9\u5217\u8868\u4e2d\u7684\u884c\u4e3a\u5e76\u4e0d\u5408\u7406\u3002\u5426\u5219\uff0c\u5f97\u5230\u7684\u8f93\u51fa\u884c\u6570\u4f1a\u662f\u8fd9\u4e9b\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u5404\u81ea\u4ea7\u751f\u884c\u6570\u7684\u6700\u5c0f\u516c\u500d\u6570\u3002\u6b64\u5916\uff0c\u5d4c\u5957\u7684\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u4e5f\u4e0d\u50cf\u4e0a\u6587\u6240\u63cf\u8ff0\u7684\u90a3\u6837\u5de5\u4f5c\uff1b\u76f8\u53cd\uff0c\u4e00\u4e2a\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u81f3\u591a\u53ea\u80fd\u6709\u4e00\u4e2a\u96c6\u5408\u8fd4\u56de\u53c2\u6570\uff0c\u5e76\u4e14\u6bcf\u4e00\u7ec4\u5d4c\u5957\u7684\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u90fd\u4f1a\u72ec\u7acb\u8fd0\u884c\u3002\u518d\u52a0\u4e0a\u8fc7\u53bb\u8fd8\u5141\u8bb8\u6761\u4ef6\u6267\u884c\uff08\u5373\u5728 <code class=\"literal\">CASE</code> \u7b49\u7ed3\u6784\u5185\u90e8\u4f7f\u7528\u96c6\u5408\u8fd4\u56de\u51fd\u6570\uff09\uff0c\u4e8b\u60c5\u5c31\u66f4\u52a0\u590d\u6742\u4e86\u3002\u5982\u679c\u4f60\u8981\u7f16\u5199\u9700\u8981\u5728\u65e7\u7248 <span class=\"productname\">PostgreSQL</span> \u4e0a\u8fd0\u884c\u7684\u67e5\u8be2\uff0c\u5efa\u8bae\u4f7f\u7528 <code class=\"literal\">LATERAL</code> \u8bed\u6cd5\uff0c\u56e0\u4e3a\u8fd9\u6837\u5728\u4e0d\u540c\u7248\u672c\u4e4b\u95f4\u80fd\u591f\u5f97\u5230\u4e00\u81f4\u7684\u7ed3\u679c\u3002\u5982\u679c\u4f60\u7684\u67e5\u8be2\u4f9d\u8d56\u4e8e\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u7684\u6761\u4ef6\u6267\u884c\uff0c\u6216\u8bb8\u53ef\u4ee5\u628a\u6761\u4ef6\u5224\u65ad\u79fb\u52a8\u5230\u81ea\u5b9a\u4e49\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u5185\u90e8\u6765\u4fee\u590d\u3002\u4f8b\u5982\uff0c</p>\n<pre class=\"programlisting\">SELECT x, CASE WHEN y &gt; 0 THEN generate_series(1, z) ELSE 5 END FROM tab;\n</pre>\n<p lang=\"zh\">\u53ef\u4ee5\u53d8\u6210</p>\n<pre class=\"programlisting\">CREATE FUNCTION case_generate_series(cond bool, start int, fin int, els int)\n  RETURNS SETOF int AS $$\nBEGIN\n  IF cond THEN\n    RETURN QUERY SELECT generate_series(start, fin);\n  ELSE\n    RETURN QUERY SELECT els;\n  END IF;\nEND$$ LANGUAGE plpgsql;\n\nSELECT x, case_generate_series(y &gt; 0, 1, z, 5) FROM tab;\n</pre>\n<p lang=\"zh\">\u8fd9\u79cd\u5199\u6cd5\u5728\u6240\u6709\u7248\u672c\u7684 <span class=\"productname\">PostgreSQL</span> \u4e2d\u7684\u884c\u4e3a\u90fd\u76f8\u540c\u3002</p>\n</div>\n</div>\n<div class=\"sect2\" id=\"XFUNC-SQL-FUNCTIONS-RETURNING-TABLE\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/10/xfunc-sql.html#XFUNC-SQL-FUNCTIONS-RETURNING-TABLE\">37.4.9. \u8fd4\u56de<code class=\"literal\">TABLE</code>\u7684<acronym class=\"acronym\">SQL</acronym>\u51fd\u6570</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\">\u8fd8\u6709\u53e6\u4e00\u79cd\u65b9\u6cd5\u53ef\u4ee5\u628a\u51fd\u6570\u58f0\u660e\u4e3a\u8fd4\u56de\u4e00\u4e2a\u96c6\u5408\uff0c\u5373\u4f7f\u7528 <code class=\"literal\">RETURNS TABLE(<em class=\"replaceable\"><code>columns</code></em>)</code>\u8bed\u6cd5\u3002\u8fd9\u7b49\u6548\u4e8e\u4f7f\u7528\u4e00\u4e2a\u6216\u8005\u591a\u4e2a<code class=\"literal\">OUT</code>\u53c2\u6570\u5916\u52a0\u628a\u51fd\u6570\u6807\u8bb0\u4e3a\u8fd4\u56de <code class=\"literal\">SETOF record</code>\uff08\u6216\u8005\u662f<code class=\"literal\">SETOF</code>\u5355\u4e2a\u8f93\u51fa\u53c2\u6570\u7684\u7c7b\u578b\uff09\u3002\u8fd9\u79cd\u5199\u6cd5\u662f\u5728\u6700\u8fd1\u7684 SQL \u6807\u51c6\u4e2d\u6307\u5b9a\u7684\uff0c\u56e0\u6b64\u53ef\u80fd\u6bd4\u4f7f\u7528 <code class=\"literal\">SETOF</code>\u7684\u79fb\u690d\u6027\u66f4\u597d\u3002</p>\n<p lang=\"zh\">\u4f8b\u5982\uff0c\u524d\u9762\u7684\u6c42\u548c\u5e76\u4e14\u76f8\u4e58\u7684\u793a\u4f8b\u4e5f\u53ef\u4ee5\u8fd9\u6837\u6765\u505a\uff1a</p>\n<pre class=\"programlisting\">CREATE FUNCTION sum_n_product_with_tab (x int)\nRETURNS TABLE(sum int, product int) AS $$\n    SELECT $1 + tab.y, $1 * tab.y FROM tab;\n$$ LANGUAGE SQL;\n</pre>\n<p lang=\"zh\">\u4e0d\u5141\u8bb8\u628a\u663e\u5f0f\u7684<code class=\"literal\">OUT</code>\u6216\u8005<code class=\"literal\">INOUT</code>\u53c2\u6570\u7528\u4e8e <code class=\"literal\">RETURNS TABLE</code>\u8bb0\u6cd5 \u2014 \u5fc5\u987b\u628a\u6240\u6709\u8f93\u51fa\u5217\u653e\u5728 <code class=\"literal\">TABLE</code>\u5217\u8868\u4e2d\u3002</p>\n</div>\n<div class=\"sect2\" id=\"id-1.8.3.7.18\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/10/xfunc-sql.html#id-1.8.3.7.18\">37.4.10. \u591a\u6001<acronym class=\"acronym\">SQL</acronym>\u51fd\u6570</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\"><acronym class=\"acronym\">SQL</acronym> \u51fd\u6570\u53ef\u4ee5\u88ab\u58f0\u660e\u4e3a\u63a5\u53d7\u5e76\u8fd4\u56de\u8fd9\u4e9b\u591a\u6001\u7c7b\u578b\uff1a<code class=\"type\">anyelement</code>\uff0c<code class=\"type\">anyarray</code>\uff0c<code class=\"type\">anynonarray</code>\uff0c<code class=\"type\">anyenum</code>\u3001<code class=\"type\">anyrange</code>\u3002\u5173\u4e8e\u591a\u6001\u51fd\u6570\u7684\u66f4\u8be6\u7ec6\u89e3\u91ca\uff0c\u89c1<a class=\"xref\" href=\"/docs/10/extend-type-system.html#EXTEND-TYPES-POLYMORPHIC\" title=\"37.2.5.\u00a0\u591a\u6001\u7c7b\u578b\">\u7b2c\u00a037.2.5\u00a0\u8282</a>\u3002\u4e0b\u9762\u8fd9\u4e2a\u591a\u6001\u51fd\u6570 <code class=\"function\">make_array</code> \u4f1a\u6839\u636e\u4e24\u4e2a\u4efb\u610f\u6570\u636e\u7c7b\u578b\u7684\u5143\u7d20\u6784\u9020\u4e00\u4e2a\u6570\u7ec4\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION make_array(anyelement, anyelement) RETURNS anyarray AS $$\n    SELECT ARRAY[$1, $2];\n$$ LANGUAGE SQL;\n\nSELECT make_array(1, 2) AS intarray, make_array('a'::text, 'b') AS textarray;\n intarray | textarray\n----------+-----------\n {1,2}    | {a,b}\n(1 row)\n</pre>\n<p lang=\"zh\">\u6ce8\u610f\u7c7b\u578b\u8f6c\u6362<code class=\"literal\">'a'::text</code>\u7684\u4f7f\u7528\u662f\u4e3a\u4e86\u6307\u5b9a\u8be5\u53c2\u6570\u7684\u7c7b\u578b\u662f<code class=\"type\">text</code>\u3002\u5982\u679c\u8be5\u53c2\u6570\u53ea\u662f\u4e00\u4e2a\u5b57\u7b26\u4e32\u5b57\u9762\u91cf\uff0c\u8fd9\u5c31\u662f\u5fc5\u987b\u7684\uff0c\u56e0\u4e3a\u5426\u5219\u5b83\u4f1a\u88ab\u5f53\u4f5c<code class=\"type\">unknown</code>\u7c7b\u578b\uff0c\u5e76\u4e14 <code class=\"type\">unknown</code>\u7684\u6570\u7ec4\u4e5f\u4e0d\u662f\u4e00\u79cd\u5408\u6cd5\u7684\u7c7b\u578b\u3002\u5982\u679c\u6ca1\u6709\u8be5\u7c7b\u578b\u8f6c\u6362\uff0c\u5c06\u5f97\u5230\u8fd9\u6837\u7684\u9519\u8bef\uff1a</p>\n<pre class=\"screen\"><code class=\"computeroutput\">ERROR:  could not determine polymorphic type because input has type \"unknown\"</code>\n</pre>\n<p lang=\"zh\">\u5141\u8bb8\u5b58\u5728\u5177\u6709\u56fa\u5b9a\u8fd4\u56de\u7c7b\u578b\u7684\u591a\u6001\u53c2\u6570\uff0c\u4f46\u53cd\u8fc7\u6765\u5219\u4e0d\u5141\u8bb8\u3002\u4f8b\u5982\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION is_greater(anyelement, anyelement) RETURNS boolean AS $$\n    SELECT $1 &gt; $2;\n$$ LANGUAGE SQL;\n\nSELECT is_greater(1, 2);\n is_greater\n------------\n f\n(1 row)\n\nCREATE FUNCTION invalid_func() RETURNS anyelement AS $$\n    SELECT 1;\n$$ LANGUAGE SQL;\nERROR:  cannot determine result data type\nDETAIL:  A function returning a polymorphic type must have at least one polymorphic argument.\n</pre>\n<p lang=\"zh\">\u591a\u6001\u4e5f\u53ef\u4ee5\u548c\u5e26\u8f93\u51fa\u53c2\u6570\u7684\u51fd\u6570\u4e00\u8d77\u4f7f\u7528\u3002\u4f8b\u5982\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION dup (f1 anyelement, OUT f2 anyelement, OUT f3 anyarray)\nAS 'select $1, array[$1,$1]' LANGUAGE SQL;\n\nSELECT * FROM dup(22);\n f2 |   f3\n----+---------\n 22 | {22,22}\n(1 row)\n</pre>\n<p lang=\"zh\">\u591a\u6001\u4e5f\u53ef\u4ee5\u7528\u4e8e\u53ef\u53d8\u53c2\u6570\u51fd\u6570\u3002\u4f8b\u5982\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION anyleast (VARIADIC anyarray) RETURNS anyelement AS $$\n    SELECT min($1[i]) FROM generate_subscripts($1, 1) g(i);\n$$ LANGUAGE SQL;\n\nSELECT anyleast(10, -1, 5, 4);\n anyleast \n----------\n       -1\n(1 row)\n\nSELECT anyleast('abc'::text, 'def');\n anyleast \n----------\n abc\n(1 row)\n\nCREATE FUNCTION concat_values(text, VARIADIC anyarray) RETURNS text AS $$\n    SELECT array_to_string($2, $1);\n$$ LANGUAGE SQL;\n\nSELECT concat_values('|', 1, 4, 2);\n concat_values \n---------------\n 1|4|2\n(1 row)\n</pre></div>\n<div class=\"sect2\" id=\"id-1.8.3.7.19\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/10/xfunc-sql.html#id-1.8.3.7.19\">37.4.11. \u5e26\u6709\u6392\u5e8f\u89c4\u5219\u7684<acronym class=\"acronym\">SQL</acronym>\u51fd\u6570</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\">\u5f53\u4e00\u4e2a SQL \u51fd\u6570\u6709\u4e00\u4e2a\u6216\u591a\u4e2a\u652f\u6301\u6392\u5e8f\u89c4\u5219\u7684\u6570\u636e\u7c7b\u578b\u53c2\u6570\u65f6\uff0c\u4f1a\u6839\u636e\u5b9e\u53c2\u6240\u5e26\u7684\u6392\u5e8f\u89c4\u5219\uff0c\u4e3a\u6bcf\u6b21\u51fd\u6570\u8c03\u7528\u786e\u5b9a\u4e00\u4e2a\u6392\u5e8f\u89c4\u5219\uff0c\u8be6\u89c1<a class=\"xref\" href=\"/docs/10/collation.html\" title=\"23.2.\u00a0\u6392\u5e8f\u89c4\u5219\u652f\u6301\">\u7b2c\u00a023.2\u00a0\u8282</a>\u3002\u5982\u679c\u80fd\u591f\u6210\u529f\u786e\u5b9a\uff08\u4e5f\u5c31\u662f\u8bf4\uff0c\u53c2\u6570\u4e4b\u95f4\u4e0d\u5b58\u5728\u9690\u5f0f\u6392\u5e8f\u89c4\u5219\u51b2\u7a81\uff09\uff0c\u90a3\u4e48\u6240\u6709\u652f\u6301\u6392\u5e8f\u89c4\u5219\u7684\u53c2\u6570\u90fd\u4f1a\u88ab\u89c6\u4e3a\u9690\u5f0f\u5e26\u6709\u8be5\u6392\u5e8f\u89c4\u5219\u3002\u8fd9\u4f1a\u5f71\u54cd\u51fd\u6570\u4e2d\u5bf9\u6392\u5e8f\u89c4\u5219\u654f\u611f\u7684\u64cd\u4f5c\u7684\u884c\u4e3a\u3002\u4f8b\u5982\uff0c\u4f7f\u7528\u4e0a\u6587\u7684 <code class=\"function\">anyleast</code> \u51fd\u6570\u65f6\uff0c</p>\n<pre class=\"programlisting\">SELECT anyleast('abc'::text, 'ABC');\n</pre>\n<p lang=\"zh\">\u7684\u7ed3\u679c\u5c06\u53d6\u51b3\u4e8e\u6570\u636e\u5e93\u7684\u9ed8\u8ba4\u6392\u5e8f\u89c4\u5219\u3002\u5728 <code class=\"literal\">C</code> \u533a\u57df\u8bbe\u7f6e\u4e0b\uff0c\u7ed3\u679c\u4f1a\u662f <code class=\"literal\">ABC</code>\uff0c\u4f46\u5728\u8bb8\u591a\u5176\u4ed6\u533a\u57df\u8bbe\u7f6e\u4e0b\u5219\u4f1a\u662f <code class=\"literal\">abc</code>\u3002\u53ef\u4ee5\u5728\u4efb\u610f\u53c2\u6570\u4e0a\u6dfb\u52a0 <code class=\"literal\">COLLATE</code> \u5b50\u53e5\u6765\u5f3a\u5236\u6307\u5b9a\u8981\u4f7f\u7528\u7684\u6392\u5e8f\u89c4\u5219\uff0c\u4f8b\u5982\uff1a</p>\n<pre class=\"programlisting\">SELECT anyleast('abc'::text, 'ABC' COLLATE \"C\");\n</pre>\n<p lang=\"zh\">\u53e6\u5916\uff0c\u5982\u679c\u4f60\u5e0c\u671b\u67d0\u4e2a\u51fd\u6570\u65e0\u8bba\u4ee5\u4ec0\u4e48\u6392\u5e8f\u89c4\u5219\u8c03\u7528\uff0c\u90fd\u59cb\u7ec8\u6309\u7279\u5b9a\u6392\u5e8f\u89c4\u5219\u5de5\u4f5c\uff0c\u53ef\u4ee5\u5728\u51fd\u6570\u5b9a\u4e49\u4e2d\u6309\u9700\u63d2\u5165 <code class=\"literal\">COLLATE</code> \u5b50\u53e5\u3002\u4e0b\u9762\u8fd9\u4e2a\u7248\u672c\u7684 <code class=\"function\">anyleast</code> \u5c06\u59cb\u7ec8\u4f7f\u7528 <code class=\"literal\">en_US</code> \u533a\u57df\u8bbe\u7f6e\u6765\u6bd4\u8f83\u5b57\u7b26\u4e32\uff1a</p>\n<pre class=\"programlisting\">CREATE FUNCTION anyleast (VARIADIC anyarray) RETURNS anyelement AS $$\n    SELECT min($1[i] COLLATE \"en_US\") FROM generate_subscripts($1, 1) g(i);\n$$ LANGUAGE SQL;\n</pre>\n<p lang=\"zh\">\u4f46\u8bf7\u6ce8\u610f\uff0c\u5982\u679c\u628a\u5b83\u7528\u4e8e\u4e0d\u652f\u6301\u6392\u5e8f\u89c4\u5219\u7684\u6570\u636e\u7c7b\u578b\uff0c\u5c31\u4f1a\u629b\u51fa\u9519\u8bef\u3002</p>\n<p lang=\"zh\">\u5982\u679c\u65e0\u6cd5\u5728\u5b9e\u53c2\u4e4b\u95f4\u786e\u5b9a\u5171\u540c\u7684\u6392\u5e8f\u89c4\u5219\uff0c\u90a3\u4e48 SQL \u51fd\u6570\u4f1a\u628a\u53c2\u6570\u89c6\u4e3a\u5e26\u6709\u5176\u6570\u636e\u7c7b\u578b\u7684\u9ed8\u8ba4\u6392\u5e8f\u89c4\u5219\uff08\u901a\u5e38\u662f\u6570\u636e\u5e93\u7684\u9ed8\u8ba4\u6392\u5e8f\u89c4\u5219\uff0c\u4f46\u5bf9\u57df\u7c7b\u578b\u53c2\u6570\u6765\u8bf4\u4e5f\u53ef\u80fd\u4e0d\u540c\uff09\u3002</p>\n<p lang=\"zh\">\u8fd9\u79cd\u652f\u6301\u6392\u5e8f\u89c4\u5219\u7684\u53c2\u6570\u7684\u884c\u4e3a\uff0c\u53ef\u4ee5\u770b\u4f5c\u662f\u4ec5\u9002\u7528\u4e8e\u6587\u672c\u6570\u636e\u7c7b\u578b\u7684\u4e00\u79cd\u53d7\u9650\u591a\u6001\u5f62\u5f0f\u3002</p>\n</div>\n</div>", "manual_path": "/docs/10/xfunc-sql.html", "localization": {"status": "complete", "sources": [{"url": "/docs/10/xfunc-sql.html", "method": "same-major semantic node", "sha256": "fc392d3b47585ac420a5aef848a240ea78abdbcc006d10182e2d8083d693b032", "language": "zh", "matched_nodes": ["#XFUNC-SQL/div[10]/p[2]", "#XFUNC-SQL/div[10]/p[3]", "#XFUNC-SQL/div[10]/p[4]", "#XFUNC-SQL/div[10]/p[5]", "#XFUNC-SQL/div[10]/p[6]", "#XFUNC-SQL/div[10]/p[8]", "#XFUNC-SQL/div[11]/p[10]", "#XFUNC-SQL/div[11]/p[12]", "#XFUNC-SQL/div[11]/p[13]", "#XFUNC-SQL/div[11]/p[15]", "#XFUNC-SQL/div[11]/p[1]", "#XFUNC-SQL/div[11]/p[3]", "#XFUNC-SQL/div[11]/p[4]", "#XFUNC-SQL/div[11]/p[6]", "#XFUNC-SQL/div[11]/p[8]", "#XFUNC-SQL/div[12]/div[12]/ul[0]/li[0]", "#XFUNC-SQL/div[12]/div[12]/ul[0]/li[1]", "#XFUNC-SQL/div[12]/p[10]", "#XFUNC-SQL/div[12]/p[11]", "#XFUNC-SQL/div[12]/p[13]", "#XFUNC-SQL/div[12]/p[15]", "#XFUNC-SQL/div[12]/p[16]", "#XFUNC-SQL/div[12]/p[18]", "#XFUNC-SQL/div[12]/p[1]", "#XFUNC-SQL/div[12]/p[20]", "#XFUNC-SQL/div[12]/p[21]", "#XFUNC-SQL/div[12]/p[23]", "#XFUNC-SQL/div[12]/p[25]", "#XFUNC-SQL/div[12]/p[27]", "#XFUNC-SQL/div[12]/p[28]", "#XFUNC-SQL/div[12]/p[3]", "#XFUNC-SQL/div[12]/p[5]", "#XFUNC-SQL/div[12]/p[6]", "#XFUNC-SQL/div[12]/p[8]", "#XFUNC-SQL/div[13]/p[11]", "#XFUNC-SQL/div[13]/p[2]", "#XFUNC-SQL/div[13]/p[4]", "#XFUNC-SQL/div[13]/p[6]", "#XFUNC-SQL/div[13]/p[8]", "#XFUNC-SQL/div[13]/p[9]", "#XFUNC-SQL/div[14]/p[10]", "#XFUNC-SQL/div[14]/p[11]", "#XFUNC-SQL/div[14]/p[13]", "#XFUNC-SQL/div[14]/p[14]", "#XFUNC-SQL/div[14]/p[16]", "#XFUNC-SQL/div[14]/p[3]", "#XFUNC-SQL/div[14]/p[5]", "#XFUNC-SQL/div[14]/p[7]", "#XFUNC-SQL/div[14]/p[8]", "#XFUNC-SQL/div[15]/p[2]", "#XFUNC-SQL/div[15]/p[3]", "#XFUNC-SQL/div[15]/p[5]", "#XFUNC-SQL/div[16]/p[1]", "#XFUNC-SQL/div[16]/p[2]", "#XFUNC-SQL/div[16]/p[4]", "#XFUNC-SQL/div[16]/p[5]", "#XFUNC-SQL/div[17]/div[28]/p[1]", "#XFUNC-SQL/div[17]/div[29]/p[1]", "#XFUNC-SQL/div[17]/div[29]/p[3]", "#XFUNC-SQL/div[17]/div[29]/p[5]", "#XFUNC-SQL/div[17]/p[10]", "#XFUNC-SQL/div[17]/p[12]", "#XFUNC-SQL/div[17]/p[13]", "#XFUNC-SQL/div[17]/p[15]", "#XFUNC-SQL/div[17]/p[16]", "#XFUNC-SQL/div[17]/p[18]", "#XFUNC-SQL/div[17]/p[20]", "#XFUNC-SQL/div[17]/p[21]", "#XFUNC-SQL/div[17]/p[22]", "#XFUNC-SQL/div[17]/p[24]", "#XFUNC-SQL/div[17]/p[25]", "#XFUNC-SQL/div[17]/p[2]", "#XFUNC-SQL/div[17]/p[3]", "#XFUNC-SQL/div[17]/p[5]", "#XFUNC-SQL/div[17]/p[7]", "#XFUNC-SQL/div[17]/p[9]", "#XFUNC-SQL/div[18]/p[2]", "#XFUNC-SQL/div[18]/p[3]", "#XFUNC-SQL/div[18]/p[5]", "#XFUNC-SQL/div[19]/p[1]", "#XFUNC-SQL/div[19]/p[3]", "#XFUNC-SQL/div[19]/p[5]", "#XFUNC-SQL/div[19]/p[7]", "#XFUNC-SQL/div[19]/p[9]", "#XFUNC-SQL/div[1]/dl[0]/dt[0]", "#XFUNC-SQL/div[1]/dl[0]/dt[10]", "#XFUNC-SQL/div[1]/dl[0]/dt[1]", "#XFUNC-SQL/div[1]/dl[0]/dt[2]", "#XFUNC-SQL/div[1]/dl[0]/dt[3]", "#XFUNC-SQL/div[1]/dl[0]/dt[4]", "#XFUNC-SQL/div[1]/dl[0]/dt[5]", "#XFUNC-SQL/div[1]/dl[0]/dt[6]", "#XFUNC-SQL/div[1]/dl[0]/dt[7]", "#XFUNC-SQL/div[1]/dl[0]/dt[8]", "#XFUNC-SQL/div[1]/dl[0]/dt[9]", "#XFUNC-SQL/div[20]/p[10]", "#XFUNC-SQL/div[20]/p[2]", "#XFUNC-SQL/div[20]/p[4]", "#XFUNC-SQL/div[20]/p[6]", "#XFUNC-SQL/div[20]/p[8]", "#XFUNC-SQL/div[20]/p[9]", "#XFUNC-SQL/div[8]/h3[0]", "#XFUNC-SQL/div[8]/p[1]", "#XFUNC-SQL/p[3]", "#XFUNC-SQL/p[4]", "#XFUNC-SQL/p[5]", "#XFUNC-SQL/p[6]", "#XFUNC-SQL/p[9]"]}], "language": "zh", "original_text": {"/versions/10/description/0": "SQL-language functions", "/versions/10/facts/0/label": "Kind", "/versions/10/facts/0/value": "Native function language", "/versions/10/facts/1/label": "Trusted", "/versions/10/facts/2/label": "Validator"}, "fallback_fields": [], "source_language": "en", "original_snapshot_sha256": "72d017c3655a0d623ec08be11e956aa3944524e744d42f55bd2b5b256050f786"}, "comparison_data": {"kind": "Native function language", "handler": "", "trusted": "t", "validator": "fmgr_sql_validator"}, "comparison_hash": "a4af9cf453d140d941e865b952c6a41e2b704a4b30cb77b61c1cdda8a77c5035", "manual_language": "zh"}, "11": {"facts": [{"label": "\u79cd\u7c7b", "value": "\u539f\u751f\u51fd\u6570\u8bed\u8a00"}, {"label": "\u53ef\u4fe1", "value": "t"}, {"label": "\u6821\u9a8c\u51fd\u6570", "value": "fmgr_sql_validator"}], "tables": [], "aliases": [], "catalog": {"oid": "14", "descr": "SQL-language functions", "lanacl": "_null_", "lanispl": "f", "lanname": "sql", "lanowner": "PGUID", "laninline": "0", "oid_symbol": "SQLlanguageId", "lanpltrusted": "t", "lanvalidator": "fmgr_sql_validator", "lanplcallfoid": "0"}, "related": [], "release": {"ref": "https://ftp.postgresql.org/pub/source/v11.22/postgresql-11.22.tar.bz2", "label": "11.22", "major": "11", "channel": "historical", "revision": "2cb7c97d7a0d7278851bbc9c61f467b69c094c72b81740b751108e7892ebe1f0", "source_sha256": "2cb7c97d7a0d7278851bbc9c61f467b69c094c72b81740b751108e7892ebe1f0", "catalog_fingerprint": "8f21f4444b7f68923f4762af0eb7937fa2907026e91249483e79050de012c901"}, "sources": [{"url": "https://ftp.postgresql.org/pub/source/v11.22/postgresql-11.22.tar.bz2", "label": "Matching PostgreSQL source archive", "sha256": "2cb7c97d7a0d7278851bbc9c61f467b69c094c72b81740b751108e7892ebe1f0"}, {"url": "https://pg.center/docs/11/xfunc-sql.html", "path": "xfunc-sql.html", "label": "PostgreSQL 11 English manual", "sha256": "98942b05a567998188e4f9543b7ef310d3b2c14215c2da322932b7f308d0e4ed", "language": "en", "original_url": "/docs/11/xfunc-sql.html"}], "sections": [], "signature": "", "attributes": {"kind": "Native function language", "handler": "", "trusted": "t", "validator": "fmgr_sql_validator"}, "description": ["SQL \u8bed\u8a00\u51fd\u6570"], "manual_html": "<div class=\"sect1\" id=\"XFUNC-SQL\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h2 class=\"title\" lang=\"zh\">38.5. \u67e5\u8be2\u8bed\u8a00\uff08SQL\uff09\u51fd\u6570</h2>\n</div>\n</div>\n</div>\n<p lang=\"zh\">SQL \u51fd\u6570\u6267\u884c\u7531\u4efb\u610f SQL \u8bed\u53e5\u7ec4\u6210\u7684\u4e00\u4e2a\u5217\u8868\uff0c\u5e76\u8fd4\u56de\u5217\u8868\u4e2d\u6700\u540e\u4e00\u4e2a\u67e5\u8be2\u7684\u7ed3\u679c\u3002\u5728\u7b80\u5355\uff08\u975e\u96c6\u5408\uff09\u60c5\u51b5\u4e0b\uff0c\u5c06\u8fd4\u56de\u6700\u540e\u4e00\u4e2a\u67e5\u8be2\u7ed3\u679c\u7684\u7b2c\u4e00\u884c\u3002\uff08\u8bf7\u8bb0\u4f4f\uff0c\u9664\u975e\u4f7f\u7528 <code class=\"literal\">ORDER BY</code>\uff0c\u5426\u5219\u591a\u884c\u7ed3\u679c\u4e2d\u7684<span class=\"quote\">\u201c<span class=\"quote\">\u7b2c\u4e00\u884c</span>\u201d</span>\u5e76\u6ca1\u6709\u660e\u786e\u5b9a\u4e49\u3002\uff09\u5982\u679c\u6700\u540e\u4e00\u4e2a\u67e5\u8be2\u5b8c\u5168\u6ca1\u6709\u8fd4\u56de\u4efb\u4f55\u884c\uff0c\u5219\u8fd4\u56de\u7a7a\u503c\u3002</p>\n<p lang=\"zh\">\u6216\u8005\uff0c\u4e00\u4e2a SQL \u51fd\u6570\u53ef\u4ee5\u901a\u8fc7\u6307\u5b9a\u51fd\u6570\u7684\u8fd4\u56de\u7c7b\u578b\u4e3a<code class=\"literal\">SETOF <em class=\"replaceable\"><code>sometype</code></em></code>\u88ab\u58f0\u660e\u4e3a\u8fd4\u56de\u4e00\u4e2a\u96c6\u5408\uff08\u4e5f\u5c31\u662f\u591a\u4e2a\u884c\uff09\uff0c\u6216\u8005\u7b49\u6548\u5730\u58f0\u660e\u5b83\u4e3a<code class=\"literal\">RETURNS TABLE(<em class=\"replaceable\"><code>columns</code></em>)</code>\u3002\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b\uff0c\u6700\u540e\u4e00\u4e2a\u67e5\u8be2\u7684\u7ed3\u679c\u7684\u6240\u6709\u884c\u4f1a\u88ab\u8fd4\u56de\u3002\u4e0b\u6587\u5c06\u7ed9\u51fa\u8fdb\u4e00\u6b65\u7684\u7ec6\u8282\u3002</p>\n<p lang=\"zh\">SQL \u51fd\u6570\u7684\u51fd\u6570\u4f53\u5fc5\u987b\u662f\u4e00\u4e2a\u7531\u5206\u53f7\u5206\u9694\u7684 SQL \u8bed\u53e5\u5217\u8868\u3002\u6700\u540e\u4e00\u6761\u8bed\u53e5\u540e\u7684\u5206\u53f7\u662f\u53ef\u9009\u7684\u3002\u9664\u975e\u8be5\u51fd\u6570\u88ab\u58f0\u660e\u4e3a\u8fd4\u56de <code class=\"type\">void</code>\uff0c\u5426\u5219\u6700\u540e\u4e00\u6761\u8bed\u53e5\u5fc5\u987b\u662f <code class=\"command\">SELECT</code>\uff0c\u6216\u8005\u662f <code class=\"command\">INSERT</code>\u3001<code class=\"command\">UPDATE</code> \u6216 <code class=\"command\">DELETE</code> \u5e76\u5e26\u6709 <code class=\"literal\">RETURNING</code> \u5b50\u53e5\u3002</p>\n<p lang=\"zh\">\u4efb\u610f\u4e00\u7ec4 <acronym class=\"acronym\">SQL</acronym> \u8bed\u8a00\u547d\u4ee4\u90fd\u53ef\u4ee5\u6253\u5305\u5e76\u5b9a\u4e49\u6210\u51fd\u6570\u3002\u9664 <code class=\"command\">SELECT</code> \u67e5\u8be2\u5916\uff0c\u8fd9\u4e9b\u547d\u4ee4\u8fd8\u53ef\u4ee5\u5305\u542b\u6570\u636e\u4fee\u6539\u67e5\u8be2\uff08<code class=\"command\">INSERT</code>\uff0c<code class=\"command\">UPDATE</code>\u3001<code class=\"command\">DELETE</code>\uff09\uff0c\u4ee5\u53ca\u5176\u4ed6 SQL \u547d\u4ee4\u3002\uff08\u4e0d\u80fd\u4f7f\u7528\u4e8b\u52a1\u63a7\u5236\u547d\u4ee4\uff0c\u4f8b\u5982 <code class=\"command\">COMMIT</code>\uff0c<code class=\"command\">SAVEPOINT</code>\uff0c\u4ee5\u53ca\u67d0\u4e9b\u5de5\u5177\u547d\u4ee4\uff0c\u4f8b\u5982 <code class=\"literal\">VACUUM</code>\uff0c\u6765\u7f16\u5199 <acronym class=\"acronym\">SQL</acronym> \u51fd\u6570\u3002\uff09\u4e0d\u8fc7\uff0c\u6700\u540e\u4e00\u6761\u547d\u4ee4\u5fc5\u987b\u662f <code class=\"command\">SELECT</code>\uff0c\u6216\u8005\u5e26\u6709 <code class=\"literal\">RETURNING</code> \u5b50\u53e5\uff0c\u5e76\u8fd4\u56de\u4e0e\u51fd\u6570\u58f0\u660e\u8fd4\u56de\u7c7b\u578b\u76f8\u7b26\u7684\u7ed3\u679c\u3002\u6216\u8005\uff0c\u5982\u679c\u4f60\u60f3\u5b9a\u4e49\u4e00\u4e2a\u6267\u884c\u52a8\u4f5c\u4f46\u6ca1\u6709\u6709\u7528\u8fd4\u56de\u503c\u7684 SQL \u51fd\u6570\uff0c\u4e5f\u53ef\u4ee5\u628a\u5b83\u5b9a\u4e49\u4e3a\u8fd4\u56de <code class=\"type\">void</code>\u3002\u4f8b\u5982\uff0c\u4e0b\u9762\u8fd9\u4e2a\u51fd\u6570\u4f1a\u5220\u9664 <code class=\"literal\">emp</code> \u8868\u4e2d\u85aa\u8d44\u4e3a\u8d1f\u7684\u884c\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION clean_emp() RETURNS void AS '\n    DELETE FROM emp\n        WHERE salary &lt; 0;\n' LANGUAGE SQL;\n\nSELECT clean_emp();\n\n clean_emp\n-----------\n\n(1 row)\n</pre>\n<div class=\"note\">\n<h3 class=\"title\" lang=\"zh\">\u6ce8\u610f</h3>\n<p lang=\"zh\">SQL \u51fd\u6570\u7684\u6574\u4e2a\u51fd\u6570\u4f53\u90fd\u4f1a\u5148\u7ecf\u8fc7\u89e3\u6790\uff0c\u7136\u540e\u624d\u5f00\u59cb\u6267\u884c\u3002\u867d\u7136 SQL \u51fd\u6570\u53ef\u4ee5\u5305\u542b\u4fee\u6539\u7cfb\u7edf\u76ee\u5f55\u7684\u547d\u4ee4\uff08\u4f8b\u5982 <code class=\"command\">CREATE TABLE</code>\uff09\uff0c\u4f46\u5728\u5bf9\u51fd\u6570\u4e2d\u7684\u540e\u7eed\u547d\u4ee4\u8fdb\u884c\u89e3\u6790\u5206\u6790\u65f6\uff0c\u8fd9\u4e9b\u547d\u4ee4\u7684\u6548\u679c\u8fd8\u4e0d\u53ef\u89c1\u3002\u56e0\u6b64\uff0c\u4f8b\u5982\u5c06 <code class=\"literal\">CREATE TABLE foo (...); INSERT INTO foo VALUES(...);</code> \u6253\u5305\u5230\u540c\u4e00\u4e2a SQL \u51fd\u6570\u4e2d\uff0c\u5c31\u4e0d\u4f1a\u6309\u9884\u671f\u5de5\u4f5c\uff0c\u56e0\u4e3a <code class=\"structname\">foo</code> \u5728\u89e3\u6790 <code class=\"command\">INSERT</code> \u547d\u4ee4\u65f6\u8fd8\u4e0d\u5b58\u5728\u3002\u5728\u8fd9\u7c7b\u60c5\u51b5\u4e0b\uff0c\u5efa\u8bae\u4f7f\u7528 <span class=\"application\">PL/pgSQL</span> \u800c\u4e0d\u662f SQL \u51fd\u6570\u3002</p>\n</div>\n<p lang=\"zh\"><code class=\"command\">CREATE FUNCTION</code> \u547d\u4ee4\u7684\u8bed\u6cd5\u8981\u6c42\u628a\u51fd\u6570\u4f53\u5199\u6210\u4e00\u4e2a\u5b57\u7b26\u4e32\u5e38\u91cf\u3002\u5bf9\u4e8e\u5b57\u7b26\u4e32\u5e38\u91cf\uff0c\u901a\u5e38\u4f7f\u7528\u7f8e\u5143\u5f15\u7528\u6700\u65b9\u4fbf\uff08\u89c1<a class=\"xref\" href=\"/docs/11/sql-syntax.html#SQL-SYNTAX-DOLLAR-QUOTING\" title=\"4.1.2.4.\u00a0\u7f8e\u5143\u5f15\u7528\u7684\u5b57\u7b26\u4e32\u5e38\u91cf\">\u7b2c\u00a04.1.2.4\u00a0\u8282</a>\uff09\u3002\u5982\u679c\u4f60\u9009\u62e9\u4f7f\u7528\u5e38\u89c4\u7684\u5355\u5f15\u53f7\u5b57\u7b26\u4e32\u5e38\u91cf\u8bed\u6cd5\uff0c\u90a3\u4e48\u5fc5\u987b\u5728\u51fd\u6570\u4f53\u4e2d\u5c06\u5355\u5f15\u53f7\uff08<code class=\"literal\">'</code>\uff09\u548c\u53cd\u659c\u7ebf\uff08<code class=\"literal\">\\</code>\uff09\u5199\u6210\u53cc\u4efd\uff08\u5047\u5b9a\u4f7f\u7528\u8f6c\u4e49\u5b57\u7b26\u4e32\u8bed\u6cd5\uff0c\u89c1<a class=\"xref\" href=\"/docs/11/sql-syntax.html#SQL-SYNTAX-STRINGS\" title=\"4.1.2.1.\u00a0\u5b57\u7b26\u4e32\u5e38\u91cf\">\u7b2c\u00a04.1.2.1\u00a0\u8282</a>\uff09\u3002</p>\n<div class=\"sect2\" id=\"XFUNC-SQL-FUNCTION-ARGUMENTS\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/11/xfunc-sql.html#XFUNC-SQL-FUNCTION-ARGUMENTS\">38.5.1. <acronym class=\"acronym\">SQL</acronym>\u51fd\u6570\u7684\u53c2\u6570</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\">\u4e00\u4e2a SQL \u51fd\u6570\u7684\u53c2\u6570\u53ef\u4ee5\u5728\u51fd\u6570\u4f53\u4e2d\u7528\u540d\u79f0\u6216\u7f16\u53f7\u5f15\u7528\u3002\u4e0b\u9762\u4f1a\u6709\u4e24\u79cd\u65b9\u6cd5\u7684\u793a\u4f8b\u3002</p>\n<p lang=\"zh\">\u8981\u4f7f\u7528\u4e00\u4e2a\u540d\u79f0\uff0c\u5c06\u51fd\u6570\u53c2\u6570\u58f0\u660e\u4e3a\u5e26\u6709\u4e00\u4e2a\u540d\u79f0\uff0c\u7136\u540e\u5728\u51fd\u6570\u4f53\u4e2d\u53ea\u5199\u8be5\u540d\u79f0\u3002\u5982\u679c\u53c2\u6570\u540d\u79f0\u4e0e\u51fd\u6570\u5185\u5f53\u524d SQL \u547d\u4ee4\u4e2d\u7684\u4efb\u610f\u5217\u540d\u76f8\u540c\uff0c\u5217\u540d\u5c06\u4f18\u5148\u3002\u5982\u679c\u4e0d\u60f3\u8fd9\u6837\uff0c\u53ef\u4ee5\u7528\u51fd\u6570\u672c\u8eab\u7684\u540d\u79f0\u6765\u9650\u5b9a\u53c2\u6570\u540d\uff0c\u4e5f\u5c31\u662f<code class=\"literal\"><em class=\"replaceable\"><code>function_name</code></em>.<em class=\"replaceable\"><code>argument_name</code></em></code>\uff08\u5982\u679c\u8fd9\u4f1a\u4e0e\u4e00\u4e2a\u88ab\u9650\u5b9a\u7684\u5217\u540d\u51b2\u7a81\uff0c\u7167\u4f8b\u8fd8\u662f\u5217\u540d\u8d62\u5f97\u4f18\u5148\u3002\u4f60\u53ef\u4ee5\u901a\u8fc7\u4e3a SQL \u547d\u4ee4\u4e2d\u7684\u8868\u9009\u62e9\u4e00\u4e2a\u4e0d\u540c\u7684\u522b\u540d\u6765\u907f\u514d\u8fd9\u79cd\u6df7\u6dc6\uff09\u3002</p>\n<p lang=\"zh\">\u5728\u66f4\u65e7\u7684\u6570\u5b57\u65b9\u6cd5\u4e2d\uff0c\u53c2\u6570\u53ef\u4ee5\u7528\u8bed\u6cd5<code class=\"literal\">$<em class=\"replaceable\"><code>n</code></em></code>\u5f15\u7528\uff1a<code class=\"literal\">$1</code>\u6307\u7684\u662f\u7b2c\u4e00\u4e2a\u8f93\u5165\u53c2\u6570\uff0c<code class=\"literal\">$2</code>\u6307\u7684\u662f\u7b2c\u4e8c\u4e2a\uff0c\u4ee5\u6b64\u7c7b\u63a8\u3002\u4e0d\u7ba1\u7279\u5b9a\u7684\u53c2\u6570\u662f\u5426\u4f7f\u7528\u540d\u79f0\u58f0\u660e\uff0c\u8fd9\u79cd\u65b9\u6cd5\u90fd\u6709\u6548\u3002</p>\n<p lang=\"zh\">\u5982\u679c\u4e00\u4e2a\u53c2\u6570\u662f\u4e00\u79cd\u590d\u5408\u7c7b\u578b\uff0c\u90a3\u4e48\u70b9\u53f7\u8bb0\u6cd5\uff08\u5982 <code class=\"literal\"><em class=\"replaceable\"><code>argname</code></em>.<em class=\"replaceable\"><code>fieldname</code></em></code> \u6216<code class=\"literal\">$1.<em class=\"replaceable\"><code>fieldname</code></em></code>\uff09\u4e5f\u53ef\u4ee5\u88ab\u7528\u6765\u8bbf\u95ee\u8be5\u53c2\u6570\u7684\u5c5e\u6027\u3002\u540c\u6837\uff0c\u4f60\u53ef\u80fd\u9700\u8981\u7528\u51fd\u6570\u7684\u540d\u79f0\u6765\u9650\u5b9a\u53c2\u6570\u7684\u540d\u79f0\u4ee5\u907f\u514d\u6b67\u4e49\u3002</p>\n<p lang=\"zh\">SQL \u51fd\u6570\u53c2\u6570\u53ea\u80fd\u88ab\u7528\u505a\u6570\u636e\u503c\u800c\u4e0d\u80fd\u4f5c\u4e3a\u6807\u8bc6\u7b26\u3002\u4f8b\u5982\u8fd9\u662f\u5408\u7406\u7684\uff1a</p>\n<pre class=\"programlisting\">INSERT INTO mytable VALUES ($1);\n</pre>\n<p lang=\"zh\">\u4f46\u8fd9\u6837\u5c31\u4e0d\u884c\uff1a</p>\n<pre class=\"programlisting\">INSERT INTO $1 VALUES (42);\n</pre>\n<div class=\"note\">\n<h3 class=\"title\" lang=\"zh\">\u6ce8\u610f</h3>\n<p lang=\"zh\">PostgreSQL 9.2 \u5f00\u59cb\u652f\u6301\u901a\u8fc7\u540d\u79f0\u5f15\u7528 SQL \u51fd\u6570\u53c2\u6570\u3002\u9700\u8981\u7528\u4e8e\u66f4\u65e9\u7248\u672c\u670d\u52a1\u5668\u7684\u51fd\u6570\u5fc5\u987b\u4f7f\u7528 $n \u8bb0\u6cd5\u3002</p>\n</div>\n</div>\n<div class=\"sect2\" id=\"XFUNC-SQL-BASE-FUNCTIONS\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/11/xfunc-sql.html#XFUNC-SQL-BASE-FUNCTIONS\">38.5.2. \u57fa\u7840\u7c7b\u578b\u4e0a\u7684<acronym class=\"acronym\">SQL</acronym>\u51fd\u6570</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\">\u6700\u7b80\u5355\u7684 <acronym class=\"acronym\">SQL</acronym> \u51fd\u6570\u6ca1\u6709\u53c2\u6570\uff0c\u53ea\u662f\u8fd4\u56de\u4e00\u4e2a\u57fa\u7840\u7c7b\u578b\uff0c\u4f8b\u5982 <code class=\"type\">integer</code>\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION one() RETURNS integer AS $$\n    SELECT 1 AS result;\n$$ LANGUAGE SQL;\n\n-- Alternative syntax for string literal:\nCREATE FUNCTION one() RETURNS integer AS '\n    SELECT 1 AS result;\n' LANGUAGE SQL;\n\nSELECT one();\n\n one\n-----\n   1\n</pre>\n<p lang=\"zh\">\u6ce8\u610f\u6211\u4eec\u4e3a\u8be5\u51fd\u6570\u7684\u7ed3\u679c\u5728\u51fd\u6570\u4f53\u5185\u5b9a\u4e49\u4e86\u4e00\u4e2a\u5217\u522b\u540d\uff08\u540d\u4e3a<code class=\"literal\">result</code>\uff09\uff0c\u4f46\u662f\u8fd9\u4e2a\u5217\u522b\u540d\u5728\u51fd\u6570\u4ee5\u5916\u662f\u4e0d\u53ef\u89c1\u7684\u3002\u56e0\u6b64\uff0c\u7ed3\u679c\u88ab\u6807\u8bb0\u4e3a<code class=\"literal\">one</code>\u800c\u4e0d\u662f<code class=\"literal\">result</code>\u3002</p>\n<p lang=\"zh\">\u5b9a\u4e49\u63a5\u53d7\u57fa\u7840\u7c7b\u578b\u53c2\u6570\u7684 <acronym class=\"acronym\">SQL</acronym> \u51fd\u6570\u4e5f\u51e0\u4e4e\u540c\u6837\u5bb9\u6613\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION add_em(x integer, y integer) RETURNS integer AS $$\n    SELECT x + y;\n$$ LANGUAGE SQL;\n\nSELECT add_em(1, 2) AS answer;\n\n answer\n--------\n      3\n</pre>\n<p lang=\"zh\">\u6216\u8005\uff0c\u6211\u4eec\u4e5f\u53ef\u4ee5\u4e0d\u7528\u53c2\u6570\u540d\uff0c\u800c\u6539\u7528\u6570\u5b57\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION add_em(integer, integer) RETURNS integer AS $$\n    SELECT $1 + $2;\n$$ LANGUAGE SQL;\n\nSELECT add_em(1, 2) AS answer;\n\n answer\n--------\n      3\n</pre>\n<p lang=\"zh\">\u4e0b\u9762\u662f\u4e00\u4e2a\u66f4\u6709\u7528\u7684\u51fd\u6570\uff0c\u5b83\u53ef\u4ee5\u7528\u6765\u4ece\u94f6\u884c\u8d26\u6237\u4e2d\u6263\u6b3e\uff1a</p>\n<pre class=\"programlisting\">CREATE FUNCTION tf1 (accountno integer, debit numeric) RETURNS numeric AS $$\n    UPDATE bank\n        SET balance = balance - debit\n        WHERE accountno = tf1.accountno;\n    SELECT 1;\n$$ LANGUAGE SQL;\n</pre>\n<p lang=\"zh\">\u7528\u6237\u53ef\u4ee5\u8fd9\u6837\u6267\u884c\u8be5\u51fd\u6570\uff0c\u4ece 17 \u53f7\u8d26\u6237\u4e2d\u6263\u9664 $100.00\uff1a</p>\n<pre class=\"programlisting\">SELECT tf1(17, 100.0);\n</pre>\n<p lang=\"zh\">\u5728\u8fd9\u4e2a\u793a\u4f8b\u4e2d\uff0c\u6211\u4eec\u4e3a\u7b2c\u4e00\u4e2a\u53c2\u6570\u9009\u62e9\u4e86\u540d\u79f0<code class=\"literal\">accountno</code>\uff0c\u4f46\u662f\u8fd9\u548c\u8868<code class=\"literal\">bank</code>\u4e2d\u7684\u4e00\u4e2a\u5217\u540d\u76f8\u540c\u3002\u5728<code class=\"command\">UPDATE</code>\u547d\u4ee4\u4e2d\uff0c<code class=\"literal\">accountno</code>\u5f15\u7528\u5217<code class=\"literal\">bank.accountno</code>\uff0c\u56e0\u6b64 <code class=\"literal\">tf1.accountno</code>\u5fc5\u987b\u88ab\u7528\u6765\u5f15\u7528\u8be5\u53c2\u6570\u3002\u6211\u4eec\u5f53\u7136\u53ef\u4ee5\u901a\u8fc7\u4e3a\u8be5\u53c2\u6570\u4f7f\u7528\u4e00\u4e2a\u4e0d\u540c\u7684\u540d\u79f0\u6765\u907f\u514d\u8fd9\u6837\u7684\u95ee\u9898\u3002</p>\n<p lang=\"zh\">\u5b9e\u9645\u4e0a\u6211\u4eec\u53ef\u80fd\u559c\u6b22\u4ece\u8be5\u51fd\u6570\u5f97\u5230\u4e00\u4e2a\u66f4\u6709\u7528\u7684\u7ed3\u679c\u800c\u4e0d\u662f\u4e00\u4e2a\u5e38\u6570 1\uff0c\u56e0\u6b64\u4e00\u4e2a\u66f4\u53ef\u80fd\u7684\u5b9a\u4e49\u662f\uff1a</p>\n<pre class=\"programlisting\">CREATE FUNCTION tf1 (accountno integer, debit numeric) RETURNS numeric AS $$\n    UPDATE bank\n        SET balance = balance - debit\n        WHERE accountno = tf1.accountno;\n    SELECT balance FROM bank WHERE accountno = tf1.accountno;\n$$ LANGUAGE SQL;\n</pre>\n<p lang=\"zh\">\u5b83\u4f1a\u8c03\u6574\u4f59\u989d\u5e76\u4e14\u8fd4\u56de\u65b0\u7684\u4f59\u989d\u3002\u540c\u6837\u7684\u4e8b\u60c5\u4e5f\u53ef\u4ee5\u7528\u4e00\u4e2a\u4f7f\u7528<code class=\"literal\">RETURNING</code>\u7684\u547d\u4ee4\u5b9e\u73b0\uff1a</p>\n<pre class=\"programlisting\">CREATE FUNCTION tf1 (accountno integer, debit numeric) RETURNS numeric AS $$\n    UPDATE bank\n        SET balance = balance - debit\n        WHERE accountno = tf1.accountno\n    RETURNING balance;\n$$ LANGUAGE SQL;\n</pre>\n<p lang=\"zh\">\u4e00\u4e2a <acronym class=\"acronym\">SQL</acronym> \u51fd\u6570\u5fc5\u987b\u8fd4\u56de\u4e0e\u5176\u58f0\u660e\u7684\u7ed3\u679c\u7c7b\u578b\u5b8c\u5168\u4e00\u81f4\u7684\u7c7b\u578b\u3002\u8fd9\u53ef\u80fd\u9700\u8981\u63d2\u5165\u663e\u5f0f\u7c7b\u578b\u8f6c\u6362\u3002\u4f8b\u5982\uff0c\u5047\u8bbe\u6211\u4eec\u5e0c\u671b\u524d\u9762\u7684 <code class=\"function\">add_em</code> \u51fd\u6570\u6539\u4e3a\u8fd4\u56de <code class=\"type\">float8</code> \u7c7b\u578b\u3002\u4e0b\u9762\u8fd9\u6837\u662f\u4e0d\u884c\u7684\uff1a</p>\n<pre class=\"programlisting\">CREATE FUNCTION add_em(integer, integer) RETURNS float8 AS $$\n    SELECT $1 + $2;\n$$ LANGUAGE SQL;\n</pre>\n<p lang=\"zh\">\u5373\u4fbf\u5728\u5176\u4ed6\u4e0a\u4e0b\u6587\u4e2d\uff0c<span class=\"productname\">PostgreSQL</span>\u613f\u610f\u63d2\u5165\u9690\u5f0f\u7c7b\u578b\u8f6c\u6362\uff0c\u628a <code class=\"type\">integer</code> \u8f6c\u6362\u4e3a <code class=\"type\">float8</code>\u3002\u6211\u4eec\u9700\u8981\u5c06\u5b83\u5199\u6210\uff1a</p>\n<pre class=\"programlisting\">CREATE FUNCTION add_em(integer, integer) RETURNS float8 AS $$\n    SELECT ($1 + $2)::float8;\n$$ LANGUAGE SQL;\n</pre>\n</div>\n<div class=\"sect2\" id=\"XFUNC-SQL-COMPOSITE-FUNCTIONS\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/11/xfunc-sql.html#XFUNC-SQL-COMPOSITE-FUNCTIONS\">38.5.3. \u590d\u5408\u7c7b\u578b\u4e0a\u7684<acronym class=\"acronym\">SQL</acronym>\u51fd\u6570</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\">\u7f16\u5199\u63a5\u53d7\u590d\u5408\u7c7b\u578b\u53c2\u6570\u7684\u51fd\u6570\u65f6\uff0c\u6211\u4eec\u4e0d\u4ec5\u5fc5\u987b\u6307\u5b9a\u8981\u7528\u54ea\u4e2a\u53c2\u6570\uff0c\u8fd8\u5fc5\u987b\u6307\u5b9a\u8be5\u53c2\u6570\u7684\u54ea\u4e2a\u5c5e\u6027\uff08\u5b57\u6bb5\uff09\u3002\u4f8b\u5982\uff0c\u5047\u8bbe <code class=\"type\">emp</code> \u662f\u4e00\u4e2a\u5305\u542b\u96c7\u5458\u6570\u636e\u7684\u8868\uff0c\u56e0\u6b64\u5b83\u4e5f\u662f\u8be5\u8868\u6bcf\u4e00\u884c\u5bf9\u5e94\u7684\u590d\u5408\u7c7b\u578b\u540d\u79f0\u3002\u4e0b\u9762\u7684\u51fd\u6570 <code class=\"function\">double_salary</code> \u7528\u6765\u8ba1\u7b97\u67d0\u4eba\u7684\u5de5\u8d44\u7ffb\u500d\u540e\u4f1a\u662f\u591a\u5c11\uff1a</p>\n<pre class=\"screen\">CREATE TABLE emp (\n    name        text,\n    salary      numeric,\n    age         integer,\n    cubicle     point\n);\n\nINSERT INTO emp VALUES ('Bill', 4200, 45, '(2,1)');\n\nCREATE FUNCTION double_salary(emp) RETURNS numeric AS $$\n    SELECT $1.salary * 2 AS salary;\n$$ LANGUAGE SQL;\n\nSELECT name, double_salary(emp.*) AS dream\n    FROM emp\n    WHERE emp.cubicle ~= point '(2,1)';\n\n name | dream\n------+-------\n Bill |  8400\n</pre>\n<p lang=\"zh\">\u6ce8\u610f\u8fd9\u91cc\u7528 <code class=\"literal\">$1.salary</code> \u8bed\u6cd5\u6765\u9009\u53d6\u53c2\u6570\u884c\u503c\u4e2d\u7684\u4e00\u4e2a\u5b57\u6bb5\u3002\u8fd8\u8981\u6ce8\u610f\uff0c\u8c03\u7528\u65f6\u7684 <code class=\"command\">SELECT</code> \u547d\u4ee4\u4f7f\u7528 <em class=\"replaceable\"><code>table_name</code></em><code class=\"literal\">.*</code> \u5c06\u8868\u7684\u5f53\u524d\u6574\u884c\u53d6\u4f5c\u4e00\u4e2a\u590d\u5408\u503c\u3002\u8be5\u8868\u884c\u4e5f\u53ef\u4ee5\u4ec5\u7528\u8868\u540d\u6765\u5f15\u7528\uff1a</p>\n<pre class=\"screen\">SELECT name, double_salary(emp) AS dream\n    FROM emp\n    WHERE emp.cubicle ~= point '(2,1)';\n</pre>\n<p lang=\"zh\">\u4f46\u8fd9\u79cd\u7528\u6cd5\u5df2\u88ab\u5f03\u7528\uff0c\u56e0\u4e3a\u5b83\u5f88\u5bb9\u6613\u8ba9\u4eba\u6df7\u6dc6\uff08\u5173\u4e8e\u8868\u884c\u590d\u5408\u503c\u8fd9\u4e24\u79cd\u8bb0\u6cd5\u7684\u66f4\u591a\u7ec6\u8282\uff0c\u89c1<a class=\"xref\" href=\"/docs/11/rowtypes.html#ROWTYPES-USAGE\" title=\"8.16.5.\u00a0\u5728\u67e5\u8be2\u4e2d\u4f7f\u7528\u590d\u5408\u7c7b\u578b\">\u7b2c\u00a08.16.5\u00a0\u8282</a>\uff09\u3002</p>\n<p lang=\"zh\">\u6709\u65f6\u5019\u5373\u65f6\u6784\u9020\u4e00\u4e2a\u590d\u5408\u53c2\u6570\u503c\u4f1a\u5f88\u65b9\u4fbf\u3002\u8fd9\u53ef\u4ee5\u7528<code class=\"literal\">ROW</code>\u6784\u9020\u5668\u5b8c\u6210\u3002\u4f8b\u5982\uff0c\u6211\u4eec\u53ef\u4ee5\u8c03\u6574\u88ab\u4f20\u9012\u7ed9\u51fd\u6570\u7684\u6570\u636e\uff1a</p>\n<pre class=\"screen\">SELECT name, double_salary(ROW(name, salary*1.1, age, cubicle)) AS dream\n    FROM emp;\n</pre>\n<p lang=\"zh\">\u4e5f\u53ef\u4ee5\u6784\u5efa\u4e00\u4e2a\u8fd4\u56de\u590d\u5408\u7c7b\u578b\u7684\u51fd\u6570\u3002\u8fd9\u662f\u4e00\u4e2a\u8fd4\u56de\u5355\u4e00<code class=\"type\">emp</code>\u884c\u7684\u51fd\u6570\u793a\u4f8b\uff1a</p>\n<pre class=\"programlisting\">CREATE FUNCTION new_emp() RETURNS emp AS $$\n    SELECT text 'None' AS name,\n        1000.0 AS salary,\n        25 AS age,\n        point '(2,2)' AS cubicle;\n$$ LANGUAGE SQL;\n</pre>\n<p lang=\"zh\">\u5728\u8fd9\u4e2a\u793a\u4f8b\u4e2d\uff0c\u6211\u4eec\u4e3a\u6bcf\u4e00\u4e2a\u5c5e\u6027\u6307\u5b9a\u4e86\u4e00\u4e2a\u5e38\u91cf\u503c\uff0c\u4f46\u662f\u53ef\u4ee5\u7528\u4efb\u4f55\u8ba1\u7b97\u6765\u66ff\u6362\u8fd9\u4e9b\u5e38\u91cf\u3002</p>\n<p lang=\"zh\">\u5b9a\u4e49\u8be5\u51fd\u6570\u65f6\u6709\u4e24\u70b9\u91cd\u8981\u6ce8\u610f\u4e8b\u9879\uff1a</p>\n<div class=\"itemizedlist\">\n<ul class=\"itemizedlist\">\n<li class=\"listitem\" lang=\"zh\">\n<p>\u67e5\u8be2\u4e2d\u7684\u9009\u62e9\u5217\u8868\u987a\u5e8f\u5fc5\u987b\u4e0e\u5217\u5728\u8be5\u590d\u5408\u7c7b\u578b\u6240\u5173\u8054\u7684\u8868\u4e2d\u51fa\u73b0\u7684\u987a\u5e8f\u5b8c\u5168\u76f8\u540c\u3002\uff08\u7cfb\u7edf\u4e0d\u8003\u8651\u50cf\u4e0a\u9762\u8fd9\u6837\u6307\u5b9a\u7684\u5217\u540d\u3002\uff09</p>\n</li>\n<li class=\"listitem\" lang=\"zh\">\n<p>\u6211\u4eec\u5fc5\u987b\u786e\u4fdd\u6bcf\u4e2a\u8868\u8fbe\u5f0f\u7684\u7c7b\u578b\u4e0e\u590d\u5408\u7c7b\u578b\u4e2d\u5bf9\u5e94\u5217\u7684\u7c7b\u578b\u76f8\u5339\u914d\uff0c\u5fc5\u8981\u65f6\u63d2\u5165\u7c7b\u578b\u8f6c\u6362\u3002\u5426\u5219\uff0c\u5c31\u4f1a\u5f97\u5230\u8fd9\u6837\u7684\u9519\u8bef\uff1a</p>\n<pre class=\"screen\">\n<code class=\"computeroutput\">\nERROR:  function declared to return emp returns varchar instead of text at column 1\n</code>\n</pre>\n<p>\u4e0e\u57fa\u7840\u7c7b\u578b\u7684\u60c5\u51b5\u4e00\u6837\uff0c\u8be5\u51fd\u6570\u4e0d\u4f1a\u81ea\u52a8\u63d2\u5165\u4efb\u4f55\u7c7b\u578b\u8f6c\u6362\u3002</p>\n</li>\n</ul>\n</div>\n<p lang=\"zh\">\u5b9a\u4e49\u540c\u4e00\u4e2a\u51fd\u6570\u7684\u53e6\u4e00\u79cd\u65b9\u6cd5\u662f\uff1a</p>\n<pre class=\"programlisting\">CREATE FUNCTION new_emp() RETURNS emp AS $$\n    SELECT ROW('None', 1000.0, 25, '(2,2)')::emp;\n$$ LANGUAGE SQL;\n</pre>\n<p lang=\"zh\">\u8fd9\u91cc\u6211\u4eec\u7f16\u5199\u4e86\u4e00\u4e2a <code class=\"command\">SELECT</code>\uff0c\u5b83\u53ea\u8fd4\u56de\u5177\u6709\u6b63\u786e\u590d\u5408\u7c7b\u578b\u7684\u5355\u5217\u3002\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b\uff0c\u8fd9\u6837\u505a\u5e76\u6ca1\u6709\u66f4\u597d\uff0c\u4f46\u5728\u67d0\u4e9b\u60c5\u51b5\u4e0b\u5b83\u662f\u4e00\u79cd\u65b9\u4fbf\u7684\u66ff\u4ee3\u65b9\u6cd5 \u2014 \u4f8b\u5982\uff0c\u5982\u679c\u6211\u4eec\u9700\u8981\u901a\u8fc7\u8c03\u7528\u53e6\u4e00\u4e2a\u8fd4\u56de\u6240\u9700\u590d\u5408\u503c\u7684\u51fd\u6570\u6765\u8ba1\u7b97\u7ed3\u679c\u3002\u53e6\u4e00\u4e2a\u4f8b\u5b50\u662f\uff0c\u5982\u679c\u6211\u4eec\u8981\u7f16\u5199\u7684\u51fd\u6570\u8fd4\u56de\u7684\u662f\u57fa\u4e8e\u590d\u5408\u7c7b\u578b\u7684\u57df\uff0c\u800c\u4e0d\u662f\u666e\u901a\u590d\u5408\u7c7b\u578b\uff0c\u5c31\u603b\u662f\u5fc5\u987b\u5c06\u5176\u5199\u6210\u8fd4\u56de\u5355\u5217\u7684\u5f62\u5f0f\uff0c\u56e0\u4e3a\u6ca1\u6709\u5176\u4ed6\u65b9\u6cd5\u53ef\u4ee5\u4ea7\u751f\u7c7b\u578b\u6070\u597d\u4e3a\u8be5\u57df\u7c7b\u578b\u7684\u503c\u3002</p>\n<p lang=\"zh\">\u6211\u4eec\u65e2\u53ef\u4ee5\u628a\u8fd9\u4e2a\u51fd\u6570\u76f4\u63a5\u5f53\u4f5c\u503c\u8868\u8fbe\u5f0f\u8c03\u7528\uff1a</p>\n<pre class=\"screen\">SELECT new_emp();\n\n         new_emp\n--------------------------\n (None,1000.0,25,\"(2,2)\")\n</pre>\n<p lang=\"zh\">\u4e5f\u53ef\u4ee5\u628a\u5b83\u5f53\u4f5c\u8868\u51fd\u6570\u6765\u8c03\u7528\uff1a</p>\n<pre class=\"screen\">SELECT * FROM new_emp();\n\n name | salary | age | cubicle\n------+--------+-----+---------\n None | 1000.0 |  25 | (2,2)\n</pre>\n<p lang=\"zh\">\u7b2c\u4e8c\u79cd\u65b9\u5f0f\u4f1a\u5728<a class=\"xref\" href=\"/docs/11/xfunc-sql.html#XFUNC-SQL-TABLE-FUNCTIONS\" title=\"38.5.7.\u00a0SQL \u51fd\u6570\u4f5c\u4e3a\u8868\u6765\u6e90\">\u7b2c\u00a038.5.7\u00a0\u8282</a>\u4e2d\u8fdb\u4e00\u6b65\u8bf4\u660e\u3002</p>\n<p lang=\"zh\">\u5f53\u4f60\u4f7f\u7528\u8fd4\u56de\u590d\u5408\u7c7b\u578b\u7684\u51fd\u6570\u65f6\uff0c\u53ef\u80fd\u53ea\u9700\u8981\u53d6\u5176\u7ed3\u679c\u4e2d\u7684\u4e00\u4e2a\u5b57\u6bb5\uff08\u5c5e\u6027\uff09\u3002\u53ef\u4ee5\u4f7f\u7528\u4e0b\u9762\u8fd9\u6837\u7684\u8bed\u6cd5\uff1a</p>\n<pre class=\"screen\">SELECT (new_emp()).name;\n\n name\n------\n None\n</pre>\n<p lang=\"zh\">\u8fd9\u91cc\u9700\u8981\u989d\u5916\u7684\u62ec\u53f7\uff0c\u4ee5\u514d\u89e3\u6790\u5668\u4ea7\u751f\u6b67\u4e49\u3002\u5982\u679c\u4e0d\u52a0\u62ec\u53f7\uff0c\u7ed3\u679c\u4f1a\u662f\u8fd9\u6837\uff1a</p>\n<pre class=\"screen\">SELECT new_emp().name;\nERROR:  syntax error at or near \".\"\nLINE 1: SELECT new_emp().name;\n                        ^\n</pre>\n<p lang=\"zh\">\u53e6\u4e00\u79cd\u9009\u62e9\u662f\u4f7f\u7528\u51fd\u6570\u8bb0\u6cd5\u6765\u63d0\u53d6\u5c5e\u6027\uff1a</p>\n<pre class=\"screen\">SELECT name(new_emp());\n\n name\n------\n None\n</pre>\n<p lang=\"zh\">\u5982<a class=\"xref\" href=\"/docs/11/rowtypes.html#ROWTYPES-USAGE\" title=\"8.16.5.\u00a0\u5728\u67e5\u8be2\u4e2d\u4f7f\u7528\u590d\u5408\u7c7b\u578b\">\u7b2c\u00a08.16.5\u00a0\u8282</a>\u6240\u8ff0\uff0c\u5b57\u6bb5\u8bb0\u6cd5\u548c\u51fd\u6570\u8bb0\u6cd5\u662f\u7b49\u4ef7\u7684\u3002</p>\n<p lang=\"zh\">\u53e6\u4e00\u79cd\u4f7f\u7528\u51fd\u6570\u8fd4\u56de\u590d\u5408\u7c7b\u578b\u7684\u65b9\u6cd5\u662f\u5c06\u7ed3\u679c\u4f20\u9012\u7ed9\u53e6\u4e00\u4e2a\u63a5\u53d7\u6b63\u786e\u884c\u7c7b\u578b\u4f5c\u4e3a\u8f93\u5165\u7684\u51fd\u6570\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION getname(emp) RETURNS text AS $$\n    SELECT $1.name;\n$$ LANGUAGE SQL;\n\nSELECT getname(new_emp());\n getname\n---------\n None\n(1 row)\n</pre>\n</div>\n<div class=\"sect2\" id=\"XFUNC-OUTPUT-PARAMETERS\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/11/xfunc-sql.html#XFUNC-OUTPUT-PARAMETERS\">38.5.4. \u5e26\u6709\u8f93\u51fa\u53c2\u6570\u7684<acronym class=\"acronym\">SQL</acronym>\u51fd\u6570</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\">\u63cf\u8ff0\u51fd\u6570\u7ed3\u679c\u7684\u53e6\u4e00\u79cd\u65b9\u6cd5\u662f\u4f7f\u7528<em class=\"firstterm\">\u8f93\u51fa\u53c2\u6570</em>\uff0c\u4f8b\u5982\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION add_em (IN x int, IN y int, OUT sum int)\nAS 'SELECT x + y'\nLANGUAGE SQL;\n\nSELECT add_em(3,7);\n add_em\n--------\n     10\n(1 row)\n</pre>\n<p lang=\"zh\">\u8fd9\u4e0e<a class=\"xref\" href=\"/docs/11/xfunc-sql.html#XFUNC-SQL-BASE-FUNCTIONS\" title=\"38.5.2.\u00a0\u57fa\u7840\u7c7b\u578b\u4e0a\u7684SQL\u51fd\u6570\">\u7b2c\u00a038.5.2\u00a0\u8282</a>\u4e2d\u5c55\u793a\u7684 <code class=\"literal\">add_em</code> \u7248\u672c\u672c\u8d28\u4e0a\u5e76\u65e0\u4e0d\u540c\u3002\u8f93\u51fa\u53c2\u6570\u7684\u771f\u6b63\u4ef7\u503c\u5728\u4e8e\uff0c\u5b83\u4eec\u4e3a\u5b9a\u4e49\u8fd4\u56de\u591a\u5217\u7684\u51fd\u6570\u63d0\u4f9b\u4e86\u4e00\u79cd\u65b9\u4fbf\u7684\u65b9\u6cd5\u3002\u4f8b\u5982\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION sum_n_product (x int, y int, OUT sum int, OUT product int)\nAS 'SELECT x + y, x * y'\nLANGUAGE SQL;\n\n SELECT * FROM sum_n_product(11,42);\n sum | product\n-----+---------\n  53 |     462\n(1 row)\n</pre>\n<p lang=\"zh\">\u8fd9\u91cc\u672c\u8d28\u4e0a\u53d1\u751f\u7684\u4e8b\u60c5\u662f\uff1a\u6211\u4eec\u4e3a\u8be5\u51fd\u6570\u7684\u7ed3\u679c\u521b\u5efa\u4e86\u4e00\u4e2a\u533f\u540d\u590d\u5408\u7c7b\u578b\u3002\u4e0a\u9762\u7684\u793a\u4f8b\u4e0e\u4e0b\u9762\u8fd9\u79cd\u5199\u6cd5\u7684\u6700\u7ec8\u6548\u679c\u76f8\u540c\uff1a</p>\n<pre class=\"screen\">CREATE TYPE sum_prod AS (sum int, product int);\n\nCREATE FUNCTION sum_n_product (int, int) RETURNS sum_prod\nAS 'SELECT $1 + $2, $1 * $2'\nLANGUAGE SQL;\n</pre>\n<p lang=\"zh\">\u4f46\u901a\u5e38\u4e0d\u5fc5\u989d\u5916\u5b9a\u4e49\u4e00\u4e2a\u72ec\u7acb\u7684\u590d\u5408\u7c7b\u578b\u4f1a\u66f4\u65b9\u4fbf\u3002\u6ce8\u610f\uff0c\u9644\u5728\u8f93\u51fa\u53c2\u6570\u4e0a\u7684\u540d\u79f0\u5e76\u975e\u53ea\u662f\u88c5\u9970\uff0c\u5b83\u4eec\u51b3\u5b9a\u4e86\u8fd9\u4e2a\u533f\u540d\u590d\u5408\u7c7b\u578b\u7684\u5217\u540d\u3002\uff08\u5982\u679c\u7701\u7565\u8f93\u51fa\u53c2\u6570\u540d\u79f0\uff0c\u7cfb\u7edf\u4f1a\u81ea\u884c\u9009\u62e9\u4e00\u4e2a\u540d\u79f0\u3002\uff09</p>\n<p lang=\"zh\">\u5728\u4ece SQL \u8c03\u7528\u8fd9\u6837\u4e00\u4e2a\u51fd\u6570\u65f6\uff0c\u8f93\u51fa\u53c2\u6570\u4e0d\u4f1a\u88ab\u5305\u62ec\u5728\u8c03\u7528\u53c2\u6570\u5217\u8868\u4e2d\u3002\u8fd9\u662f\u56e0\u4e3a<span class=\"productname\">PostgreSQL</span>\u53ea\u8003\u8651\u8f93\u5165\u53c2\u6570\u6765\u5b9a\u4e49\u51fd\u6570\u7684\u8c03\u7528\u7b7e\u540d\u3002\u8fd9\u4e5f\u610f\u5473\u7740\u5728\u4e3a\u8bf8\u5982\u5220\u9664\u51fd\u6570\u7b49\u76ee\u7684\u5f15\u7528\u8be5\u51fd\u6570\u65f6\u53ea\u6709\u8f93\u5165\u53c2\u6570\u6709\u5173\u7cfb\u3002\u6211\u4eec\u53ef\u4ee5\u7528\u4e0b\u9762\u7684\u547d\u4ee4\u4e4b\u4e00\u5220\u9664\u4e0a\u8ff0\u51fd\u6570</p>\n<pre class=\"screen\">DROP FUNCTION sum_n_product (x int, y int, OUT sum int, OUT product int);\nDROP FUNCTION sum_n_product (int, int);\n</pre>\n<p lang=\"zh\">\u53c2\u6570\u53ef\u4ee5\u88ab\u6807\u8bb0\u4e3a<code class=\"literal\">IN</code>\uff08\u9ed8\u8ba4\uff09\u3001<code class=\"literal\">OUT</code>\u3001<code class=\"literal\">INOUT</code>\u6216\u8005<code class=\"literal\">VARIADIC</code>\u3002\u4e00\u4e2a<code class=\"literal\">INOUT</code>\u53c2\u6570\u65e2\u4f5c\u4e3a\u4e00\u4e2a\u8f93\u5165\u53c2\u6570\uff08\u8c03\u7528\u53c2\u6570\u5217\u8868\u7684\u4e00\u90e8\u5206\uff09\u53c8\u4f5c\u4e3a\u4e00\u4e2a\u8f93\u51fa\u53c2\u6570\uff08\u7ed3\u679c\u8bb0\u5f55\u7c7b\u578b\u7684\u4e00\u90e8\u5206\uff09\u3002<code class=\"literal\">VARIADIC</code>\u53c2\u6570\u662f\u8f93\u5165\u53c2\u6570\uff0c\u4f46\u88ab\u6309\u7167\u4e0b\u6587\u6240\u8ff0\u7279\u6b8a\u5bf9\u5f85\u3002</p>\n</div>\n<div class=\"sect2\" id=\"XFUNC-SQL-VARIADIC-FUNCTIONS\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/11/xfunc-sql.html#XFUNC-SQL-VARIADIC-FUNCTIONS\">38.5.5. \u5e26\u6709\u53ef\u53d8\u6570\u91cf\u53c2\u6570\u7684<acronym class=\"acronym\">SQL</acronym>\u51fd\u6570</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\"><acronym class=\"acronym\">SQL</acronym> \u51fd\u6570\u53ef\u4ee5\u88ab\u58f0\u660e\u4e3a\u63a5\u53d7\u53ef\u53d8\u6570\u91cf\u7684\u53c2\u6570\uff0c\u53ea\u8981\u6240\u6709<span class=\"quote\">\u201c<span class=\"quote\">\u53ef\u9009</span>\u201d</span>\u53c2\u6570\u90fd\u5c5e\u4e8e\u540c\u4e00\u79cd\u6570\u636e\u7c7b\u578b\u3002\u53ef\u9009\u53c2\u6570\u4f1a\u4ee5\u6570\u7ec4\u5f62\u5f0f\u4f20\u9012\u7ed9\u51fd\u6570\u3002\u5b9a\u4e49\u8fd9\u7c7b\u51fd\u6570\u65f6\uff0c\u9700\u8981\u628a\u6700\u540e\u4e00\u4e2a\u53c2\u6570\u6807\u8bb0\u4e3a <code class=\"literal\">VARIADIC</code>\uff1b\u8be5\u53c2\u6570\u5fc5\u987b\u88ab\u58f0\u660e\u4e3a\u6570\u7ec4\u7c7b\u578b\u3002\u4f8b\u5982\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION mleast(VARIADIC arr numeric[]) RETURNS numeric AS $$\n    SELECT min($1[i]) FROM generate_subscripts($1, 1) g(i);\n$$ LANGUAGE SQL;\n\nSELECT mleast(10, -1, 5, 4.4);\n mleast \n--------\n     -1\n(1 row)\n</pre>\n<p lang=\"zh\">\u5b9e\u9645\u4e0a\uff0c\u4f4d\u4e8e <code class=\"literal\">VARIADIC</code> \u4f4d\u7f6e\u53ca\u4e4b\u540e\u7684\u6240\u6709\u5b9e\u53c2\u90fd\u4f1a\u88ab\u6536\u96c6\u6210\u4e00\u4e2a\u4e00\u7ef4\u6570\u7ec4\uff0c\u5c31\u50cf\u4f60\u5199\u6210\u4e86\uff1a</p>\n<pre class=\"screen\">SELECT mleast(ARRAY[10, -1, 5, 4.4]);    -- doesn't work\n</pre>\n<p lang=\"zh\">\u4e0d\u8fc7\u4f60\u5b9e\u9645\u4e0a\u4e0d\u80fd\u8fd9\u6837\u5199\uff0c\u81f3\u5c11\u5b83\u4e0d\u4f1a\u5339\u914d\u8fd9\u4e2a\u51fd\u6570\u5b9a\u4e49\u3002\u88ab\u6807\u8bb0\u4e3a <code class=\"literal\">VARIADIC</code> \u7684\u53c2\u6570\u5339\u914d\u7684\u662f\u5176\u5143\u7d20\u7c7b\u578b\u51fa\u73b0\u4e00\u6b21\u6216\u591a\u6b21\uff0c\u800c\u4e0d\u662f\u5b83\u81ea\u8eab\u7684\u6570\u7ec4\u7c7b\u578b\u3002</p>\n<p lang=\"zh\">\u6709\u65f6\u5019\uff0c\u80fd\u591f\u628a\u4e00\u4e2a\u5df2\u7ecf\u6784\u9020\u597d\u7684\u6570\u7ec4\u4f20\u7ed9\u53ef\u53d8\u53c2\u6570\u51fd\u6570\u4f1a\u5f88\u6709\u7528\uff0c\u5c24\u5176\u662f\u5f53\u4e00\u4e2a\u53ef\u53d8\u53c2\u6570\u51fd\u6570\u60f3\u628a\u5b83\u7684\u6570\u7ec4\u53c2\u6570\u518d\u4f20\u7ed9\u53e6\u4e00\u4e2a\u51fd\u6570\u65f6\u3002\u6b64\u5916\uff0c\u5728\u5141\u8bb8\u4e0d\u53d7\u4fe1\u4efb\u7528\u6237\u521b\u5efa\u5bf9\u8c61\u7684\u6a21\u5f0f\u4e2d\u8c03\u7528\u53ef\u53d8\u53c2\u6570\u51fd\u6570\u65f6\uff0c\u8fd9\u662f\u552f\u4e00\u5b89\u5168\u7684\u65b9\u5f0f\uff0c\u89c1<a class=\"xref\" href=\"/docs/11/typeconv-func.html\" title=\"10.3.\u00a0\u51fd\u6570\">\u7b2c\u00a010.3\u00a0\u8282</a>\u3002\u4f60\u53ef\u4ee5\u5728\u8c03\u7528\u4e2d\u6307\u5b9a<code class=\"literal\">VARIADIC</code>\u6765\u505a\u5230\u8fd9\u4e00\u70b9\uff1a</p>\n<pre class=\"screen\">SELECT mleast(VARIADIC ARRAY[10, -1, 5, 4.4]);\n</pre>\n<p lang=\"zh\">\u8fd9\u6837\u4f1a\u963b\u6b62\u51fd\u6570\u7684\u53ef\u53d8\u53c2\u6570\u6309\u5176\u5143\u7d20\u7c7b\u578b\u5c55\u5f00\uff0c\u4ece\u800c\u8ba9\u6570\u7ec4\u5b9e\u53c2\u80fd\u591f\u6309\u5e38\u89c4\u65b9\u5f0f\u5339\u914d\u3002<code class=\"literal\">VARIADIC</code> \u53ea\u80fd\u9644\u52a0\u5728\u51fd\u6570\u8c03\u7528\u7684\u6700\u540e\u4e00\u4e2a\u5b9e\u53c2\u4e0a\u3002</p>\n<p lang=\"zh\">\u5728\u8c03\u7528\u4e2d\u6307\u5b9a<code class=\"literal\">VARIADIC</code>\u4e5f\u662f\u5411\u53ef\u53d8\u53c2\u6570\u51fd\u6570\u4f20\u9012\u7a7a\u6570\u7ec4\u7684\u552f\u4e00\u65b9\u5f0f\uff0c\u4f8b\u5982\uff1a</p>\n<pre class=\"screen\">SELECT mleast(VARIADIC ARRAY[]::numeric[]);\n</pre>\n<p lang=\"zh\">\u4ec5\u4ec5\u5199\u6210<code class=\"literal\">SELECT mleast()</code>\u662f\u884c\u4e0d\u901a\u7684\uff0c\u56e0\u4e3a\u53ef\u53d8\u53c2\u6570\u5fc5\u987b\u5339\u914d\u81f3\u5c11\u4e00\u4e2a\u5b9e\u53c2\u3002\uff08\u5982\u679c\u4f60\u5e0c\u671b\u5141\u8bb8\u8fd9\u79cd\u8c03\u7528\uff0c\u53ef\u4ee5\u518d\u5b9a\u4e49\u4e00\u4e2a\u540c\u540d\u4e14\u4e0d\u5e26\u53c2\u6570\u7684\u51fd\u6570<code class=\"literal\">mleast</code>\u3002\uff09</p>\n<p lang=\"zh\">\u4ece\u53ef\u53d8\u53c2\u6570\u6d3e\u751f\u51fa\u7684\u6570\u7ec4\u5143\u7d20\u53c2\u6570\u4f1a\u88ab\u89c6\u4e3a\u6ca1\u6709\u81ea\u5df1\u7684\u540d\u5b57\u3002\u8fd9\u610f\u5473\u7740\u9664\u975e\u4f60\u6307\u5b9a\u4e86 <code class=\"literal\">VARIADIC</code>\uff0c\u5426\u5219\u4e0d\u80fd\u4f7f\u7528\u547d\u540d\u53c2\u6570\u6765\u8c03\u7528\u53ef\u53d8\u53c2\u6570\u51fd\u6570\uff08<a class=\"xref\" href=\"/docs/11/sql-syntax-calling-funcs.html\" title=\"4.3.\u00a0\u8c03\u7528\u51fd\u6570\">\u7b2c\u00a04.3\u00a0\u8282</a>\uff09\u3002\u4f8b\u5982\uff0c\u4e0b\u9762\u7684\u8c03\u7528\u662f\u53ef\u884c\u7684\uff1a</p>\n<pre class=\"screen\">SELECT mleast(VARIADIC arr =&gt; ARRAY[10, -1, 5, 4.4]);\n</pre>\n<p lang=\"zh\">\u4f46\u8fd9\u4e9b\u5c31\u4e0d\u884c\uff1a</p>\n<pre class=\"screen\">SELECT mleast(arr =&gt; 10);\nSELECT mleast(arr =&gt; ARRAY[10, -1, 5, 4.4]);\n</pre>\n</div>\n<div class=\"sect2\" id=\"XFUNC-SQL-PARAMETER-DEFAULTS\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/11/xfunc-sql.html#XFUNC-SQL-PARAMETER-DEFAULTS\">38.5.6. \u5e26\u6709\u53c2\u6570\u9ed8\u8ba4\u503c\u7684<acronym class=\"acronym\">SQL</acronym>\u51fd\u6570</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\">\u51fd\u6570\u53ef\u4ee5\u88ab\u58f0\u660e\u4e3a\u5bf9\u4e00\u4e9b\u6216\u8005\u6240\u6709\u8f93\u5165\u53c2\u6570\u5177\u6709\u9ed8\u8ba4\u503c\u3002\u53ea\u8981\u8c03\u7528\u51fd\u6570\u65f6\u6ca1\u6709\u7ed9\u51fa\u8db3\u591f\u591a\u7684\u5b9e\u53c2\uff0c\u5c31\u4f1a\u63d2\u5165\u9ed8\u8ba4\u503c\u6765\u5f25\u8865\u7f3a\u5931\u7684\u5b9e\u53c2\u3002\u7531\u4e8e\u53c2\u6570\u53ea\u80fd\u4ece\u5b9e\u53c2\u5217\u8868\u7684\u5c3e\u90e8\u5f00\u59cb\u88ab\u7701\u7565\uff0c\u5728\u4e00\u4e2a\u6709\u9ed8\u8ba4\u503c\u7684\u53c2\u6570\u4e4b\u540e\u7684\u6240\u6709\u53c2\u6570\u90fd\u4e0d\u5f97\u4e0d\u4e5f\u5177\u6709\u9ed8\u8ba4\u503c\uff08\u5c3d\u7ba1\u4f7f\u7528\u547d\u540d\u53c2\u6570\u8bb0\u6cd5\u53ef\u4ee5\u5141\u8bb8\u653e\u677e\u8fd9\u79cd\u9650\u5236\uff0c\u8fd9\u79cd\u9650\u5236\u4ecd\u7136\u4f1a\u88ab\u5f3a\u5236\u4ee5\u4fbf\u4f4d\u7f6e\u53c2\u6570\u8bb0\u6cd5\u80fd\u5de5\u4f5c\uff09\u3002\u4e0d\u7ba1\u4f60\u662f\u5426\u4f7f\u7528\u5b83\uff0c\u8fd9\u79cd\u80fd\u529b\u90fd\u8981\u6c42\u5728\u67d0\u4e9b\u7528\u6237\u4e0d\u4fe1\u4efb\u5176\u4ed6\u7528\u6237\u7684\u6570\u636e\u5e93\u4e2d\u8c03\u7528\u51fd\u6570\u65f6\u91c7\u53d6\u4e00\u4e9b\u9884\u9632\u63aa\u65bd\uff0c\u89c1<a class=\"xref\" href=\"/docs/11/typeconv-func.html\" title=\"10.3.\u00a0\u51fd\u6570\">\u7b2c\u00a010.3\u00a0\u8282</a>\u3002</p>\n<p lang=\"zh\">\u4f8b\u5982\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION foo(a int, b int DEFAULT 2, c int DEFAULT 3)\nRETURNS int\nLANGUAGE SQL\nAS $$\n    SELECT $1 + $2 + $3;\n$$;\n\nSELECT foo(10, 20, 30);\n foo \n-----\n  60\n(1 row)\n\nSELECT foo(10, 20);\n foo \n-----\n  33\n(1 row)\n\nSELECT foo(10);\n foo \n-----\n  15\n(1 row)\n\nSELECT foo();  -- fails since there is no default for the first argument\nERROR:  function foo() does not exist\n</pre>\n<p lang=\"zh\">\u4e5f\u53ef\u4ee5\u7528 <code class=\"literal\">=</code> \u7b26\u53f7\u4ee3\u66ff\u5173\u952e\u5b57 <code class=\"literal\">DEFAULT</code>\u3002</p>\n</div>\n<div class=\"sect2\" id=\"XFUNC-SQL-TABLE-FUNCTIONS\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/11/xfunc-sql.html#XFUNC-SQL-TABLE-FUNCTIONS\">38.5.7. <acronym class=\"acronym\">SQL</acronym> \u51fd\u6570\u4f5c\u4e3a\u8868\u6765\u6e90</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\">\u6240\u6709\u7684 SQL \u51fd\u6570\u90fd\u53ef\u4ee5\u88ab\u7528\u5728\u67e5\u8be2\u7684<code class=\"literal\">FROM</code>\u5b50\u53e5\u4e2d\uff0c\u4f46\u662f\u5bf9\u4e8e\u8fd4\u56de\u590d\u5408\u7c7b\u578b\u7684\u51fd\u6570\u7279\u522b\u6709\u7528\u3002\u5982\u679c\u51fd\u6570\u88ab\u5b9a\u4e49\u4e3a\u8fd4\u56de\u4e00\u79cd\u57fa\u7840\u7c7b\u578b\uff0c\u8be5\u8868\u51fd\u6570\u4f1a\u4ea7\u751f\u4e00\u4e2a\u5355\u5217\u8868\u3002\u5982\u679c\u8be5\u51fd\u6570\u88ab\u5b9a\u4e49\u4e3a\u8fd4\u56de\u4e00\u79cd\u590d\u5408\u7c7b\u578b\uff0c\u8be5\u8868\u51fd\u6570\u4f1a\u4e3a\u8be5\u590d\u5408\u7c7b\u578b\u7684\u6bcf\u4e00\u4e2a\u5c5e\u6027\u4ea7\u751f\u4e00\u5217\u3002</p>\n<p lang=\"zh\">\u4ee5\u4e0b\u662f\u4e00\u4e2a\u793a\u4f8b\uff1a</p>\n<pre class=\"screen\">CREATE TABLE foo (fooid int, foosubid int, fooname text);\nINSERT INTO foo VALUES (1, 1, 'Joe');\nINSERT INTO foo VALUES (1, 2, 'Ed');\nINSERT INTO foo VALUES (2, 1, 'Mary');\n\nCREATE FUNCTION getfoo(int) RETURNS foo AS $$\n    SELECT * FROM foo WHERE fooid = $1;\n$$ LANGUAGE SQL;\n\nSELECT *, upper(fooname) FROM getfoo(1) AS t1;\n\n fooid | foosubid | fooname | upper\n-------+----------+---------+-------\n     1 |        1 | Joe     | JOE\n(1 row)\n</pre>\n<p lang=\"zh\">\u5982\u793a\u4f8b\u6240\u793a\uff0c\u6211\u4eec\u53ef\u4ee5\u50cf\u64cd\u4f5c\u666e\u901a\u8868\u7684\u5217\u4e00\u6837\u64cd\u4f5c\u51fd\u6570\u7ed3\u679c\u4e2d\u7684\u5217\u3002</p>\n<p lang=\"zh\">\u6ce8\u610f\u6211\u4eec\u53ea\u4ece\u51fd\u6570\u5f97\u5230\u4e86\u4e00\u884c\u3002\u8fd9\u662f\u56e0\u4e3a\u6211\u4eec\u6ca1\u6709\u4f7f\u7528<code class=\"literal\">SETOF</code>\u3002\u8fd9\u4f1a\u5728\u4e0b\u4e00\u8282\u4e2d\u4ecb\u7ecd\u3002</p>\n</div>\n<div class=\"sect2\" id=\"XFUNC-SQL-FUNCTIONS-RETURNING-SET\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/11/xfunc-sql.html#XFUNC-SQL-FUNCTIONS-RETURNING-SET\">38.5.8. \u8fd4\u56de\u96c6\u5408\u7684<acronym class=\"acronym\">SQL</acronym>\u51fd\u6570</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\">\u5f53\u4e00\u4e2a SQL \u51fd\u6570\u88ab\u58f0\u660e\u4e3a\u8fd4\u56de<code class=\"literal\">SETOF <em class=\"replaceable\"><code>sometype</code></em></code>\u65f6\uff0c\u8be5\u51fd\u6570\u7684\u6700\u540e\u4e00\u4e2a\u67e5\u8be2\u4f1a\u88ab\u6267\u884c\u5b8c\uff0c\u5e76\u4e14\u5b83\u8f93\u51fa\u7684\u6bcf\u4e00\u884c\u90fd\u4f1a\u88ab\u4f5c\u4e3a\u7ed3\u679c\u96c6\u7684\u4e00\u4e2a\u5143\u7d20\u8fd4\u56de\u3002</p>\n<p lang=\"zh\">\u8fd9\u4e00\u7279\u6027\u901a\u5e38\u662f\u5728\u67e5\u8be2\u7684 <code class=\"literal\">FROM</code> \u5b50\u53e5\u4e2d\u8c03\u7528\u51fd\u6570\u65f6\u4f7f\u7528\u7684\u3002\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b\uff0c\u51fd\u6570\u8fd4\u56de\u7684\u6bcf\u4e00\u884c\u90fd\u4f1a\u6210\u4e3a\u67e5\u8be2\u6240\u89c1\u8868\u4e2d\u7684\u4e00\u884c\u3002\u4f8b\u5982\uff0c\u5047\u8bbe\u8868 <code class=\"literal\">foo</code> \u4e0e\u4e0a\u6587\u76f8\u540c\uff0c\u6211\u4eec\u5199\uff1a</p>\n<pre class=\"programlisting\">CREATE FUNCTION getfoo(int) RETURNS SETOF foo AS $$\n    SELECT * FROM foo WHERE fooid = $1;\n$$ LANGUAGE SQL;\n\nSELECT * FROM getfoo(1) AS t1;\n</pre>\n<p lang=\"zh\">\u90a3\u4e48\u4f1a\u5f97\u5230\uff1a</p>\n<pre class=\"screen\"> fooid | foosubid | fooname\n-------+----------+---------\n     1 |        1 | Joe\n     1 |        2 | Ed\n(2 rows)\n</pre>\n<p lang=\"zh\">\u4e5f\u53ef\u4ee5\u901a\u8fc7\u8f93\u51fa\u53c2\u6570\u5b9a\u4e49\u7684\u5217\u6765\u8fd4\u56de\u591a\u884c\uff0c\u4f8b\u5982\uff1a</p>\n<pre class=\"programlisting\">CREATE TABLE tab (y int, z int);\nINSERT INTO tab VALUES (1, 2), (3, 4), (5, 6), (7, 8);\n\nCREATE FUNCTION sum_n_product_with_tab (x int, OUT sum int, OUT product int)\nRETURNS SETOF record\nAS $$\n    SELECT $1 + tab.y, $1 * tab.y FROM tab;\n$$ LANGUAGE SQL;\n\nSELECT * FROM sum_n_product_with_tab(10);\n sum | product\n-----+---------\n  11 |      10\n  13 |      30\n  15 |      50\n  17 |      70\n(4 rows)\n</pre>\n<p lang=\"zh\">\u8fd9\u91cc\u7684\u5173\u952e\u70b9\u662f\uff1a\u4f60\u5fc5\u987b\u5199\u6210 <code class=\"literal\">RETURNS SETOF record</code>\uff0c\u4ee5\u8868\u660e\u8be5\u51fd\u6570\u8fd4\u56de\u7684\u662f\u591a\u884c\u800c\u4e0d\u662f\u5355\u884c\u3002\u5982\u679c\u53ea\u6709\u4e00\u4e2a\u8f93\u51fa\u53c2\u6570\uff0c\u5219\u5199\u8be5\u53c2\u6570\u7684\u7c7b\u578b\uff0c\u800c\u4e0d\u662f <code class=\"type\">record</code>\u3002</p>\n<p lang=\"zh\">\u901a\u8fc7\u591a\u6b21\u8c03\u7528\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u6765\u6784\u9020\u67e5\u8be2\u7ed3\u679c\u901a\u5e38\u5f88\u6709\u7528\uff0c\u5176\u4e2d\u6bcf\u6b21\u8c03\u7528\u7684\u53c2\u6570\u90fd\u6765\u81ea\u8868\u6216\u5b50\u67e5\u8be2\u7684\u8fde\u7eed\u884c\u3002\u9996\u9009\u65b9\u5f0f\u662f\u4f7f\u7528 <code class=\"literal\">LATERAL</code> \u5173\u952e\u5b57\uff0c\u8be6\u89c1<a class=\"xref\" href=\"/docs/11/queries-table-expressions.html#QUERIES-LATERAL\" title=\"7.2.1.5.\u00a0LATERAL\u5b50\u67e5\u8be2\">\u7b2c\u00a07.2.1.5\u00a0\u8282</a>\u3002\u4e0b\u9762\u662f\u4e00\u4e2a\u4f7f\u7528\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u679a\u4e3e\u6811\u7ed3\u6784\u5143\u7d20\u7684\u793a\u4f8b\uff1a</p>\n<pre class=\"screen\">SELECT * FROM nodes;\n   name    | parent\n-----------+--------\n Top       |\n Child1    | Top\n Child2    | Top\n Child3    | Top\n SubChild1 | Child1\n SubChild2 | Child1\n(6 rows)\n\nCREATE FUNCTION listchildren(text) RETURNS SETOF text AS $$\n    SELECT name FROM nodes WHERE parent = $1\n$$ LANGUAGE SQL STABLE;\n\nSELECT * FROM listchildren('Top');\n listchildren\n--------------\n Child1\n Child2\n Child3\n(3 rows)\n\nSELECT name, child FROM nodes, LATERAL listchildren(name) AS child;\n  name  |   child\n--------+-----------\n Top    | Child1\n Top    | Child2\n Top    | Child3\n Child1 | SubChild1\n Child1 | SubChild2\n(5 rows)\n</pre>\n<p lang=\"zh\">\u8fd9\u4e2a\u4f8b\u5b50\u5e76\u6ca1\u6709\u505a\u51fa\u4efb\u4f55\u65e0\u6cd5\u7528\u7b80\u5355\u8fde\u63a5\u5b9e\u73b0\u7684\u4e8b\uff0c\u4f46\u5728\u66f4\u590d\u6742\u7684\u8ba1\u7b97\u4e2d\uff0c\u628a\u4e00\u90e8\u5206\u5de5\u4f5c\u653e\u8fdb\u51fd\u6570\u91cc\u901a\u5e38\u4f1a\u975e\u5e38\u65b9\u4fbf\u3002</p>\n<p lang=\"zh\">\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u4e5f\u53ef\u4ee5\u51fa\u73b0\u5728\u67e5\u8be2\u7684\u9009\u62e9\u5217\u8868\u4e2d\u3002\u5bf9\u4e8e\u67e5\u8be2\u672c\u8eab\u751f\u6210\u7684\u6bcf\u4e00\u884c\uff0c\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u90fd\u4f1a\u88ab\u8c03\u7528\uff0c\u5e76\u4e3a\u5176\u7ed3\u679c\u96c6\u4e2d\u7684\u6bcf\u4e00\u4e2a\u5143\u7d20\u751f\u6210\u4e00\u884c\u8f93\u51fa\u3002\u524d\u9762\u7684\u4f8b\u5b50\u4e5f\u53ef\u4ee5\u5199\u6210\u8fd9\u6837\uff1a</p>\n<pre class=\"screen\">SELECT listchildren('Top');\n listchildren\n--------------\n Child1\n Child2\n Child3\n(3 rows)\n\nSELECT name, listchildren(name) FROM nodes;\n  name  | listchildren\n--------+--------------\n Top    | Child1\n Top    | Child2\n Top    | Child3\n Child1 | SubChild1\n Child1 | SubChild2\n(5 rows)\n</pre>\n<p lang=\"zh\">\u5728\u6700\u540e\u4e00\u4e2a <code class=\"command\">SELECT</code> \u4e2d\uff0c\u6ce8\u610f\u6ca1\u6709\u4e3a <code class=\"literal\">Child2</code>\u3001<code class=\"literal\">Child3</code> \u7b49\u663e\u793a\u4efb\u4f55\u8f93\u51fa\u884c\u3002\u8fd9\u662f\u56e0\u4e3a <code class=\"function\">listchildren</code> \u5bf9\u8fd9\u4e9b\u53c2\u6570\u8fd4\u56de\u7684\u662f\u7a7a\u96c6\uff0c\u56e0\u6b64\u4e0d\u4f1a\u751f\u6210\u7ed3\u679c\u884c\u3002\u8fd9\u4e0e\u4f7f\u7528 <code class=\"literal\">LATERAL</code> \u8bed\u6cd5\u628a\u51fd\u6570\u7ed3\u679c\u505a\u5185\u8fde\u63a5\u65f6\u5f97\u5230\u7684\u884c\u4e3a\u76f8\u540c\u3002</p>\n<p lang=\"zh\"><span class=\"productname\">PostgreSQL</span>\u5bf9\u67e5\u8be2\u9009\u62e9\u5217\u8868\u4e2d\u7684\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u7684\u5904\u7406\u65b9\u5f0f\uff0c\u51e0\u4e4e\u4e0e\u5c06\u8be5\u51fd\u6570\u5199\u5728 <code class=\"literal\">LATERAL FROM</code> \u5b50\u53e5\u9879\u4e2d\u65f6\u5b8c\u5168\u76f8\u540c\u3002\u4f8b\u5982\uff0c</p>\n<pre class=\"programlisting\">SELECT x, generate_series(1,5) AS g FROM tab;\n</pre>\n<p lang=\"zh\">\u51e0\u4e4e\u7b49\u4ef7\u4e8e</p>\n<pre class=\"programlisting\">SELECT x, g FROM tab, LATERAL generate_series(1,5) AS g;\n</pre>\n<p lang=\"zh\">\u4e24\u8005\u672c\u5e94\u5b8c\u5168\u76f8\u540c\uff0c\u4f46\u5728\u8fd9\u4e2a\u7279\u5b9a\u793a\u4f8b\u4e2d\uff0c\u89c4\u5212\u5668\u53ef\u4ee5\u9009\u62e9\u5c06 <code class=\"structname\">g</code> \u653e\u5728\u5d4c\u5957\u5faa\u73af\u8fde\u63a5\u7684\u5916\u4fa7\uff0c\u56e0\u4e3a <code class=\"structname\">g</code> \u5b9e\u9645\u4e0a\u5e76\u4e0d\u6a2a\u5411\u4f9d\u8d56\u4e8e <code class=\"structname\">tab</code>\u3002\u8fd9\u4f1a\u5bfc\u81f4\u8f93\u51fa\u884c\u7684\u987a\u5e8f\u4e0d\u540c\u3002\u5bf9\u9009\u62e9\u5217\u8868\u4e2d\u7684\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u6c42\u503c\u65f6\uff0c\u603b\u662f\u5c06\u5176\u89c6\u4e3a\u4f4d\u4e8e\u4e0e <code class=\"literal\">FROM</code> \u5b50\u53e5\u5176\u4f59\u90e8\u5206\u7684\u5d4c\u5957\u5faa\u73af\u8fde\u63a5\u7684\u5185\u4fa7\uff0c\u56e0\u6b64\u5728\u8003\u8651 <code class=\"literal\">FROM</code> \u5b50\u53e5\u7684\u4e0b\u4e00\u884c\u4e4b\u524d\uff0c\u8fd9\u4e9b\u51fd\u6570\u90fd\u4f1a\u8fd0\u884c\u5230\u5b8c\u6210\u3002</p>\n<p lang=\"zh\">\u5982\u679c\u5728\u67e5\u8be2\u7684\u9009\u62e9\u5217\u8868\u4e2d\u6709\u4e0d\u6b62\u4e00\u4e2a\u96c6\u5408\u8fd4\u56de\u51fd\u6570\uff0c\u5219\u884c\u4e3a\u7c7b\u4f3c\u4e8e\u628a\u90a3\u4e9b\u51fd\u6570\u653e\u5230\u4e00\u4e2a\u5355\u4e00\u7684<code class=\"literal\">LATERAL ROWS FROM( ... )</code> <code class=\"literal\">FROM</code>\u5b50\u53e5\u9879\u4e2d\u7684\u884c\u4e3a\u3002\u5bf9\u4e8e\u6765\u81ea\u5e95\u5c42\u67e5\u8be2\u7684\u6bcf\u4e00\u884c\uff0c\u90fd\u6709\u4e00\u4e2a\u7528\u5230\u6bcf\u4e2a\u51fd\u6570\u9996\u4e2a\u7ed3\u679c\u7684\u8f93\u51fa\u884c\uff0c\u7136\u540e\u662f\u4e00\u4e2a\u4f7f\u7528\u6bcf\u4e2a\u51fd\u6570\u7b2c\u4e8c\u4e2a\u7ed3\u679c\u7684\u8f93\u51fa\u884c\uff0c\u4ee5\u6b64\u7c7b\u63a8\u3002\u5982\u679c\u67d0\u4e9b\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u4ea7\u751f\u7684\u8f93\u51fa\u6bd4\u5176\u4ed6\u51fd\u6570\u5c11\uff0c\u4f1a\u7528\u7a7a\u503c\u4ee3\u66ff\u7f3a\u5931\u7684\u6570\u636e\uff0c\u56e0\u6b64\u4e3a\u4e00\u4e2a\u5e95\u5c42\u884c\u5f62\u6210\u7684\u603b\u884c\u6570\u7b49\u4e8e\u4ea7\u751f\u6700\u591a\u8f93\u51fa\u7684\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u7684\u8f93\u51fa\u884c\u6570\u3002\u56e0\u6b64\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u4f1a<span class=\"quote\">\u201c<span class=\"quote\">\u6b65\u8c03\u4e00\u81f4</span>\u201d</span>\u5730\u8fd0\u884c\u76f4\u5230\u5b83\u4eec\u7684\u8f93\u51fa\u88ab\u8017\u5c3d\uff0c\u7136\u540e\u7528\u4e0b\u4e00\u4e2a\u5e95\u5c42\u884c\u7ee7\u7eed\u6267\u884c\u3002</p>\n<p lang=\"zh\">\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u53ef\u4ee5\u88ab\u5d4c\u5957\u5728\u4e00\u4e2a\u9009\u62e9\u5217\u8868\u4e2d\uff0c\u4e0d\u8fc7\u5728<code class=\"literal\">FROM</code>\u5b50\u53e5\u9879\u4e2d\u4e0d\u5141\u8bb8\u8fd9\u6837\u505a\u3002\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b\uff0c\u5d4c\u5957\u7684\u6bcf\u4e00\u5c42\u4f1a\u88ab\u5355\u72ec\u5bf9\u5f85\uff0c\u5c31\u50cf\u5b83\u662f\u4e00\u4e2a\u5355\u72ec\u7684<code class=\"literal\">LATERAL ROWS FROM( ... )</code>\u9879\u4e00\u6837\u3002\u4f8b\u5982\uff0c\u5728</p>\n<pre class=\"programlisting\">SELECT srf1(srf2(x), srf3(y)), srf4(srf5(z)) FROM tab;\n</pre>\n<p lang=\"zh\">\u4e2d\uff0c\u96c6\u5408\u8fd4\u56de\u51fd\u6570<code class=\"function\">srf2</code>\u3001<code class=\"function\">srf3</code>\u548c<code class=\"function\">srf5</code>\u5c06\u4e3a<code class=\"structname\">tab</code>\u7684\u6bcf\u4e00\u884c\u6b65\u8c03\u4e00\u81f4\u5730\u8fd0\u884c\uff0c\u7136\u540e\u4f1a\u5bf9\u8f83\u4f4e\u5c42\u7684\u51fd\u6570\u4ea7\u751f\u7684\u6bcf\u4e00\u884c\u4ee5\u6b65\u8c03\u4e00\u81f4\u7684\u5f62\u5f0f\u5e94\u7528<code class=\"function\">srf1</code>\u548c<code class=\"function\">srf4</code>\u3002</p>\n<p lang=\"zh\">\u5728<code class=\"literal\">CASE</code>\u6216<code class=\"literal\">COALESCE</code>\u8fd9\u6837\u7684\u6761\u4ef6\u8ba1\u7b97\u7ed3\u6784\u4e2d\uff0c\u4e0d\u80fd\u4f7f\u7528\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u3002\u4f8b\u5982\uff0c\u8003\u8651</p>\n<pre class=\"programlisting\">SELECT x, CASE WHEN x &gt; 0 THEN generate_series(1, 5) ELSE 0 END FROM tab;\n</pre>\n<p lang=\"zh\">\u8868\u9762\u4e0a\u770b\uff0c\u8fd9\u5e94\u5f53\u8ba9 x &gt; 0 \u7684\u8f93\u5165\u884c\u91cd\u590d\u4e94\u6b21\uff0c\u5176\u4f59\u884c\u53ea\u51fa\u73b0\u4e00\u6b21\uff1b\u4f46\u5b9e\u9645\u4e0a\uff0cgenerate_series(1, 5) \u4f1a\u5728 CASE \u8868\u8fbe\u5f0f\u6c42\u503c\u4e4b\u524d\uff0c\u4f5c\u4e3a\u9690\u5f0f LATERAL FROM \u9879\u6267\u884c\uff0c\u56e0\u6b64\u6bcf\u4e2a\u8f93\u5165\u884c\u90fd\u4f1a\u91cd\u590d\u4e94\u6b21\u3002\u4e3a\u907f\u514d\u6df7\u6dc6\uff0c\u6b64\u7c7b\u5199\u6cd5\u4f1a\u5728\u89e3\u6790\u9636\u6bb5\u62a5\u9519\u3002</p>\n<div class=\"note\">\n<h3 class=\"title\" lang=\"zh\">\u6ce8\u610f</h3>\n<p lang=\"zh\">\u5982\u679c\u4e00\u4e2a\u51fd\u6570\u7684\u6700\u540e\u4e00\u6761\u547d\u4ee4\u662f <code class=\"command\">INSERT</code>\u3001<code class=\"command\">UPDATE</code> \u6216 <code class=\"command\">DELETE</code> \u5e76\u5e26\u6709 <code class=\"literal\">RETURNING</code>\uff0c\u90a3\u4e48\u5373\u4f7f\u8be5\u51fd\u6570\u6ca1\u6709\u58f0\u660e\u4e3a <code class=\"literal\">SETOF</code>\uff0c\u6216\u8005\u8c03\u7528\u5b83\u7684\u67e5\u8be2\u5e76\u672a\u53d6\u8d70\u5168\u90e8\u7ed3\u679c\u884c\uff0c\u8be5\u547d\u4ee4\u4e5f\u603b\u4f1a\u6267\u884c\u5230\u5b8c\u6210\u3002<code class=\"literal\">RETURNING</code> \u5b50\u53e5\u4ea7\u751f\u7684\u989d\u5916\u7ed3\u679c\u884c\u4f1a\u88ab\u9759\u9ed8\u4e22\u5f03\uff0c\u4f46\u76f8\u5e94\u7684\u8868\u4fee\u6539\u4ecd\u7136\u4f1a\u53d1\u751f\uff0c\u5e76\u4e14\u4f1a\u5728\u51fd\u6570\u8fd4\u56de\u524d\u5168\u90e8\u5b8c\u6210\u3002</p>\n</div>\n<div class=\"note\">\n<h3 class=\"title\" lang=\"zh\">\u6ce8\u610f</h3>\n<p lang=\"zh\">\u5728 <span class=\"productname\">PostgreSQL</span> 10 \u4e4b\u524d\uff0c\u9664\u975e\u591a\u4e2a\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u59cb\u7ec8\u4ea7\u751f\u76f8\u540c\u6570\u91cf\u7684\u884c\uff0c\u5426\u5219\u628a\u5b83\u4eec\u653e\u5728\u540c\u4e00\u4e2a\u9009\u62e9\u5217\u8868\u4e2d\u7684\u884c\u4e3a\u5e76\u4e0d\u5408\u7406\u3002\u5426\u5219\uff0c\u5f97\u5230\u7684\u8f93\u51fa\u884c\u6570\u4f1a\u662f\u8fd9\u4e9b\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u5404\u81ea\u4ea7\u751f\u884c\u6570\u7684\u6700\u5c0f\u516c\u500d\u6570\u3002\u6b64\u5916\uff0c\u5d4c\u5957\u7684\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u4e5f\u4e0d\u50cf\u4e0a\u6587\u6240\u63cf\u8ff0\u7684\u90a3\u6837\u5de5\u4f5c\uff1b\u76f8\u53cd\uff0c\u4e00\u4e2a\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u81f3\u591a\u53ea\u80fd\u6709\u4e00\u4e2a\u96c6\u5408\u8fd4\u56de\u53c2\u6570\uff0c\u5e76\u4e14\u6bcf\u4e00\u7ec4\u5d4c\u5957\u7684\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u90fd\u4f1a\u72ec\u7acb\u8fd0\u884c\u3002\u518d\u52a0\u4e0a\u8fc7\u53bb\u8fd8\u5141\u8bb8\u6761\u4ef6\u6267\u884c\uff08\u5373\u5728 <code class=\"literal\">CASE</code> \u7b49\u7ed3\u6784\u5185\u90e8\u4f7f\u7528\u96c6\u5408\u8fd4\u56de\u51fd\u6570\uff09\uff0c\u4e8b\u60c5\u5c31\u66f4\u52a0\u590d\u6742\u4e86\u3002\u5982\u679c\u4f60\u8981\u7f16\u5199\u9700\u8981\u5728\u65e7\u7248 <span class=\"productname\">PostgreSQL</span> \u4e0a\u8fd0\u884c\u7684\u67e5\u8be2\uff0c\u5efa\u8bae\u4f7f\u7528 <code class=\"literal\">LATERAL</code> \u8bed\u6cd5\uff0c\u56e0\u4e3a\u8fd9\u6837\u5728\u4e0d\u540c\u7248\u672c\u4e4b\u95f4\u80fd\u591f\u5f97\u5230\u4e00\u81f4\u7684\u7ed3\u679c\u3002\u5982\u679c\u4f60\u7684\u67e5\u8be2\u4f9d\u8d56\u4e8e\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u7684\u6761\u4ef6\u6267\u884c\uff0c\u6216\u8bb8\u53ef\u4ee5\u628a\u6761\u4ef6\u5224\u65ad\u79fb\u52a8\u5230\u81ea\u5b9a\u4e49\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u5185\u90e8\u6765\u4fee\u590d\u3002\u4f8b\u5982\uff0c</p>\n<pre class=\"programlisting\">SELECT x, CASE WHEN y &gt; 0 THEN generate_series(1, z) ELSE 5 END FROM tab;\n</pre>\n<p lang=\"zh\">\u53ef\u4ee5\u53d8\u6210</p>\n<pre class=\"programlisting\">CREATE FUNCTION case_generate_series(cond bool, start int, fin int, els int)\n  RETURNS SETOF int AS $$\nBEGIN\n  IF cond THEN\n    RETURN QUERY SELECT generate_series(start, fin);\n  ELSE\n    RETURN QUERY SELECT els;\n  END IF;\nEND$$ LANGUAGE plpgsql;\n\nSELECT x, case_generate_series(y &gt; 0, 1, z, 5) FROM tab;\n</pre>\n<p lang=\"zh\">\u8fd9\u79cd\u5199\u6cd5\u5728\u6240\u6709\u7248\u672c\u7684 <span class=\"productname\">PostgreSQL</span> \u4e2d\u7684\u884c\u4e3a\u90fd\u76f8\u540c\u3002</p>\n</div>\n</div>\n<div class=\"sect2\" id=\"XFUNC-SQL-FUNCTIONS-RETURNING-TABLE\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/11/xfunc-sql.html#XFUNC-SQL-FUNCTIONS-RETURNING-TABLE\">38.5.9. \u8fd4\u56de<code class=\"literal\">TABLE</code>\u7684<acronym class=\"acronym\">SQL</acronym>\u51fd\u6570</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\">\u8fd8\u6709\u53e6\u4e00\u79cd\u65b9\u6cd5\u53ef\u4ee5\u628a\u51fd\u6570\u58f0\u660e\u4e3a\u8fd4\u56de\u4e00\u4e2a\u96c6\u5408\uff0c\u5373\u4f7f\u7528 <code class=\"literal\">RETURNS TABLE(<em class=\"replaceable\"><code>columns</code></em>)</code>\u8bed\u6cd5\u3002\u8fd9\u7b49\u6548\u4e8e\u4f7f\u7528\u4e00\u4e2a\u6216\u8005\u591a\u4e2a<code class=\"literal\">OUT</code>\u53c2\u6570\u5916\u52a0\u628a\u51fd\u6570\u6807\u8bb0\u4e3a\u8fd4\u56de <code class=\"literal\">SETOF record</code>\uff08\u6216\u8005\u662f<code class=\"literal\">SETOF</code>\u5355\u4e2a\u8f93\u51fa\u53c2\u6570\u7684\u7c7b\u578b\uff09\u3002\u8fd9\u79cd\u5199\u6cd5\u662f\u5728\u6700\u8fd1\u7684 SQL \u6807\u51c6\u4e2d\u6307\u5b9a\u7684\uff0c\u56e0\u6b64\u53ef\u80fd\u6bd4\u4f7f\u7528 <code class=\"literal\">SETOF</code>\u7684\u79fb\u690d\u6027\u66f4\u597d\u3002</p>\n<p lang=\"zh\">\u4f8b\u5982\uff0c\u524d\u9762\u7684\u6c42\u548c\u5e76\u4e14\u76f8\u4e58\u7684\u793a\u4f8b\u4e5f\u53ef\u4ee5\u8fd9\u6837\u6765\u505a\uff1a</p>\n<pre class=\"programlisting\">CREATE FUNCTION sum_n_product_with_tab (x int)\nRETURNS TABLE(sum int, product int) AS $$\n    SELECT $1 + tab.y, $1 * tab.y FROM tab;\n$$ LANGUAGE SQL;\n</pre>\n<p lang=\"zh\">\u4e0d\u5141\u8bb8\u628a\u663e\u5f0f\u7684<code class=\"literal\">OUT</code>\u6216\u8005<code class=\"literal\">INOUT</code>\u53c2\u6570\u7528\u4e8e <code class=\"literal\">RETURNS TABLE</code>\u8bb0\u6cd5 \u2014 \u5fc5\u987b\u628a\u6240\u6709\u8f93\u51fa\u5217\u653e\u5728 <code class=\"literal\">TABLE</code>\u5217\u8868\u4e2d\u3002</p>\n</div>\n<div class=\"sect2\" id=\"id-1.8.3.8.18\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/11/xfunc-sql.html#id-1.8.3.8.18\">38.5.10. \u591a\u6001<acronym class=\"acronym\">SQL</acronym>\u51fd\u6570</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\"><acronym class=\"acronym\">SQL</acronym> \u51fd\u6570\u53ef\u4ee5\u88ab\u58f0\u660e\u4e3a\u63a5\u53d7\u5e76\u8fd4\u56de\u8fd9\u4e9b\u591a\u6001\u7c7b\u578b\uff1a<code class=\"type\">anyelement</code>\uff0c<code class=\"type\">anyarray</code>\uff0c<code class=\"type\">anynonarray</code>\uff0c<code class=\"type\">anyenum</code>\u3001<code class=\"type\">anyrange</code>\u3002\u5173\u4e8e\u591a\u6001\u51fd\u6570\u7684\u66f4\u8be6\u7ec6\u89e3\u91ca\uff0c\u89c1<a class=\"xref\" href=\"/docs/11/extend-type-system.html#EXTEND-TYPES-POLYMORPHIC\" title=\"38.2.5.\u00a0\u591a\u6001\u7c7b\u578b\">\u7b2c\u00a038.2.5\u00a0\u8282</a>\u3002\u4e0b\u9762\u8fd9\u4e2a\u591a\u6001\u51fd\u6570 <code class=\"function\">make_array</code> \u4f1a\u6839\u636e\u4e24\u4e2a\u4efb\u610f\u6570\u636e\u7c7b\u578b\u7684\u5143\u7d20\u6784\u9020\u4e00\u4e2a\u6570\u7ec4\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION make_array(anyelement, anyelement) RETURNS anyarray AS $$\n    SELECT ARRAY[$1, $2];\n$$ LANGUAGE SQL;\n\nSELECT make_array(1, 2) AS intarray, make_array('a'::text, 'b') AS textarray;\n intarray | textarray\n----------+-----------\n {1,2}    | {a,b}\n(1 row)\n</pre>\n<p lang=\"zh\">\u6ce8\u610f\u7c7b\u578b\u8f6c\u6362<code class=\"literal\">'a'::text</code>\u7684\u4f7f\u7528\u662f\u4e3a\u4e86\u6307\u5b9a\u8be5\u53c2\u6570\u7684\u7c7b\u578b\u662f<code class=\"type\">text</code>\u3002\u5982\u679c\u8be5\u53c2\u6570\u53ea\u662f\u4e00\u4e2a\u5b57\u7b26\u4e32\u5b57\u9762\u91cf\uff0c\u8fd9\u5c31\u662f\u5fc5\u987b\u7684\uff0c\u56e0\u4e3a\u5426\u5219\u5b83\u4f1a\u88ab\u5f53\u4f5c<code class=\"type\">unknown</code>\u7c7b\u578b\uff0c\u5e76\u4e14 <code class=\"type\">unknown</code>\u7684\u6570\u7ec4\u4e5f\u4e0d\u662f\u4e00\u79cd\u5408\u6cd5\u7684\u7c7b\u578b\u3002\u5982\u679c\u6ca1\u6709\u8be5\u7c7b\u578b\u8f6c\u6362\uff0c\u5c06\u5f97\u5230\u8fd9\u6837\u7684\u9519\u8bef\uff1a</p>\n<pre class=\"screen\"><code class=\"computeroutput\">\nERROR:  could not determine polymorphic type because input has type \"unknown\"\n</code>\n</pre>\n<p lang=\"zh\">\u5141\u8bb8\u5b58\u5728\u5177\u6709\u56fa\u5b9a\u8fd4\u56de\u7c7b\u578b\u7684\u591a\u6001\u53c2\u6570\uff0c\u4f46\u53cd\u8fc7\u6765\u5219\u4e0d\u5141\u8bb8\u3002\u4f8b\u5982\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION is_greater(anyelement, anyelement) RETURNS boolean AS $$\n    SELECT $1 &gt; $2;\n$$ LANGUAGE SQL;\n\nSELECT is_greater(1, 2);\n is_greater\n------------\n f\n(1 row)\n\nCREATE FUNCTION invalid_func() RETURNS anyelement AS $$\n    SELECT 1;\n$$ LANGUAGE SQL;\nERROR:  cannot determine result data type\nDETAIL:  A function returning a polymorphic type must have at least one polymorphic argument.\n</pre>\n<p lang=\"zh\">\u591a\u6001\u4e5f\u53ef\u4ee5\u548c\u5e26\u8f93\u51fa\u53c2\u6570\u7684\u51fd\u6570\u4e00\u8d77\u4f7f\u7528\u3002\u4f8b\u5982\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION dup (f1 anyelement, OUT f2 anyelement, OUT f3 anyarray)\nAS 'select $1, array[$1,$1]' LANGUAGE SQL;\n\nSELECT * FROM dup(22);\n f2 |   f3\n----+---------\n 22 | {22,22}\n(1 row)\n</pre>\n<p lang=\"zh\">\u591a\u6001\u4e5f\u53ef\u4ee5\u7528\u4e8e\u53ef\u53d8\u53c2\u6570\u51fd\u6570\u3002\u4f8b\u5982\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION anyleast (VARIADIC anyarray) RETURNS anyelement AS $$\n    SELECT min($1[i]) FROM generate_subscripts($1, 1) g(i);\n$$ LANGUAGE SQL;\n\nSELECT anyleast(10, -1, 5, 4);\n anyleast \n----------\n       -1\n(1 row)\n\nSELECT anyleast('abc'::text, 'def');\n anyleast \n----------\n abc\n(1 row)\n\nCREATE FUNCTION concat_values(text, VARIADIC anyarray) RETURNS text AS $$\n    SELECT array_to_string($2, $1);\n$$ LANGUAGE SQL;\n\nSELECT concat_values('|', 1, 4, 2);\n concat_values \n---------------\n 1|4|2\n(1 row)\n</pre>\n</div>\n<div class=\"sect2\" id=\"id-1.8.3.8.19\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/11/xfunc-sql.html#id-1.8.3.8.19\">38.5.11. \u5e26\u6709\u6392\u5e8f\u89c4\u5219\u7684<acronym class=\"acronym\">SQL</acronym>\u51fd\u6570</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\">\u5f53\u4e00\u4e2a SQL \u51fd\u6570\u6709\u4e00\u4e2a\u6216\u591a\u4e2a\u652f\u6301\u6392\u5e8f\u89c4\u5219\u7684\u6570\u636e\u7c7b\u578b\u53c2\u6570\u65f6\uff0c\u4f1a\u6839\u636e\u5b9e\u53c2\u6240\u5e26\u7684\u6392\u5e8f\u89c4\u5219\uff0c\u4e3a\u6bcf\u6b21\u51fd\u6570\u8c03\u7528\u786e\u5b9a\u4e00\u4e2a\u6392\u5e8f\u89c4\u5219\uff0c\u8be6\u89c1<a class=\"xref\" href=\"/docs/11/collation.html\" title=\"23.2.\u00a0\u6392\u5e8f\u89c4\u5219\u652f\u6301\">\u7b2c\u00a023.2\u00a0\u8282</a>\u3002\u5982\u679c\u80fd\u591f\u6210\u529f\u786e\u5b9a\uff08\u4e5f\u5c31\u662f\u8bf4\uff0c\u53c2\u6570\u4e4b\u95f4\u4e0d\u5b58\u5728\u9690\u5f0f\u6392\u5e8f\u89c4\u5219\u51b2\u7a81\uff09\uff0c\u90a3\u4e48\u6240\u6709\u652f\u6301\u6392\u5e8f\u89c4\u5219\u7684\u53c2\u6570\u90fd\u4f1a\u88ab\u89c6\u4e3a\u9690\u5f0f\u5e26\u6709\u8be5\u6392\u5e8f\u89c4\u5219\u3002\u8fd9\u4f1a\u5f71\u54cd\u51fd\u6570\u4e2d\u5bf9\u6392\u5e8f\u89c4\u5219\u654f\u611f\u7684\u64cd\u4f5c\u7684\u884c\u4e3a\u3002\u4f8b\u5982\uff0c\u4f7f\u7528\u4e0a\u6587\u7684 <code class=\"function\">anyleast</code> \u51fd\u6570\u65f6\uff0c</p>\n<pre class=\"programlisting\">SELECT anyleast('abc'::text, 'ABC');\n</pre>\n<p lang=\"zh\">\u7684\u7ed3\u679c\u5c06\u53d6\u51b3\u4e8e\u6570\u636e\u5e93\u7684\u9ed8\u8ba4\u6392\u5e8f\u89c4\u5219\u3002\u5728 <code class=\"literal\">C</code> \u533a\u57df\u8bbe\u7f6e\u4e0b\uff0c\u7ed3\u679c\u4f1a\u662f <code class=\"literal\">ABC</code>\uff0c\u4f46\u5728\u8bb8\u591a\u5176\u4ed6\u533a\u57df\u8bbe\u7f6e\u4e0b\u5219\u4f1a\u662f <code class=\"literal\">abc</code>\u3002\u53ef\u4ee5\u5728\u4efb\u610f\u53c2\u6570\u4e0a\u6dfb\u52a0 <code class=\"literal\">COLLATE</code> \u5b50\u53e5\u6765\u5f3a\u5236\u6307\u5b9a\u8981\u4f7f\u7528\u7684\u6392\u5e8f\u89c4\u5219\uff0c\u4f8b\u5982\uff1a</p>\n<pre class=\"programlisting\">SELECT anyleast('abc'::text, 'ABC' COLLATE \"C\");\n</pre>\n<p lang=\"zh\">\u53e6\u5916\uff0c\u5982\u679c\u4f60\u5e0c\u671b\u67d0\u4e2a\u51fd\u6570\u65e0\u8bba\u4ee5\u4ec0\u4e48\u6392\u5e8f\u89c4\u5219\u8c03\u7528\uff0c\u90fd\u59cb\u7ec8\u6309\u7279\u5b9a\u6392\u5e8f\u89c4\u5219\u5de5\u4f5c\uff0c\u53ef\u4ee5\u5728\u51fd\u6570\u5b9a\u4e49\u4e2d\u6309\u9700\u63d2\u5165 <code class=\"literal\">COLLATE</code> \u5b50\u53e5\u3002\u4e0b\u9762\u8fd9\u4e2a\u7248\u672c\u7684 <code class=\"function\">anyleast</code> \u5c06\u59cb\u7ec8\u4f7f\u7528 <code class=\"literal\">en_US</code> \u533a\u57df\u8bbe\u7f6e\u6765\u6bd4\u8f83\u5b57\u7b26\u4e32\uff1a</p>\n<pre class=\"programlisting\">CREATE FUNCTION anyleast (VARIADIC anyarray) RETURNS anyelement AS $$\n    SELECT min($1[i] COLLATE \"en_US\") FROM generate_subscripts($1, 1) g(i);\n$$ LANGUAGE SQL;\n</pre>\n<p lang=\"zh\">\u4f46\u8bf7\u6ce8\u610f\uff0c\u5982\u679c\u628a\u5b83\u7528\u4e8e\u4e0d\u652f\u6301\u6392\u5e8f\u89c4\u5219\u7684\u6570\u636e\u7c7b\u578b\uff0c\u5c31\u4f1a\u629b\u51fa\u9519\u8bef\u3002</p>\n<p lang=\"zh\">\u5982\u679c\u65e0\u6cd5\u5728\u5b9e\u53c2\u4e4b\u95f4\u786e\u5b9a\u5171\u540c\u7684\u6392\u5e8f\u89c4\u5219\uff0c\u90a3\u4e48 SQL \u51fd\u6570\u4f1a\u628a\u53c2\u6570\u89c6\u4e3a\u5e26\u6709\u5176\u6570\u636e\u7c7b\u578b\u7684\u9ed8\u8ba4\u6392\u5e8f\u89c4\u5219\uff08\u901a\u5e38\u662f\u6570\u636e\u5e93\u7684\u9ed8\u8ba4\u6392\u5e8f\u89c4\u5219\uff0c\u4f46\u5bf9\u57df\u7c7b\u578b\u53c2\u6570\u6765\u8bf4\u4e5f\u53ef\u80fd\u4e0d\u540c\uff09\u3002</p>\n<p lang=\"zh\">\u8fd9\u79cd\u652f\u6301\u6392\u5e8f\u89c4\u5219\u7684\u53c2\u6570\u7684\u884c\u4e3a\uff0c\u53ef\u4ee5\u770b\u4f5c\u662f\u4ec5\u9002\u7528\u4e8e\u6587\u672c\u6570\u636e\u7c7b\u578b\u7684\u4e00\u79cd\u53d7\u9650\u591a\u6001\u5f62\u5f0f\u3002</p>\n</div>\n</div>", "manual_path": "/docs/11/xfunc-sql.html", "localization": {"status": "complete", "sources": [{"url": "/docs/11/xfunc-sql.html", "method": "same-major semantic node", "sha256": "8129a32a76f52fb0f01153d5eee348ba8bed5b66492d51507b4dcb60079ae53b", "language": "zh", "matched_nodes": ["#XFUNC-SQL/div[10]/p[2]", "#XFUNC-SQL/div[10]/p[3]", "#XFUNC-SQL/div[10]/p[4]", "#XFUNC-SQL/div[10]/p[5]", "#XFUNC-SQL/div[10]/p[6]", "#XFUNC-SQL/div[10]/p[8]", "#XFUNC-SQL/div[11]/p[10]", "#XFUNC-SQL/div[11]/p[12]", "#XFUNC-SQL/div[11]/p[13]", "#XFUNC-SQL/div[11]/p[15]", "#XFUNC-SQL/div[11]/p[17]", "#XFUNC-SQL/div[11]/p[19]", "#XFUNC-SQL/div[11]/p[1]", "#XFUNC-SQL/div[11]/p[3]", "#XFUNC-SQL/div[11]/p[4]", "#XFUNC-SQL/div[11]/p[6]", "#XFUNC-SQL/div[11]/p[8]", "#XFUNC-SQL/div[12]/div[12]/ul[0]/li[0]", "#XFUNC-SQL/div[12]/div[12]/ul[0]/li[1]", "#XFUNC-SQL/div[12]/p[10]", "#XFUNC-SQL/div[12]/p[11]", "#XFUNC-SQL/div[12]/p[13]", "#XFUNC-SQL/div[12]/p[15]", "#XFUNC-SQL/div[12]/p[16]", "#XFUNC-SQL/div[12]/p[18]", "#XFUNC-SQL/div[12]/p[1]", "#XFUNC-SQL/div[12]/p[20]", "#XFUNC-SQL/div[12]/p[21]", "#XFUNC-SQL/div[12]/p[23]", "#XFUNC-SQL/div[12]/p[25]", "#XFUNC-SQL/div[12]/p[27]", "#XFUNC-SQL/div[12]/p[28]", "#XFUNC-SQL/div[12]/p[3]", "#XFUNC-SQL/div[12]/p[5]", "#XFUNC-SQL/div[12]/p[6]", "#XFUNC-SQL/div[12]/p[8]", "#XFUNC-SQL/div[13]/p[11]", "#XFUNC-SQL/div[13]/p[2]", "#XFUNC-SQL/div[13]/p[4]", "#XFUNC-SQL/div[13]/p[6]", "#XFUNC-SQL/div[13]/p[8]", "#XFUNC-SQL/div[13]/p[9]", "#XFUNC-SQL/div[14]/p[10]", "#XFUNC-SQL/div[14]/p[11]", "#XFUNC-SQL/div[14]/p[13]", "#XFUNC-SQL/div[14]/p[14]", "#XFUNC-SQL/div[14]/p[16]", "#XFUNC-SQL/div[14]/p[3]", "#XFUNC-SQL/div[14]/p[5]", "#XFUNC-SQL/div[14]/p[7]", "#XFUNC-SQL/div[14]/p[8]", "#XFUNC-SQL/div[15]/p[2]", "#XFUNC-SQL/div[15]/p[3]", "#XFUNC-SQL/div[15]/p[5]", "#XFUNC-SQL/div[16]/p[1]", "#XFUNC-SQL/div[16]/p[2]", "#XFUNC-SQL/div[16]/p[4]", "#XFUNC-SQL/div[16]/p[5]", "#XFUNC-SQL/div[17]/div[28]/p[1]", "#XFUNC-SQL/div[17]/div[29]/p[1]", "#XFUNC-SQL/div[17]/div[29]/p[3]", "#XFUNC-SQL/div[17]/div[29]/p[5]", "#XFUNC-SQL/div[17]/p[10]", "#XFUNC-SQL/div[17]/p[12]", "#XFUNC-SQL/div[17]/p[13]", "#XFUNC-SQL/div[17]/p[15]", "#XFUNC-SQL/div[17]/p[16]", "#XFUNC-SQL/div[17]/p[18]", "#XFUNC-SQL/div[17]/p[20]", "#XFUNC-SQL/div[17]/p[21]", "#XFUNC-SQL/div[17]/p[22]", "#XFUNC-SQL/div[17]/p[24]", "#XFUNC-SQL/div[17]/p[25]", "#XFUNC-SQL/div[17]/p[2]", "#XFUNC-SQL/div[17]/p[3]", "#XFUNC-SQL/div[17]/p[5]", "#XFUNC-SQL/div[17]/p[7]", "#XFUNC-SQL/div[17]/p[9]", "#XFUNC-SQL/div[18]/p[2]", "#XFUNC-SQL/div[18]/p[3]", "#XFUNC-SQL/div[18]/p[5]", "#XFUNC-SQL/div[19]/p[1]", "#XFUNC-SQL/div[19]/p[3]", "#XFUNC-SQL/div[19]/p[5]", "#XFUNC-SQL/div[19]/p[7]", "#XFUNC-SQL/div[19]/p[9]", "#XFUNC-SQL/div[1]/dl[0]/dt[0]", "#XFUNC-SQL/div[1]/dl[0]/dt[10]", "#XFUNC-SQL/div[1]/dl[0]/dt[1]", "#XFUNC-SQL/div[1]/dl[0]/dt[2]", "#XFUNC-SQL/div[1]/dl[0]/dt[3]", "#XFUNC-SQL/div[1]/dl[0]/dt[4]", "#XFUNC-SQL/div[1]/dl[0]/dt[5]", "#XFUNC-SQL/div[1]/dl[0]/dt[6]", "#XFUNC-SQL/div[1]/dl[0]/dt[7]", "#XFUNC-SQL/div[1]/dl[0]/dt[8]", "#XFUNC-SQL/div[1]/dl[0]/dt[9]", "#XFUNC-SQL/div[20]/p[10]", "#XFUNC-SQL/div[20]/p[2]", "#XFUNC-SQL/div[20]/p[4]", "#XFUNC-SQL/div[20]/p[6]", "#XFUNC-SQL/div[20]/p[8]", "#XFUNC-SQL/div[20]/p[9]", "#XFUNC-SQL/div[8]/h3[0]", "#XFUNC-SQL/div[8]/p[1]", "#XFUNC-SQL/p[3]", "#XFUNC-SQL/p[4]", "#XFUNC-SQL/p[5]", "#XFUNC-SQL/p[6]", "#XFUNC-SQL/p[9]"]}], "language": "zh", "original_text": {"/versions/11/description/0": "SQL-language functions", "/versions/11/facts/0/label": "Kind", "/versions/11/facts/0/value": "Native function language", "/versions/11/facts/1/label": "Trusted", "/versions/11/facts/2/label": "Validator"}, "fallback_fields": [], "source_language": "en", "original_snapshot_sha256": "cc117a5455484c5caa53bbe3eb2d780f5bad9649ff257ef9b66e964703929056"}, "comparison_data": {"kind": "Native function language", "handler": "", "trusted": "t", "validator": "fmgr_sql_validator"}, "comparison_hash": "a4af9cf453d140d941e865b952c6a41e2b704a4b30cb77b61c1cdda8a77c5035", "manual_language": "zh"}, "12": {"facts": [{"label": "\u79cd\u7c7b", "value": "\u539f\u751f\u51fd\u6570\u8bed\u8a00"}, {"label": "\u53ef\u4fe1", "value": "t"}, {"label": "\u6821\u9a8c\u51fd\u6570", "value": "fmgr_sql_validator"}], "tables": [], "aliases": [], "catalog": {"oid": "14", "descr": "SQL-language functions", "lanacl": "_null_", "lanispl": "f", "lanname": "sql", "lanowner": "PGUID", "laninline": "0", "oid_symbol": "SQLlanguageId", "lanpltrusted": "t", "lanvalidator": "fmgr_sql_validator", "lanplcallfoid": "0"}, "related": [], "release": {"ref": "https://ftp.postgresql.org/pub/source/v12.22/postgresql-12.22.tar.bz2", "label": "12.22", "major": "12", "channel": "historical", "revision": "8df3c0474782589d3c6f374b5133b1bd14d168086edbc13c6e72e67dd4527a3b", "source_sha256": "8df3c0474782589d3c6f374b5133b1bd14d168086edbc13c6e72e67dd4527a3b", "catalog_fingerprint": "9f857f4ee4875f9c7de6bfc9df4b757dec8b3a0bb88eadb519c7bd267bd56149"}, "sources": [{"url": "https://ftp.postgresql.org/pub/source/v12.22/postgresql-12.22.tar.bz2", "label": "Matching PostgreSQL source archive", "sha256": "8df3c0474782589d3c6f374b5133b1bd14d168086edbc13c6e72e67dd4527a3b"}, {"url": "https://pg.center/docs/12/xfunc-sql.html", "path": "xfunc-sql.html", "label": "PostgreSQL 12 English manual", "sha256": "3aca7a20866829dfd2e7712fbb955fad2241ce842d2d1812b40ddb686c71a944", "language": "en", "original_url": "/docs/12/xfunc-sql.html"}], "sections": [], "signature": "", "attributes": {"kind": "Native function language", "handler": "", "trusted": "t", "validator": "fmgr_sql_validator"}, "description": ["SQL \u8bed\u8a00\u51fd\u6570"], "manual_html": "<div class=\"sect1\" id=\"XFUNC-SQL\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h2 class=\"title\" lang=\"zh\">37.5. \u67e5\u8be2\u8bed\u8a00\uff08SQL\uff09\u51fd\u6570</h2>\n</div>\n</div>\n</div>\n<p lang=\"zh\">SQL \u51fd\u6570\u6267\u884c\u7531\u4efb\u610f SQL \u8bed\u53e5\u7ec4\u6210\u7684\u4e00\u4e2a\u5217\u8868\uff0c\u5e76\u8fd4\u56de\u5217\u8868\u4e2d\u6700\u540e\u4e00\u4e2a\u67e5\u8be2\u7684\u7ed3\u679c\u3002\u5728\u7b80\u5355\uff08\u975e\u96c6\u5408\uff09\u60c5\u51b5\u4e0b\uff0c\u5c06\u8fd4\u56de\u6700\u540e\u4e00\u4e2a\u67e5\u8be2\u7ed3\u679c\u7684\u7b2c\u4e00\u884c\u3002\uff08\u8bf7\u8bb0\u4f4f\uff0c\u9664\u975e\u4f7f\u7528 <code class=\"literal\">ORDER BY</code>\uff0c\u5426\u5219\u591a\u884c\u7ed3\u679c\u4e2d\u7684<span class=\"quote\">\u201c<span class=\"quote\">\u7b2c\u4e00\u884c</span>\u201d</span>\u5e76\u6ca1\u6709\u660e\u786e\u5b9a\u4e49\u3002\uff09\u5982\u679c\u6700\u540e\u4e00\u4e2a\u67e5\u8be2\u5b8c\u5168\u6ca1\u6709\u8fd4\u56de\u4efb\u4f55\u884c\uff0c\u5219\u8fd4\u56de\u7a7a\u503c\u3002</p>\n<p lang=\"zh\">\u6216\u8005\uff0c\u4e00\u4e2a SQL \u51fd\u6570\u53ef\u4ee5\u901a\u8fc7\u6307\u5b9a\u51fd\u6570\u7684\u8fd4\u56de\u7c7b\u578b\u4e3a<code class=\"literal\">SETOF <em class=\"replaceable\"><code>sometype</code></em></code>\u88ab\u58f0\u660e\u4e3a\u8fd4\u56de\u4e00\u4e2a\u96c6\u5408\uff08\u4e5f\u5c31\u662f\u591a\u4e2a\u884c\uff09\uff0c\u6216\u8005\u7b49\u6548\u5730\u58f0\u660e\u5b83\u4e3a<code class=\"literal\">RETURNS TABLE(<em class=\"replaceable\"><code>columns</code></em>)</code>\u3002\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b\uff0c\u6700\u540e\u4e00\u4e2a\u67e5\u8be2\u7684\u7ed3\u679c\u7684\u6240\u6709\u884c\u4f1a\u88ab\u8fd4\u56de\u3002\u4e0b\u6587\u5c06\u7ed9\u51fa\u8fdb\u4e00\u6b65\u7684\u7ec6\u8282\u3002</p>\n<p lang=\"zh\">SQL \u51fd\u6570\u7684\u51fd\u6570\u4f53\u5fc5\u987b\u662f\u4e00\u4e2a\u7531\u5206\u53f7\u5206\u9694\u7684 SQL \u8bed\u53e5\u5217\u8868\u3002\u6700\u540e\u4e00\u6761\u8bed\u53e5\u540e\u7684\u5206\u53f7\u662f\u53ef\u9009\u7684\u3002\u9664\u975e\u8be5\u51fd\u6570\u88ab\u58f0\u660e\u4e3a\u8fd4\u56de <code class=\"type\">void</code>\uff0c\u5426\u5219\u6700\u540e\u4e00\u6761\u8bed\u53e5\u5fc5\u987b\u662f <code class=\"command\">SELECT</code>\uff0c\u6216\u8005\u662f <code class=\"command\">INSERT</code>\u3001<code class=\"command\">UPDATE</code> \u6216 <code class=\"command\">DELETE</code> \u5e76\u5e26\u6709 <code class=\"literal\">RETURNING</code> \u5b50\u53e5\u3002</p>\n<p lang=\"zh\">\u4efb\u610f\u4e00\u7ec4 <acronym class=\"acronym\">SQL</acronym> \u8bed\u8a00\u547d\u4ee4\u90fd\u53ef\u4ee5\u6253\u5305\u5e76\u5b9a\u4e49\u6210\u51fd\u6570\u3002\u9664 <code class=\"command\">SELECT</code> \u67e5\u8be2\u5916\uff0c\u8fd9\u4e9b\u547d\u4ee4\u8fd8\u53ef\u4ee5\u5305\u542b\u6570\u636e\u4fee\u6539\u67e5\u8be2\uff08<code class=\"command\">INSERT</code>\uff0c<code class=\"command\">UPDATE</code>\u3001<code class=\"command\">DELETE</code>\uff09\uff0c\u4ee5\u53ca\u5176\u4ed6 SQL \u547d\u4ee4\u3002\uff08\u4e0d\u80fd\u4f7f\u7528\u4e8b\u52a1\u63a7\u5236\u547d\u4ee4\uff0c\u4f8b\u5982 <code class=\"command\">COMMIT</code>\uff0c<code class=\"command\">SAVEPOINT</code>\uff0c\u4ee5\u53ca\u67d0\u4e9b\u5de5\u5177\u547d\u4ee4\uff0c\u4f8b\u5982 <code class=\"literal\">VACUUM</code>\uff0c\u6765\u7f16\u5199 <acronym class=\"acronym\">SQL</acronym> \u51fd\u6570\u3002\uff09\u4e0d\u8fc7\uff0c\u6700\u540e\u4e00\u6761\u547d\u4ee4\u5fc5\u987b\u662f <code class=\"command\">SELECT</code>\uff0c\u6216\u8005\u5e26\u6709 <code class=\"literal\">RETURNING</code> \u5b50\u53e5\uff0c\u5e76\u8fd4\u56de\u4e0e\u51fd\u6570\u58f0\u660e\u8fd4\u56de\u7c7b\u578b\u76f8\u7b26\u7684\u7ed3\u679c\u3002\u6216\u8005\uff0c\u5982\u679c\u4f60\u60f3\u5b9a\u4e49\u4e00\u4e2a\u6267\u884c\u52a8\u4f5c\u4f46\u6ca1\u6709\u6709\u7528\u8fd4\u56de\u503c\u7684 SQL \u51fd\u6570\uff0c\u4e5f\u53ef\u4ee5\u628a\u5b83\u5b9a\u4e49\u4e3a\u8fd4\u56de <code class=\"type\">void</code>\u3002\u4f8b\u5982\uff0c\u4e0b\u9762\u8fd9\u4e2a\u51fd\u6570\u4f1a\u5220\u9664 <code class=\"literal\">emp</code> \u8868\u4e2d\u85aa\u8d44\u4e3a\u8d1f\u7684\u884c\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION clean_emp() RETURNS void AS '\n    DELETE FROM emp\n        WHERE salary &lt; 0;\n' LANGUAGE SQL;\n\nSELECT clean_emp();\n\n clean_emp\n-----------\n\n(1 row)\n</pre>\n<div class=\"note\">\n<h3 class=\"title\" lang=\"zh\">\u6ce8\u610f</h3>\n<p lang=\"zh\">SQL \u51fd\u6570\u7684\u6574\u4e2a\u51fd\u6570\u4f53\u90fd\u4f1a\u5148\u7ecf\u8fc7\u89e3\u6790\uff0c\u7136\u540e\u624d\u5f00\u59cb\u6267\u884c\u3002\u867d\u7136 SQL \u51fd\u6570\u53ef\u4ee5\u5305\u542b\u4fee\u6539\u7cfb\u7edf\u76ee\u5f55\u7684\u547d\u4ee4\uff08\u4f8b\u5982 <code class=\"command\">CREATE TABLE</code>\uff09\uff0c\u4f46\u5728\u5bf9\u51fd\u6570\u4e2d\u7684\u540e\u7eed\u547d\u4ee4\u8fdb\u884c\u89e3\u6790\u5206\u6790\u65f6\uff0c\u8fd9\u4e9b\u547d\u4ee4\u7684\u6548\u679c\u8fd8\u4e0d\u53ef\u89c1\u3002\u56e0\u6b64\uff0c\u4f8b\u5982\u5c06 <code class=\"literal\">CREATE TABLE foo (...); INSERT INTO foo VALUES(...);</code> \u6253\u5305\u5230\u540c\u4e00\u4e2a SQL \u51fd\u6570\u4e2d\uff0c\u5c31\u4e0d\u4f1a\u6309\u9884\u671f\u5de5\u4f5c\uff0c\u56e0\u4e3a <code class=\"structname\">foo</code> \u5728\u89e3\u6790 <code class=\"command\">INSERT</code> \u547d\u4ee4\u65f6\u8fd8\u4e0d\u5b58\u5728\u3002\u5728\u8fd9\u7c7b\u60c5\u51b5\u4e0b\uff0c\u5efa\u8bae\u4f7f\u7528 <span class=\"application\">PL/pgSQL</span> \u800c\u4e0d\u662f SQL \u51fd\u6570\u3002</p>\n</div>\n<p lang=\"zh\"><code class=\"command\">CREATE FUNCTION</code> \u547d\u4ee4\u7684\u8bed\u6cd5\u8981\u6c42\u628a\u51fd\u6570\u4f53\u5199\u6210\u4e00\u4e2a\u5b57\u7b26\u4e32\u5e38\u91cf\u3002\u5bf9\u4e8e\u5b57\u7b26\u4e32\u5e38\u91cf\uff0c\u901a\u5e38\u4f7f\u7528\u7f8e\u5143\u5f15\u7528\u6700\u65b9\u4fbf\uff08\u89c1<a class=\"xref\" href=\"/docs/12/sql-syntax.html#SQL-SYNTAX-DOLLAR-QUOTING\" title=\"4.1.2.4.\u00a0\u7f8e\u5143\u5f15\u7528\u7684\u5b57\u7b26\u4e32\u5e38\u91cf\">\u7b2c\u00a04.1.2.4\u00a0\u8282</a>\uff09\u3002\u5982\u679c\u4f60\u9009\u62e9\u4f7f\u7528\u5e38\u89c4\u7684\u5355\u5f15\u53f7\u5b57\u7b26\u4e32\u5e38\u91cf\u8bed\u6cd5\uff0c\u90a3\u4e48\u5fc5\u987b\u5728\u51fd\u6570\u4f53\u4e2d\u5c06\u5355\u5f15\u53f7\uff08<code class=\"literal\">'</code>\uff09\u548c\u53cd\u659c\u7ebf\uff08<code class=\"literal\">\\</code>\uff09\u5199\u6210\u53cc\u4efd\uff08\u5047\u5b9a\u4f7f\u7528\u8f6c\u4e49\u5b57\u7b26\u4e32\u8bed\u6cd5\uff0c\u89c1<a class=\"xref\" href=\"/docs/12/sql-syntax.html#SQL-SYNTAX-STRINGS\" title=\"4.1.2.1.\u00a0\u5b57\u7b26\u4e32\u5e38\u91cf\">\u7b2c\u00a04.1.2.1\u00a0\u8282</a>\uff09\u3002</p>\n<div class=\"sect2\" id=\"XFUNC-SQL-FUNCTION-ARGUMENTS\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/12/xfunc-sql.html#XFUNC-SQL-FUNCTION-ARGUMENTS\">37.5.1. <acronym class=\"acronym\">SQL</acronym>\u51fd\u6570\u7684\u53c2\u6570</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\">\u4e00\u4e2a SQL \u51fd\u6570\u7684\u53c2\u6570\u53ef\u4ee5\u5728\u51fd\u6570\u4f53\u4e2d\u7528\u540d\u79f0\u6216\u7f16\u53f7\u5f15\u7528\u3002\u4e0b\u9762\u4f1a\u6709\u4e24\u79cd\u65b9\u6cd5\u7684\u793a\u4f8b\u3002</p>\n<p lang=\"zh\">\u8981\u4f7f\u7528\u4e00\u4e2a\u540d\u79f0\uff0c\u5c06\u51fd\u6570\u53c2\u6570\u58f0\u660e\u4e3a\u5e26\u6709\u4e00\u4e2a\u540d\u79f0\uff0c\u7136\u540e\u5728\u51fd\u6570\u4f53\u4e2d\u53ea\u5199\u8be5\u540d\u79f0\u3002\u5982\u679c\u53c2\u6570\u540d\u79f0\u4e0e\u51fd\u6570\u5185\u5f53\u524d SQL \u547d\u4ee4\u4e2d\u7684\u4efb\u610f\u5217\u540d\u76f8\u540c\uff0c\u5217\u540d\u5c06\u4f18\u5148\u3002\u5982\u679c\u4e0d\u60f3\u8fd9\u6837\uff0c\u53ef\u4ee5\u7528\u51fd\u6570\u672c\u8eab\u7684\u540d\u79f0\u6765\u9650\u5b9a\u53c2\u6570\u540d\uff0c\u4e5f\u5c31\u662f<code class=\"literal\"><em class=\"replaceable\"><code>function_name</code></em>.<em class=\"replaceable\"><code>argument_name</code></em></code>\uff08\u5982\u679c\u8fd9\u4f1a\u4e0e\u4e00\u4e2a\u88ab\u9650\u5b9a\u7684\u5217\u540d\u51b2\u7a81\uff0c\u7167\u4f8b\u8fd8\u662f\u5217\u540d\u8d62\u5f97\u4f18\u5148\u3002\u4f60\u53ef\u4ee5\u901a\u8fc7\u4e3a SQL \u547d\u4ee4\u4e2d\u7684\u8868\u9009\u62e9\u4e00\u4e2a\u4e0d\u540c\u7684\u522b\u540d\u6765\u907f\u514d\u8fd9\u79cd\u6df7\u6dc6\uff09\u3002</p>\n<p lang=\"zh\">\u5728\u66f4\u65e7\u7684\u6570\u5b57\u65b9\u6cd5\u4e2d\uff0c\u53c2\u6570\u53ef\u4ee5\u7528\u8bed\u6cd5<code class=\"literal\">$<em class=\"replaceable\"><code>n</code></em></code>\u5f15\u7528\uff1a<code class=\"literal\">$1</code>\u6307\u7684\u662f\u7b2c\u4e00\u4e2a\u8f93\u5165\u53c2\u6570\uff0c<code class=\"literal\">$2</code>\u6307\u7684\u662f\u7b2c\u4e8c\u4e2a\uff0c\u4ee5\u6b64\u7c7b\u63a8\u3002\u4e0d\u7ba1\u7279\u5b9a\u7684\u53c2\u6570\u662f\u5426\u4f7f\u7528\u540d\u79f0\u58f0\u660e\uff0c\u8fd9\u79cd\u65b9\u6cd5\u90fd\u6709\u6548\u3002</p>\n<p lang=\"zh\">\u5982\u679c\u4e00\u4e2a\u53c2\u6570\u662f\u4e00\u79cd\u590d\u5408\u7c7b\u578b\uff0c\u90a3\u4e48\u70b9\u53f7\u8bb0\u6cd5\uff08\u5982 <code class=\"literal\"><em class=\"replaceable\"><code>argname</code></em>.<em class=\"replaceable\"><code>fieldname</code></em></code> \u6216<code class=\"literal\">$1.<em class=\"replaceable\"><code>fieldname</code></em></code>\uff09\u4e5f\u53ef\u4ee5\u88ab\u7528\u6765\u8bbf\u95ee\u8be5\u53c2\u6570\u7684\u5c5e\u6027\u3002\u540c\u6837\uff0c\u4f60\u53ef\u80fd\u9700\u8981\u7528\u51fd\u6570\u7684\u540d\u79f0\u6765\u9650\u5b9a\u53c2\u6570\u7684\u540d\u79f0\u4ee5\u907f\u514d\u6b67\u4e49\u3002</p>\n<p lang=\"zh\">SQL \u51fd\u6570\u53c2\u6570\u53ea\u80fd\u88ab\u7528\u505a\u6570\u636e\u503c\u800c\u4e0d\u80fd\u4f5c\u4e3a\u6807\u8bc6\u7b26\u3002\u4f8b\u5982\u8fd9\u662f\u5408\u7406\u7684\uff1a</p>\n<pre class=\"programlisting\">INSERT INTO mytable VALUES ($1);\n</pre>\n<p lang=\"zh\">\u4f46\u8fd9\u6837\u5c31\u4e0d\u884c\uff1a</p>\n<pre class=\"programlisting\">INSERT INTO $1 VALUES (42);\n</pre>\n<div class=\"note\">\n<h3 class=\"title\" lang=\"zh\">\u6ce8\u610f</h3>\n<p lang=\"zh\">PostgreSQL 9.2 \u5f00\u59cb\u652f\u6301\u901a\u8fc7\u540d\u79f0\u5f15\u7528 SQL \u51fd\u6570\u53c2\u6570\u3002\u9700\u8981\u7528\u4e8e\u66f4\u65e9\u7248\u672c\u670d\u52a1\u5668\u7684\u51fd\u6570\u5fc5\u987b\u4f7f\u7528 $n \u8bb0\u6cd5\u3002</p>\n</div>\n</div>\n<div class=\"sect2\" id=\"XFUNC-SQL-BASE-FUNCTIONS\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/12/xfunc-sql.html#XFUNC-SQL-BASE-FUNCTIONS\">37.5.2. \u57fa\u7840\u7c7b\u578b\u4e0a\u7684<acronym class=\"acronym\">SQL</acronym>\u51fd\u6570</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\">\u6700\u7b80\u5355\u7684 <acronym class=\"acronym\">SQL</acronym> \u51fd\u6570\u6ca1\u6709\u53c2\u6570\uff0c\u53ea\u662f\u8fd4\u56de\u4e00\u4e2a\u57fa\u7840\u7c7b\u578b\uff0c\u4f8b\u5982 <code class=\"type\">integer</code>\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION one() RETURNS integer AS $$\n    SELECT 1 AS result;\n$$ LANGUAGE SQL;\n\n-- Alternative syntax for string literal:\nCREATE FUNCTION one() RETURNS integer AS '\n    SELECT 1 AS result;\n' LANGUAGE SQL;\n\nSELECT one();\n\n one\n-----\n   1\n</pre>\n<p lang=\"zh\">\u6ce8\u610f\u6211\u4eec\u4e3a\u8be5\u51fd\u6570\u7684\u7ed3\u679c\u5728\u51fd\u6570\u4f53\u5185\u5b9a\u4e49\u4e86\u4e00\u4e2a\u5217\u522b\u540d\uff08\u540d\u4e3a<code class=\"literal\">result</code>\uff09\uff0c\u4f46\u662f\u8fd9\u4e2a\u5217\u522b\u540d\u5728\u51fd\u6570\u4ee5\u5916\u662f\u4e0d\u53ef\u89c1\u7684\u3002\u56e0\u6b64\uff0c\u7ed3\u679c\u88ab\u6807\u8bb0\u4e3a<code class=\"literal\">one</code>\u800c\u4e0d\u662f<code class=\"literal\">result</code>\u3002</p>\n<p lang=\"zh\">\u5b9a\u4e49\u63a5\u53d7\u57fa\u7840\u7c7b\u578b\u53c2\u6570\u7684 <acronym class=\"acronym\">SQL</acronym> \u51fd\u6570\u4e5f\u51e0\u4e4e\u540c\u6837\u5bb9\u6613\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION add_em(x integer, y integer) RETURNS integer AS $$\n    SELECT x + y;\n$$ LANGUAGE SQL;\n\nSELECT add_em(1, 2) AS answer;\n\n answer\n--------\n      3\n</pre>\n<p lang=\"zh\">\u6216\u8005\uff0c\u6211\u4eec\u4e5f\u53ef\u4ee5\u4e0d\u7528\u53c2\u6570\u540d\uff0c\u800c\u6539\u7528\u6570\u5b57\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION add_em(integer, integer) RETURNS integer AS $$\n    SELECT $1 + $2;\n$$ LANGUAGE SQL;\n\nSELECT add_em(1, 2) AS answer;\n\n answer\n--------\n      3\n</pre>\n<p lang=\"zh\">\u4e0b\u9762\u662f\u4e00\u4e2a\u66f4\u6709\u7528\u7684\u51fd\u6570\uff0c\u5b83\u53ef\u4ee5\u7528\u6765\u4ece\u94f6\u884c\u8d26\u6237\u4e2d\u6263\u6b3e\uff1a</p>\n<pre class=\"programlisting\">CREATE FUNCTION tf1 (accountno integer, debit numeric) RETURNS numeric AS $$\n    UPDATE bank\n        SET balance = balance - debit\n        WHERE accountno = tf1.accountno;\n    SELECT 1;\n$$ LANGUAGE SQL;\n</pre>\n<p lang=\"zh\">\u7528\u6237\u53ef\u4ee5\u8fd9\u6837\u6267\u884c\u8be5\u51fd\u6570\uff0c\u4ece 17 \u53f7\u8d26\u6237\u4e2d\u6263\u9664 $100.00\uff1a</p>\n<pre class=\"programlisting\">SELECT tf1(17, 100.0);\n</pre>\n<p lang=\"zh\">\u5728\u8fd9\u4e2a\u793a\u4f8b\u4e2d\uff0c\u6211\u4eec\u4e3a\u7b2c\u4e00\u4e2a\u53c2\u6570\u9009\u62e9\u4e86\u540d\u79f0<code class=\"literal\">accountno</code>\uff0c\u4f46\u662f\u8fd9\u548c\u8868<code class=\"literal\">bank</code>\u4e2d\u7684\u4e00\u4e2a\u5217\u540d\u76f8\u540c\u3002\u5728<code class=\"command\">UPDATE</code>\u547d\u4ee4\u4e2d\uff0c<code class=\"literal\">accountno</code>\u5f15\u7528\u5217<code class=\"literal\">bank.accountno</code>\uff0c\u56e0\u6b64 <code class=\"literal\">tf1.accountno</code>\u5fc5\u987b\u88ab\u7528\u6765\u5f15\u7528\u8be5\u53c2\u6570\u3002\u6211\u4eec\u5f53\u7136\u53ef\u4ee5\u901a\u8fc7\u4e3a\u8be5\u53c2\u6570\u4f7f\u7528\u4e00\u4e2a\u4e0d\u540c\u7684\u540d\u79f0\u6765\u907f\u514d\u8fd9\u6837\u7684\u95ee\u9898\u3002</p>\n<p lang=\"zh\">\u5b9e\u9645\u4e0a\u6211\u4eec\u53ef\u80fd\u559c\u6b22\u4ece\u8be5\u51fd\u6570\u5f97\u5230\u4e00\u4e2a\u66f4\u6709\u7528\u7684\u7ed3\u679c\u800c\u4e0d\u662f\u4e00\u4e2a\u5e38\u6570 1\uff0c\u56e0\u6b64\u4e00\u4e2a\u66f4\u53ef\u80fd\u7684\u5b9a\u4e49\u662f\uff1a</p>\n<pre class=\"programlisting\">CREATE FUNCTION tf1 (accountno integer, debit numeric) RETURNS numeric AS $$\n    UPDATE bank\n        SET balance = balance - debit\n        WHERE accountno = tf1.accountno;\n    SELECT balance FROM bank WHERE accountno = tf1.accountno;\n$$ LANGUAGE SQL;\n</pre>\n<p lang=\"zh\">\u5b83\u4f1a\u8c03\u6574\u4f59\u989d\u5e76\u4e14\u8fd4\u56de\u65b0\u7684\u4f59\u989d\u3002\u540c\u6837\u7684\u4e8b\u60c5\u4e5f\u53ef\u4ee5\u7528\u4e00\u4e2a\u4f7f\u7528<code class=\"literal\">RETURNING</code>\u7684\u547d\u4ee4\u5b9e\u73b0\uff1a</p>\n<pre class=\"programlisting\">CREATE FUNCTION tf1 (accountno integer, debit numeric) RETURNS numeric AS $$\n    UPDATE bank\n        SET balance = balance - debit\n        WHERE accountno = tf1.accountno\n    RETURNING balance;\n$$ LANGUAGE SQL;\n</pre>\n<p lang=\"zh\">\u4e00\u4e2a <acronym class=\"acronym\">SQL</acronym> \u51fd\u6570\u5fc5\u987b\u8fd4\u56de\u4e0e\u5176\u58f0\u660e\u7684\u7ed3\u679c\u7c7b\u578b\u5b8c\u5168\u4e00\u81f4\u7684\u7c7b\u578b\u3002\u8fd9\u53ef\u80fd\u9700\u8981\u63d2\u5165\u663e\u5f0f\u7c7b\u578b\u8f6c\u6362\u3002\u4f8b\u5982\uff0c\u5047\u8bbe\u6211\u4eec\u5e0c\u671b\u524d\u9762\u7684 <code class=\"function\">add_em</code> \u51fd\u6570\u6539\u4e3a\u8fd4\u56de <code class=\"type\">float8</code> \u7c7b\u578b\u3002\u4e0b\u9762\u8fd9\u6837\u662f\u4e0d\u884c\u7684\uff1a</p>\n<pre class=\"programlisting\">CREATE FUNCTION add_em(integer, integer) RETURNS float8 AS $$\n    SELECT $1 + $2;\n$$ LANGUAGE SQL;\n</pre>\n<p lang=\"zh\">\u5373\u4fbf\u5728\u5176\u4ed6\u4e0a\u4e0b\u6587\u4e2d\uff0c<span class=\"productname\">PostgreSQL</span>\u613f\u610f\u63d2\u5165\u9690\u5f0f\u7c7b\u578b\u8f6c\u6362\uff0c\u628a <code class=\"type\">integer</code> \u8f6c\u6362\u4e3a <code class=\"type\">float8</code>\u3002\u6211\u4eec\u9700\u8981\u5c06\u5b83\u5199\u6210\uff1a</p>\n<pre class=\"programlisting\">CREATE FUNCTION add_em(integer, integer) RETURNS float8 AS $$\n    SELECT ($1 + $2)::float8;\n$$ LANGUAGE SQL;\n</pre>\n</div>\n<div class=\"sect2\" id=\"XFUNC-SQL-COMPOSITE-FUNCTIONS\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/12/xfunc-sql.html#XFUNC-SQL-COMPOSITE-FUNCTIONS\">37.5.3. \u590d\u5408\u7c7b\u578b\u4e0a\u7684<acronym class=\"acronym\">SQL</acronym>\u51fd\u6570</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\">\u7f16\u5199\u63a5\u53d7\u590d\u5408\u7c7b\u578b\u53c2\u6570\u7684\u51fd\u6570\u65f6\uff0c\u6211\u4eec\u4e0d\u4ec5\u5fc5\u987b\u6307\u5b9a\u8981\u7528\u54ea\u4e2a\u53c2\u6570\uff0c\u8fd8\u5fc5\u987b\u6307\u5b9a\u8be5\u53c2\u6570\u7684\u54ea\u4e2a\u5c5e\u6027\uff08\u5b57\u6bb5\uff09\u3002\u4f8b\u5982\uff0c\u5047\u8bbe <code class=\"type\">emp</code> \u662f\u4e00\u4e2a\u5305\u542b\u96c7\u5458\u6570\u636e\u7684\u8868\uff0c\u56e0\u6b64\u5b83\u4e5f\u662f\u8be5\u8868\u6bcf\u4e00\u884c\u5bf9\u5e94\u7684\u590d\u5408\u7c7b\u578b\u540d\u79f0\u3002\u4e0b\u9762\u7684\u51fd\u6570 <code class=\"function\">double_salary</code> \u7528\u6765\u8ba1\u7b97\u67d0\u4eba\u7684\u5de5\u8d44\u7ffb\u500d\u540e\u4f1a\u662f\u591a\u5c11\uff1a</p>\n<pre class=\"screen\">CREATE TABLE emp (\n    name        text,\n    salary      numeric,\n    age         integer,\n    cubicle     point\n);\n\nINSERT INTO emp VALUES ('Bill', 4200, 45, '(2,1)');\n\nCREATE FUNCTION double_salary(emp) RETURNS numeric AS $$\n    SELECT $1.salary * 2 AS salary;\n$$ LANGUAGE SQL;\n\nSELECT name, double_salary(emp.*) AS dream\n    FROM emp\n    WHERE emp.cubicle ~= point '(2,1)';\n\n name | dream\n------+-------\n Bill |  8400\n</pre>\n<p lang=\"zh\">\u6ce8\u610f\u8fd9\u91cc\u7528 <code class=\"literal\">$1.salary</code> \u8bed\u6cd5\u6765\u9009\u53d6\u53c2\u6570\u884c\u503c\u4e2d\u7684\u4e00\u4e2a\u5b57\u6bb5\u3002\u8fd8\u8981\u6ce8\u610f\uff0c\u8c03\u7528\u65f6\u7684 <code class=\"command\">SELECT</code> \u547d\u4ee4\u4f7f\u7528 <em class=\"replaceable\"><code>table_name</code></em><code class=\"literal\">.*</code> \u5c06\u8868\u7684\u5f53\u524d\u6574\u884c\u53d6\u4f5c\u4e00\u4e2a\u590d\u5408\u503c\u3002\u8be5\u8868\u884c\u4e5f\u53ef\u4ee5\u4ec5\u7528\u8868\u540d\u6765\u5f15\u7528\uff1a</p>\n<pre class=\"screen\">SELECT name, double_salary(emp) AS dream\n    FROM emp\n    WHERE emp.cubicle ~= point '(2,1)';\n</pre>\n<p lang=\"zh\">\u4f46\u8fd9\u79cd\u7528\u6cd5\u5df2\u88ab\u5f03\u7528\uff0c\u56e0\u4e3a\u5b83\u5f88\u5bb9\u6613\u8ba9\u4eba\u6df7\u6dc6\uff08\u5173\u4e8e\u8868\u884c\u590d\u5408\u503c\u8fd9\u4e24\u79cd\u8bb0\u6cd5\u7684\u66f4\u591a\u7ec6\u8282\uff0c\u89c1<a class=\"xref\" href=\"/docs/12/rowtypes.html#ROWTYPES-USAGE\" title=\"8.16.5.\u00a0\u5728\u67e5\u8be2\u4e2d\u4f7f\u7528\u590d\u5408\u7c7b\u578b\">\u7b2c\u00a08.16.5\u00a0\u8282</a>\uff09\u3002</p>\n<p lang=\"zh\">\u6709\u65f6\u5019\u5373\u65f6\u6784\u9020\u4e00\u4e2a\u590d\u5408\u53c2\u6570\u503c\u4f1a\u5f88\u65b9\u4fbf\u3002\u8fd9\u53ef\u4ee5\u7528<code class=\"literal\">ROW</code>\u6784\u9020\u5668\u5b8c\u6210\u3002\u4f8b\u5982\uff0c\u6211\u4eec\u53ef\u4ee5\u8c03\u6574\u88ab\u4f20\u9012\u7ed9\u51fd\u6570\u7684\u6570\u636e\uff1a</p>\n<pre class=\"screen\">SELECT name, double_salary(ROW(name, salary*1.1, age, cubicle)) AS dream\n    FROM emp;\n</pre>\n<p lang=\"zh\">\u4e5f\u53ef\u4ee5\u6784\u5efa\u4e00\u4e2a\u8fd4\u56de\u590d\u5408\u7c7b\u578b\u7684\u51fd\u6570\u3002\u8fd9\u662f\u4e00\u4e2a\u8fd4\u56de\u5355\u4e00<code class=\"type\">emp</code>\u884c\u7684\u51fd\u6570\u793a\u4f8b\uff1a</p>\n<pre class=\"programlisting\">CREATE FUNCTION new_emp() RETURNS emp AS $$\n    SELECT text 'None' AS name,\n        1000.0 AS salary,\n        25 AS age,\n        point '(2,2)' AS cubicle;\n$$ LANGUAGE SQL;\n</pre>\n<p lang=\"zh\">\u5728\u8fd9\u4e2a\u793a\u4f8b\u4e2d\uff0c\u6211\u4eec\u4e3a\u6bcf\u4e00\u4e2a\u5c5e\u6027\u6307\u5b9a\u4e86\u4e00\u4e2a\u5e38\u91cf\u503c\uff0c\u4f46\u662f\u53ef\u4ee5\u7528\u4efb\u4f55\u8ba1\u7b97\u6765\u66ff\u6362\u8fd9\u4e9b\u5e38\u91cf\u3002</p>\n<p lang=\"zh\">\u5b9a\u4e49\u8be5\u51fd\u6570\u65f6\u6709\u4e24\u70b9\u91cd\u8981\u6ce8\u610f\u4e8b\u9879\uff1a</p>\n<div class=\"itemizedlist\">\n<ul class=\"itemizedlist\">\n<li class=\"listitem\" lang=\"zh\">\n<p>\u67e5\u8be2\u4e2d\u7684\u9009\u62e9\u5217\u8868\u987a\u5e8f\u5fc5\u987b\u4e0e\u5217\u5728\u8be5\u590d\u5408\u7c7b\u578b\u6240\u5173\u8054\u7684\u8868\u4e2d\u51fa\u73b0\u7684\u987a\u5e8f\u5b8c\u5168\u76f8\u540c\u3002\uff08\u7cfb\u7edf\u4e0d\u8003\u8651\u50cf\u4e0a\u9762\u8fd9\u6837\u6307\u5b9a\u7684\u5217\u540d\u3002\uff09</p>\n</li>\n<li class=\"listitem\" lang=\"zh\">\n<p>\u6211\u4eec\u5fc5\u987b\u786e\u4fdd\u6bcf\u4e2a\u8868\u8fbe\u5f0f\u7684\u7c7b\u578b\u4e0e\u590d\u5408\u7c7b\u578b\u4e2d\u5bf9\u5e94\u5217\u7684\u7c7b\u578b\u76f8\u5339\u914d\uff0c\u5fc5\u8981\u65f6\u63d2\u5165\u7c7b\u578b\u8f6c\u6362\u3002\u5426\u5219\uff0c\u5c31\u4f1a\u5f97\u5230\u8fd9\u6837\u7684\u9519\u8bef\uff1a</p>\n<pre class=\"screen\">\n<code class=\"computeroutput\">\nERROR:  function declared to return emp returns varchar instead of text at column 1\n</code>\n</pre>\n<p>\u4e0e\u57fa\u7840\u7c7b\u578b\u7684\u60c5\u51b5\u4e00\u6837\uff0c\u8be5\u51fd\u6570\u4e0d\u4f1a\u81ea\u52a8\u63d2\u5165\u4efb\u4f55\u7c7b\u578b\u8f6c\u6362\u3002</p>\n</li>\n</ul>\n</div>\n<p lang=\"zh\">\u5b9a\u4e49\u540c\u4e00\u4e2a\u51fd\u6570\u7684\u53e6\u4e00\u79cd\u65b9\u6cd5\u662f\uff1a</p>\n<pre class=\"programlisting\">CREATE FUNCTION new_emp() RETURNS emp AS $$\n    SELECT ROW('None', 1000.0, 25, '(2,2)')::emp;\n$$ LANGUAGE SQL;\n</pre>\n<p lang=\"zh\">\u8fd9\u91cc\u6211\u4eec\u7f16\u5199\u4e86\u4e00\u4e2a <code class=\"command\">SELECT</code>\uff0c\u5b83\u53ea\u8fd4\u56de\u5177\u6709\u6b63\u786e\u590d\u5408\u7c7b\u578b\u7684\u5355\u5217\u3002\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b\uff0c\u8fd9\u6837\u505a\u5e76\u6ca1\u6709\u66f4\u597d\uff0c\u4f46\u5728\u67d0\u4e9b\u60c5\u51b5\u4e0b\u5b83\u662f\u4e00\u79cd\u65b9\u4fbf\u7684\u66ff\u4ee3\u65b9\u6cd5 \u2014 \u4f8b\u5982\uff0c\u5982\u679c\u6211\u4eec\u9700\u8981\u901a\u8fc7\u8c03\u7528\u53e6\u4e00\u4e2a\u8fd4\u56de\u6240\u9700\u590d\u5408\u503c\u7684\u51fd\u6570\u6765\u8ba1\u7b97\u7ed3\u679c\u3002\u53e6\u4e00\u4e2a\u4f8b\u5b50\u662f\uff0c\u5982\u679c\u6211\u4eec\u8981\u7f16\u5199\u7684\u51fd\u6570\u8fd4\u56de\u7684\u662f\u57fa\u4e8e\u590d\u5408\u7c7b\u578b\u7684\u57df\uff0c\u800c\u4e0d\u662f\u666e\u901a\u590d\u5408\u7c7b\u578b\uff0c\u5c31\u603b\u662f\u5fc5\u987b\u5c06\u5176\u5199\u6210\u8fd4\u56de\u5355\u5217\u7684\u5f62\u5f0f\uff0c\u56e0\u4e3a\u6ca1\u6709\u5176\u4ed6\u65b9\u6cd5\u53ef\u4ee5\u4ea7\u751f\u7c7b\u578b\u6070\u597d\u4e3a\u8be5\u57df\u7c7b\u578b\u7684\u503c\u3002</p>\n<p lang=\"zh\">\u6211\u4eec\u65e2\u53ef\u4ee5\u628a\u8fd9\u4e2a\u51fd\u6570\u76f4\u63a5\u5f53\u4f5c\u503c\u8868\u8fbe\u5f0f\u8c03\u7528\uff1a</p>\n<pre class=\"screen\">SELECT new_emp();\n\n         new_emp\n--------------------------\n (None,1000.0,25,\"(2,2)\")\n</pre>\n<p lang=\"zh\">\u4e5f\u53ef\u4ee5\u628a\u5b83\u5f53\u4f5c\u8868\u51fd\u6570\u6765\u8c03\u7528\uff1a</p>\n<pre class=\"screen\">SELECT * FROM new_emp();\n\n name | salary | age | cubicle\n------+--------+-----+---------\n None | 1000.0 |  25 | (2,2)\n</pre>\n<p lang=\"zh\">\u7b2c\u4e8c\u79cd\u65b9\u5f0f\u4f1a\u5728<a class=\"xref\" href=\"/docs/12/xfunc-sql.html#XFUNC-SQL-TABLE-FUNCTIONS\" title=\"37.5.7.\u00a0SQL \u51fd\u6570\u4f5c\u4e3a\u8868\u6765\u6e90\">\u7b2c\u00a037.5.7\u00a0\u8282</a>\u4e2d\u8fdb\u4e00\u6b65\u8bf4\u660e\u3002</p>\n<p lang=\"zh\">\u5f53\u4f60\u4f7f\u7528\u8fd4\u56de\u590d\u5408\u7c7b\u578b\u7684\u51fd\u6570\u65f6\uff0c\u53ef\u80fd\u53ea\u9700\u8981\u53d6\u5176\u7ed3\u679c\u4e2d\u7684\u4e00\u4e2a\u5b57\u6bb5\uff08\u5c5e\u6027\uff09\u3002\u53ef\u4ee5\u4f7f\u7528\u4e0b\u9762\u8fd9\u6837\u7684\u8bed\u6cd5\uff1a</p>\n<pre class=\"screen\">SELECT (new_emp()).name;\n\n name\n------\n None\n</pre>\n<p lang=\"zh\">\u8fd9\u91cc\u9700\u8981\u989d\u5916\u7684\u62ec\u53f7\uff0c\u4ee5\u514d\u89e3\u6790\u5668\u4ea7\u751f\u6b67\u4e49\u3002\u5982\u679c\u4e0d\u52a0\u62ec\u53f7\uff0c\u7ed3\u679c\u4f1a\u662f\u8fd9\u6837\uff1a</p>\n<pre class=\"screen\">SELECT new_emp().name;\nERROR:  syntax error at or near \".\"\nLINE 1: SELECT new_emp().name;\n                        ^\n</pre>\n<p lang=\"zh\">\u53e6\u4e00\u79cd\u9009\u62e9\u662f\u4f7f\u7528\u51fd\u6570\u8bb0\u6cd5\u6765\u63d0\u53d6\u5c5e\u6027\uff1a</p>\n<pre class=\"screen\">SELECT name(new_emp());\n\n name\n------\n None\n</pre>\n<p lang=\"zh\">\u5982<a class=\"xref\" href=\"/docs/12/rowtypes.html#ROWTYPES-USAGE\" title=\"8.16.5.\u00a0\u5728\u67e5\u8be2\u4e2d\u4f7f\u7528\u590d\u5408\u7c7b\u578b\">\u7b2c\u00a08.16.5\u00a0\u8282</a>\u6240\u8ff0\uff0c\u5b57\u6bb5\u8bb0\u6cd5\u548c\u51fd\u6570\u8bb0\u6cd5\u662f\u7b49\u4ef7\u7684\u3002</p>\n<p lang=\"zh\">\u53e6\u4e00\u79cd\u4f7f\u7528\u51fd\u6570\u8fd4\u56de\u590d\u5408\u7c7b\u578b\u7684\u65b9\u6cd5\u662f\u5c06\u7ed3\u679c\u4f20\u9012\u7ed9\u53e6\u4e00\u4e2a\u63a5\u53d7\u6b63\u786e\u884c\u7c7b\u578b\u4f5c\u4e3a\u8f93\u5165\u7684\u51fd\u6570\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION getname(emp) RETURNS text AS $$\n    SELECT $1.name;\n$$ LANGUAGE SQL;\n\nSELECT getname(new_emp());\n getname\n---------\n None\n(1 row)\n</pre>\n</div>\n<div class=\"sect2\" id=\"XFUNC-OUTPUT-PARAMETERS\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/12/xfunc-sql.html#XFUNC-OUTPUT-PARAMETERS\">37.5.4. \u5e26\u6709\u8f93\u51fa\u53c2\u6570\u7684<acronym class=\"acronym\">SQL</acronym>\u51fd\u6570</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\">\u63cf\u8ff0\u51fd\u6570\u7ed3\u679c\u7684\u53e6\u4e00\u79cd\u65b9\u6cd5\u662f\u4f7f\u7528<em class=\"firstterm\">\u8f93\u51fa\u53c2\u6570</em>\uff0c\u4f8b\u5982\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION add_em (IN x int, IN y int, OUT sum int)\nAS 'SELECT x + y'\nLANGUAGE SQL;\n\nSELECT add_em(3,7);\n add_em\n--------\n     10\n(1 row)\n</pre>\n<p lang=\"zh\">\u8fd9\u4e0e<a class=\"xref\" href=\"/docs/12/xfunc-sql.html#XFUNC-SQL-BASE-FUNCTIONS\" title=\"37.5.2.\u00a0\u57fa\u7840\u7c7b\u578b\u4e0a\u7684SQL\u51fd\u6570\">\u7b2c\u00a037.5.2\u00a0\u8282</a>\u4e2d\u5c55\u793a\u7684 <code class=\"literal\">add_em</code> \u7248\u672c\u672c\u8d28\u4e0a\u5e76\u65e0\u4e0d\u540c\u3002\u8f93\u51fa\u53c2\u6570\u7684\u771f\u6b63\u4ef7\u503c\u5728\u4e8e\uff0c\u5b83\u4eec\u4e3a\u5b9a\u4e49\u8fd4\u56de\u591a\u5217\u7684\u51fd\u6570\u63d0\u4f9b\u4e86\u4e00\u79cd\u65b9\u4fbf\u7684\u65b9\u6cd5\u3002\u4f8b\u5982\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION sum_n_product (x int, y int, OUT sum int, OUT product int)\nAS 'SELECT x + y, x * y'\nLANGUAGE SQL;\n\n SELECT * FROM sum_n_product(11,42);\n sum | product\n-----+---------\n  53 |     462\n(1 row)\n</pre>\n<p lang=\"zh\">\u8fd9\u91cc\u672c\u8d28\u4e0a\u53d1\u751f\u7684\u4e8b\u60c5\u662f\uff1a\u6211\u4eec\u4e3a\u8be5\u51fd\u6570\u7684\u7ed3\u679c\u521b\u5efa\u4e86\u4e00\u4e2a\u533f\u540d\u590d\u5408\u7c7b\u578b\u3002\u4e0a\u9762\u7684\u793a\u4f8b\u4e0e\u4e0b\u9762\u8fd9\u79cd\u5199\u6cd5\u7684\u6700\u7ec8\u6548\u679c\u76f8\u540c\uff1a</p>\n<pre class=\"screen\">CREATE TYPE sum_prod AS (sum int, product int);\n\nCREATE FUNCTION sum_n_product (int, int) RETURNS sum_prod\nAS 'SELECT $1 + $2, $1 * $2'\nLANGUAGE SQL;\n</pre>\n<p lang=\"zh\">\u4f46\u901a\u5e38\u4e0d\u5fc5\u989d\u5916\u5b9a\u4e49\u4e00\u4e2a\u72ec\u7acb\u7684\u590d\u5408\u7c7b\u578b\u4f1a\u66f4\u65b9\u4fbf\u3002\u6ce8\u610f\uff0c\u9644\u5728\u8f93\u51fa\u53c2\u6570\u4e0a\u7684\u540d\u79f0\u5e76\u975e\u53ea\u662f\u88c5\u9970\uff0c\u5b83\u4eec\u51b3\u5b9a\u4e86\u8fd9\u4e2a\u533f\u540d\u590d\u5408\u7c7b\u578b\u7684\u5217\u540d\u3002\uff08\u5982\u679c\u7701\u7565\u8f93\u51fa\u53c2\u6570\u540d\u79f0\uff0c\u7cfb\u7edf\u4f1a\u81ea\u884c\u9009\u62e9\u4e00\u4e2a\u540d\u79f0\u3002\uff09</p>\n<p lang=\"zh\">\u5728\u4ece SQL \u8c03\u7528\u8fd9\u6837\u4e00\u4e2a\u51fd\u6570\u65f6\uff0c\u8f93\u51fa\u53c2\u6570\u4e0d\u4f1a\u88ab\u5305\u62ec\u5728\u8c03\u7528\u53c2\u6570\u5217\u8868\u4e2d\u3002\u8fd9\u662f\u56e0\u4e3a<span class=\"productname\">PostgreSQL</span>\u53ea\u8003\u8651\u8f93\u5165\u53c2\u6570\u6765\u5b9a\u4e49\u51fd\u6570\u7684\u8c03\u7528\u7b7e\u540d\u3002\u8fd9\u4e5f\u610f\u5473\u7740\u5728\u4e3a\u8bf8\u5982\u5220\u9664\u51fd\u6570\u7b49\u76ee\u7684\u5f15\u7528\u8be5\u51fd\u6570\u65f6\u53ea\u6709\u8f93\u5165\u53c2\u6570\u6709\u5173\u7cfb\u3002\u6211\u4eec\u53ef\u4ee5\u7528\u4e0b\u9762\u7684\u547d\u4ee4\u4e4b\u4e00\u5220\u9664\u4e0a\u8ff0\u51fd\u6570</p>\n<pre class=\"screen\">DROP FUNCTION sum_n_product (x int, y int, OUT sum int, OUT product int);\nDROP FUNCTION sum_n_product (int, int);\n</pre>\n<p lang=\"zh\">\u53c2\u6570\u53ef\u4ee5\u88ab\u6807\u8bb0\u4e3a<code class=\"literal\">IN</code>\uff08\u9ed8\u8ba4\uff09\u3001<code class=\"literal\">OUT</code>\u3001<code class=\"literal\">INOUT</code>\u6216\u8005<code class=\"literal\">VARIADIC</code>\u3002\u4e00\u4e2a<code class=\"literal\">INOUT</code>\u53c2\u6570\u65e2\u4f5c\u4e3a\u4e00\u4e2a\u8f93\u5165\u53c2\u6570\uff08\u8c03\u7528\u53c2\u6570\u5217\u8868\u7684\u4e00\u90e8\u5206\uff09\u53c8\u4f5c\u4e3a\u4e00\u4e2a\u8f93\u51fa\u53c2\u6570\uff08\u7ed3\u679c\u8bb0\u5f55\u7c7b\u578b\u7684\u4e00\u90e8\u5206\uff09\u3002<code class=\"literal\">VARIADIC</code>\u53c2\u6570\u662f\u8f93\u5165\u53c2\u6570\uff0c\u4f46\u88ab\u6309\u7167\u4e0b\u6587\u6240\u8ff0\u7279\u6b8a\u5bf9\u5f85\u3002</p>\n</div>\n<div class=\"sect2\" id=\"XFUNC-SQL-VARIADIC-FUNCTIONS\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/12/xfunc-sql.html#XFUNC-SQL-VARIADIC-FUNCTIONS\">37.5.5. \u5e26\u6709\u53ef\u53d8\u6570\u91cf\u53c2\u6570\u7684<acronym class=\"acronym\">SQL</acronym>\u51fd\u6570</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\"><acronym class=\"acronym\">SQL</acronym> \u51fd\u6570\u53ef\u4ee5\u88ab\u58f0\u660e\u4e3a\u63a5\u53d7\u53ef\u53d8\u6570\u91cf\u7684\u53c2\u6570\uff0c\u53ea\u8981\u6240\u6709<span class=\"quote\">\u201c<span class=\"quote\">\u53ef\u9009</span>\u201d</span>\u53c2\u6570\u90fd\u5c5e\u4e8e\u540c\u4e00\u79cd\u6570\u636e\u7c7b\u578b\u3002\u53ef\u9009\u53c2\u6570\u4f1a\u4ee5\u6570\u7ec4\u5f62\u5f0f\u4f20\u9012\u7ed9\u51fd\u6570\u3002\u5b9a\u4e49\u8fd9\u7c7b\u51fd\u6570\u65f6\uff0c\u9700\u8981\u628a\u6700\u540e\u4e00\u4e2a\u53c2\u6570\u6807\u8bb0\u4e3a <code class=\"literal\">VARIADIC</code>\uff1b\u8be5\u53c2\u6570\u5fc5\u987b\u88ab\u58f0\u660e\u4e3a\u6570\u7ec4\u7c7b\u578b\u3002\u4f8b\u5982\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION mleast(VARIADIC arr numeric[]) RETURNS numeric AS $$\n    SELECT min($1[i]) FROM generate_subscripts($1, 1) g(i);\n$$ LANGUAGE SQL;\n\nSELECT mleast(10, -1, 5, 4.4);\n mleast \n--------\n     -1\n(1 row)\n</pre>\n<p lang=\"zh\">\u5b9e\u9645\u4e0a\uff0c\u4f4d\u4e8e <code class=\"literal\">VARIADIC</code> \u4f4d\u7f6e\u53ca\u4e4b\u540e\u7684\u6240\u6709\u5b9e\u53c2\u90fd\u4f1a\u88ab\u6536\u96c6\u6210\u4e00\u4e2a\u4e00\u7ef4\u6570\u7ec4\uff0c\u5c31\u50cf\u4f60\u5199\u6210\u4e86\uff1a</p>\n<pre class=\"screen\">SELECT mleast(ARRAY[10, -1, 5, 4.4]);    -- doesn't work\n</pre>\n<p lang=\"zh\">\u4e0d\u8fc7\u4f60\u5b9e\u9645\u4e0a\u4e0d\u80fd\u8fd9\u6837\u5199\uff0c\u81f3\u5c11\u5b83\u4e0d\u4f1a\u5339\u914d\u8fd9\u4e2a\u51fd\u6570\u5b9a\u4e49\u3002\u88ab\u6807\u8bb0\u4e3a <code class=\"literal\">VARIADIC</code> \u7684\u53c2\u6570\u5339\u914d\u7684\u662f\u5176\u5143\u7d20\u7c7b\u578b\u51fa\u73b0\u4e00\u6b21\u6216\u591a\u6b21\uff0c\u800c\u4e0d\u662f\u5b83\u81ea\u8eab\u7684\u6570\u7ec4\u7c7b\u578b\u3002</p>\n<p lang=\"zh\">\u6709\u65f6\u5019\uff0c\u80fd\u591f\u628a\u4e00\u4e2a\u5df2\u7ecf\u6784\u9020\u597d\u7684\u6570\u7ec4\u4f20\u7ed9\u53ef\u53d8\u53c2\u6570\u51fd\u6570\u4f1a\u5f88\u6709\u7528\uff0c\u5c24\u5176\u662f\u5f53\u4e00\u4e2a\u53ef\u53d8\u53c2\u6570\u51fd\u6570\u60f3\u628a\u5b83\u7684\u6570\u7ec4\u53c2\u6570\u518d\u4f20\u7ed9\u53e6\u4e00\u4e2a\u51fd\u6570\u65f6\u3002\u6b64\u5916\uff0c\u5728\u5141\u8bb8\u4e0d\u53d7\u4fe1\u4efb\u7528\u6237\u521b\u5efa\u5bf9\u8c61\u7684\u6a21\u5f0f\u4e2d\u8c03\u7528\u53ef\u53d8\u53c2\u6570\u51fd\u6570\u65f6\uff0c\u8fd9\u662f\u552f\u4e00\u5b89\u5168\u7684\u65b9\u5f0f\uff0c\u89c1<a class=\"xref\" href=\"/docs/12/typeconv-func.html\" title=\"10.3.\u00a0\u51fd\u6570\">\u7b2c\u00a010.3\u00a0\u8282</a>\u3002\u4f60\u53ef\u4ee5\u5728\u8c03\u7528\u4e2d\u6307\u5b9a<code class=\"literal\">VARIADIC</code>\u6765\u505a\u5230\u8fd9\u4e00\u70b9\uff1a</p>\n<pre class=\"screen\">SELECT mleast(VARIADIC ARRAY[10, -1, 5, 4.4]);\n</pre>\n<p lang=\"zh\">\u8fd9\u6837\u4f1a\u963b\u6b62\u51fd\u6570\u7684\u53ef\u53d8\u53c2\u6570\u6309\u5176\u5143\u7d20\u7c7b\u578b\u5c55\u5f00\uff0c\u4ece\u800c\u8ba9\u6570\u7ec4\u5b9e\u53c2\u80fd\u591f\u6309\u5e38\u89c4\u65b9\u5f0f\u5339\u914d\u3002<code class=\"literal\">VARIADIC</code> \u53ea\u80fd\u9644\u52a0\u5728\u51fd\u6570\u8c03\u7528\u7684\u6700\u540e\u4e00\u4e2a\u5b9e\u53c2\u4e0a\u3002</p>\n<p lang=\"zh\">\u5728\u8c03\u7528\u4e2d\u6307\u5b9a<code class=\"literal\">VARIADIC</code>\u4e5f\u662f\u5411\u53ef\u53d8\u53c2\u6570\u51fd\u6570\u4f20\u9012\u7a7a\u6570\u7ec4\u7684\u552f\u4e00\u65b9\u5f0f\uff0c\u4f8b\u5982\uff1a</p>\n<pre class=\"screen\">SELECT mleast(VARIADIC ARRAY[]::numeric[]);\n</pre>\n<p lang=\"zh\">\u4ec5\u4ec5\u5199\u6210<code class=\"literal\">SELECT mleast()</code>\u662f\u884c\u4e0d\u901a\u7684\uff0c\u56e0\u4e3a\u53ef\u53d8\u53c2\u6570\u5fc5\u987b\u5339\u914d\u81f3\u5c11\u4e00\u4e2a\u5b9e\u53c2\u3002\uff08\u5982\u679c\u4f60\u5e0c\u671b\u5141\u8bb8\u8fd9\u79cd\u8c03\u7528\uff0c\u53ef\u4ee5\u518d\u5b9a\u4e49\u4e00\u4e2a\u540c\u540d\u4e14\u4e0d\u5e26\u53c2\u6570\u7684\u51fd\u6570<code class=\"literal\">mleast</code>\u3002\uff09</p>\n<p lang=\"zh\">\u4ece\u53ef\u53d8\u53c2\u6570\u6d3e\u751f\u51fa\u7684\u6570\u7ec4\u5143\u7d20\u53c2\u6570\u4f1a\u88ab\u89c6\u4e3a\u6ca1\u6709\u81ea\u5df1\u7684\u540d\u5b57\u3002\u8fd9\u610f\u5473\u7740\u9664\u975e\u4f60\u6307\u5b9a\u4e86 <code class=\"literal\">VARIADIC</code>\uff0c\u5426\u5219\u4e0d\u80fd\u4f7f\u7528\u547d\u540d\u53c2\u6570\u6765\u8c03\u7528\u53ef\u53d8\u53c2\u6570\u51fd\u6570\uff08<a class=\"xref\" href=\"/docs/12/sql-syntax-calling-funcs.html\" title=\"4.3.\u00a0\u8c03\u7528\u51fd\u6570\">\u7b2c\u00a04.3\u00a0\u8282</a>\uff09\u3002\u4f8b\u5982\uff0c\u4e0b\u9762\u7684\u8c03\u7528\u662f\u53ef\u884c\u7684\uff1a</p>\n<pre class=\"screen\">SELECT mleast(VARIADIC arr =&gt; ARRAY[10, -1, 5, 4.4]);\n</pre>\n<p lang=\"zh\">\u4f46\u8fd9\u4e9b\u5c31\u4e0d\u884c\uff1a</p>\n<pre class=\"screen\">SELECT mleast(arr =&gt; 10);\nSELECT mleast(arr =&gt; ARRAY[10, -1, 5, 4.4]);\n</pre>\n</div>\n<div class=\"sect2\" id=\"XFUNC-SQL-PARAMETER-DEFAULTS\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/12/xfunc-sql.html#XFUNC-SQL-PARAMETER-DEFAULTS\">37.5.6. \u5e26\u6709\u53c2\u6570\u9ed8\u8ba4\u503c\u7684<acronym class=\"acronym\">SQL</acronym>\u51fd\u6570</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\">\u51fd\u6570\u53ef\u4ee5\u88ab\u58f0\u660e\u4e3a\u5bf9\u4e00\u4e9b\u6216\u8005\u6240\u6709\u8f93\u5165\u53c2\u6570\u5177\u6709\u9ed8\u8ba4\u503c\u3002\u53ea\u8981\u8c03\u7528\u51fd\u6570\u65f6\u6ca1\u6709\u7ed9\u51fa\u8db3\u591f\u591a\u7684\u5b9e\u53c2\uff0c\u5c31\u4f1a\u63d2\u5165\u9ed8\u8ba4\u503c\u6765\u5f25\u8865\u7f3a\u5931\u7684\u5b9e\u53c2\u3002\u7531\u4e8e\u53c2\u6570\u53ea\u80fd\u4ece\u5b9e\u53c2\u5217\u8868\u7684\u5c3e\u90e8\u5f00\u59cb\u88ab\u7701\u7565\uff0c\u5728\u4e00\u4e2a\u6709\u9ed8\u8ba4\u503c\u7684\u53c2\u6570\u4e4b\u540e\u7684\u6240\u6709\u53c2\u6570\u90fd\u4e0d\u5f97\u4e0d\u4e5f\u5177\u6709\u9ed8\u8ba4\u503c\uff08\u5c3d\u7ba1\u4f7f\u7528\u547d\u540d\u53c2\u6570\u8bb0\u6cd5\u53ef\u4ee5\u5141\u8bb8\u653e\u677e\u8fd9\u79cd\u9650\u5236\uff0c\u8fd9\u79cd\u9650\u5236\u4ecd\u7136\u4f1a\u88ab\u5f3a\u5236\u4ee5\u4fbf\u4f4d\u7f6e\u53c2\u6570\u8bb0\u6cd5\u80fd\u5de5\u4f5c\uff09\u3002\u4e0d\u7ba1\u4f60\u662f\u5426\u4f7f\u7528\u5b83\uff0c\u8fd9\u79cd\u80fd\u529b\u90fd\u8981\u6c42\u5728\u67d0\u4e9b\u7528\u6237\u4e0d\u4fe1\u4efb\u5176\u4ed6\u7528\u6237\u7684\u6570\u636e\u5e93\u4e2d\u8c03\u7528\u51fd\u6570\u65f6\u91c7\u53d6\u4e00\u4e9b\u9884\u9632\u63aa\u65bd\uff0c\u89c1<a class=\"xref\" href=\"/docs/12/typeconv-func.html\" title=\"10.3.\u00a0\u51fd\u6570\">\u7b2c\u00a010.3\u00a0\u8282</a>\u3002</p>\n<p lang=\"zh\">\u4f8b\u5982\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION foo(a int, b int DEFAULT 2, c int DEFAULT 3)\nRETURNS int\nLANGUAGE SQL\nAS $$\n    SELECT $1 + $2 + $3;\n$$;\n\nSELECT foo(10, 20, 30);\n foo \n-----\n  60\n(1 row)\n\nSELECT foo(10, 20);\n foo \n-----\n  33\n(1 row)\n\nSELECT foo(10);\n foo \n-----\n  15\n(1 row)\n\nSELECT foo();  -- fails since there is no default for the first argument\nERROR:  function foo() does not exist\n</pre>\n<p lang=\"zh\">\u4e5f\u53ef\u4ee5\u7528 <code class=\"literal\">=</code> \u7b26\u53f7\u4ee3\u66ff\u5173\u952e\u5b57 <code class=\"literal\">DEFAULT</code>\u3002</p>\n</div>\n<div class=\"sect2\" id=\"XFUNC-SQL-TABLE-FUNCTIONS\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/12/xfunc-sql.html#XFUNC-SQL-TABLE-FUNCTIONS\">37.5.7. <acronym class=\"acronym\">SQL</acronym> \u51fd\u6570\u4f5c\u4e3a\u8868\u6765\u6e90</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\">\u6240\u6709\u7684 SQL \u51fd\u6570\u90fd\u53ef\u4ee5\u88ab\u7528\u5728\u67e5\u8be2\u7684<code class=\"literal\">FROM</code>\u5b50\u53e5\u4e2d\uff0c\u4f46\u662f\u5bf9\u4e8e\u8fd4\u56de\u590d\u5408\u7c7b\u578b\u7684\u51fd\u6570\u7279\u522b\u6709\u7528\u3002\u5982\u679c\u51fd\u6570\u88ab\u5b9a\u4e49\u4e3a\u8fd4\u56de\u4e00\u79cd\u57fa\u7840\u7c7b\u578b\uff0c\u8be5\u8868\u51fd\u6570\u4f1a\u4ea7\u751f\u4e00\u4e2a\u5355\u5217\u8868\u3002\u5982\u679c\u8be5\u51fd\u6570\u88ab\u5b9a\u4e49\u4e3a\u8fd4\u56de\u4e00\u79cd\u590d\u5408\u7c7b\u578b\uff0c\u8be5\u8868\u51fd\u6570\u4f1a\u4e3a\u8be5\u590d\u5408\u7c7b\u578b\u7684\u6bcf\u4e00\u4e2a\u5c5e\u6027\u4ea7\u751f\u4e00\u5217\u3002</p>\n<p lang=\"zh\">\u4ee5\u4e0b\u662f\u4e00\u4e2a\u793a\u4f8b\uff1a</p>\n<pre class=\"screen\">CREATE TABLE foo (fooid int, foosubid int, fooname text);\nINSERT INTO foo VALUES (1, 1, 'Joe');\nINSERT INTO foo VALUES (1, 2, 'Ed');\nINSERT INTO foo VALUES (2, 1, 'Mary');\n\nCREATE FUNCTION getfoo(int) RETURNS foo AS $$\n    SELECT * FROM foo WHERE fooid = $1;\n$$ LANGUAGE SQL;\n\nSELECT *, upper(fooname) FROM getfoo(1) AS t1;\n\n fooid | foosubid | fooname | upper\n-------+----------+---------+-------\n     1 |        1 | Joe     | JOE\n(1 row)\n</pre>\n<p lang=\"zh\">\u5982\u793a\u4f8b\u6240\u793a\uff0c\u6211\u4eec\u53ef\u4ee5\u50cf\u64cd\u4f5c\u666e\u901a\u8868\u7684\u5217\u4e00\u6837\u64cd\u4f5c\u51fd\u6570\u7ed3\u679c\u4e2d\u7684\u5217\u3002</p>\n<p lang=\"zh\">\u6ce8\u610f\u6211\u4eec\u53ea\u4ece\u51fd\u6570\u5f97\u5230\u4e86\u4e00\u884c\u3002\u8fd9\u662f\u56e0\u4e3a\u6211\u4eec\u6ca1\u6709\u4f7f\u7528<code class=\"literal\">SETOF</code>\u3002\u8fd9\u4f1a\u5728\u4e0b\u4e00\u8282\u4e2d\u4ecb\u7ecd\u3002</p>\n</div>\n<div class=\"sect2\" id=\"XFUNC-SQL-FUNCTIONS-RETURNING-SET\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/12/xfunc-sql.html#XFUNC-SQL-FUNCTIONS-RETURNING-SET\">37.5.8. \u8fd4\u56de\u96c6\u5408\u7684<acronym class=\"acronym\">SQL</acronym>\u51fd\u6570</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\">\u5f53\u4e00\u4e2a SQL \u51fd\u6570\u88ab\u58f0\u660e\u4e3a\u8fd4\u56de<code class=\"literal\">SETOF <em class=\"replaceable\"><code>sometype</code></em></code>\u65f6\uff0c\u8be5\u51fd\u6570\u7684\u6700\u540e\u4e00\u4e2a\u67e5\u8be2\u4f1a\u88ab\u6267\u884c\u5b8c\uff0c\u5e76\u4e14\u5b83\u8f93\u51fa\u7684\u6bcf\u4e00\u884c\u90fd\u4f1a\u88ab\u4f5c\u4e3a\u7ed3\u679c\u96c6\u7684\u4e00\u4e2a\u5143\u7d20\u8fd4\u56de\u3002</p>\n<p lang=\"zh\">\u8fd9\u4e00\u7279\u6027\u901a\u5e38\u662f\u5728\u67e5\u8be2\u7684 <code class=\"literal\">FROM</code> \u5b50\u53e5\u4e2d\u8c03\u7528\u51fd\u6570\u65f6\u4f7f\u7528\u7684\u3002\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b\uff0c\u51fd\u6570\u8fd4\u56de\u7684\u6bcf\u4e00\u884c\u90fd\u4f1a\u6210\u4e3a\u67e5\u8be2\u6240\u89c1\u8868\u4e2d\u7684\u4e00\u884c\u3002\u4f8b\u5982\uff0c\u5047\u8bbe\u8868 <code class=\"literal\">foo</code> \u4e0e\u4e0a\u6587\u76f8\u540c\uff0c\u6211\u4eec\u5199\uff1a</p>\n<pre class=\"programlisting\">CREATE FUNCTION getfoo(int) RETURNS SETOF foo AS $$\n    SELECT * FROM foo WHERE fooid = $1;\n$$ LANGUAGE SQL;\n\nSELECT * FROM getfoo(1) AS t1;\n</pre>\n<p lang=\"zh\">\u90a3\u4e48\u4f1a\u5f97\u5230\uff1a</p>\n<pre class=\"screen\"> fooid | foosubid | fooname\n-------+----------+---------\n     1 |        1 | Joe\n     1 |        2 | Ed\n(2 rows)\n</pre>\n<p lang=\"zh\">\u4e5f\u53ef\u4ee5\u901a\u8fc7\u8f93\u51fa\u53c2\u6570\u5b9a\u4e49\u7684\u5217\u6765\u8fd4\u56de\u591a\u884c\uff0c\u4f8b\u5982\uff1a</p>\n<pre class=\"programlisting\">CREATE TABLE tab (y int, z int);\nINSERT INTO tab VALUES (1, 2), (3, 4), (5, 6), (7, 8);\n\nCREATE FUNCTION sum_n_product_with_tab (x int, OUT sum int, OUT product int)\nRETURNS SETOF record\nAS $$\n    SELECT $1 + tab.y, $1 * tab.y FROM tab;\n$$ LANGUAGE SQL;\n\nSELECT * FROM sum_n_product_with_tab(10);\n sum | product\n-----+---------\n  11 |      10\n  13 |      30\n  15 |      50\n  17 |      70\n(4 rows)\n</pre>\n<p lang=\"zh\">\u8fd9\u91cc\u7684\u5173\u952e\u70b9\u662f\uff1a\u4f60\u5fc5\u987b\u5199\u6210 <code class=\"literal\">RETURNS SETOF record</code>\uff0c\u4ee5\u8868\u660e\u8be5\u51fd\u6570\u8fd4\u56de\u7684\u662f\u591a\u884c\u800c\u4e0d\u662f\u5355\u884c\u3002\u5982\u679c\u53ea\u6709\u4e00\u4e2a\u8f93\u51fa\u53c2\u6570\uff0c\u5219\u5199\u8be5\u53c2\u6570\u7684\u7c7b\u578b\uff0c\u800c\u4e0d\u662f <code class=\"type\">record</code>\u3002</p>\n<p lang=\"zh\">\u901a\u8fc7\u591a\u6b21\u8c03\u7528\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u6765\u6784\u9020\u67e5\u8be2\u7ed3\u679c\u901a\u5e38\u5f88\u6709\u7528\uff0c\u5176\u4e2d\u6bcf\u6b21\u8c03\u7528\u7684\u53c2\u6570\u90fd\u6765\u81ea\u8868\u6216\u5b50\u67e5\u8be2\u7684\u8fde\u7eed\u884c\u3002\u9996\u9009\u65b9\u5f0f\u662f\u4f7f\u7528 <code class=\"literal\">LATERAL</code> \u5173\u952e\u5b57\uff0c\u8be6\u89c1<a class=\"xref\" href=\"/docs/12/queries-table-expressions.html#QUERIES-LATERAL\" title=\"7.2.1.5.\u00a0LATERAL\u5b50\u67e5\u8be2\">\u7b2c\u00a07.2.1.5\u00a0\u8282</a>\u3002\u4e0b\u9762\u662f\u4e00\u4e2a\u4f7f\u7528\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u679a\u4e3e\u6811\u7ed3\u6784\u5143\u7d20\u7684\u793a\u4f8b\uff1a</p>\n<pre class=\"screen\">SELECT * FROM nodes;\n   name    | parent\n-----------+--------\n Top       |\n Child1    | Top\n Child2    | Top\n Child3    | Top\n SubChild1 | Child1\n SubChild2 | Child1\n(6 rows)\n\nCREATE FUNCTION listchildren(text) RETURNS SETOF text AS $$\n    SELECT name FROM nodes WHERE parent = $1\n$$ LANGUAGE SQL STABLE;\n\nSELECT * FROM listchildren('Top');\n listchildren\n--------------\n Child1\n Child2\n Child3\n(3 rows)\n\nSELECT name, child FROM nodes, LATERAL listchildren(name) AS child;\n  name  |   child\n--------+-----------\n Top    | Child1\n Top    | Child2\n Top    | Child3\n Child1 | SubChild1\n Child1 | SubChild2\n(5 rows)\n</pre>\n<p lang=\"zh\">\u8fd9\u4e2a\u4f8b\u5b50\u5e76\u6ca1\u6709\u505a\u51fa\u4efb\u4f55\u65e0\u6cd5\u7528\u7b80\u5355\u8fde\u63a5\u5b9e\u73b0\u7684\u4e8b\uff0c\u4f46\u5728\u66f4\u590d\u6742\u7684\u8ba1\u7b97\u4e2d\uff0c\u628a\u4e00\u90e8\u5206\u5de5\u4f5c\u653e\u8fdb\u51fd\u6570\u91cc\u901a\u5e38\u4f1a\u975e\u5e38\u65b9\u4fbf\u3002</p>\n<p lang=\"zh\">\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u4e5f\u53ef\u4ee5\u51fa\u73b0\u5728\u67e5\u8be2\u7684\u9009\u62e9\u5217\u8868\u4e2d\u3002\u5bf9\u4e8e\u67e5\u8be2\u672c\u8eab\u751f\u6210\u7684\u6bcf\u4e00\u884c\uff0c\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u90fd\u4f1a\u88ab\u8c03\u7528\uff0c\u5e76\u4e3a\u5176\u7ed3\u679c\u96c6\u4e2d\u7684\u6bcf\u4e00\u4e2a\u5143\u7d20\u751f\u6210\u4e00\u884c\u8f93\u51fa\u3002\u524d\u9762\u7684\u4f8b\u5b50\u4e5f\u53ef\u4ee5\u5199\u6210\u8fd9\u6837\uff1a</p>\n<pre class=\"screen\">SELECT listchildren('Top');\n listchildren\n--------------\n Child1\n Child2\n Child3\n(3 rows)\n\nSELECT name, listchildren(name) FROM nodes;\n  name  | listchildren\n--------+--------------\n Top    | Child1\n Top    | Child2\n Top    | Child3\n Child1 | SubChild1\n Child1 | SubChild2\n(5 rows)\n</pre>\n<p lang=\"zh\">\u5728\u6700\u540e\u4e00\u4e2a <code class=\"command\">SELECT</code> \u4e2d\uff0c\u6ce8\u610f\u6ca1\u6709\u4e3a <code class=\"literal\">Child2</code>\u3001<code class=\"literal\">Child3</code> \u7b49\u663e\u793a\u4efb\u4f55\u8f93\u51fa\u884c\u3002\u8fd9\u662f\u56e0\u4e3a <code class=\"function\">listchildren</code> \u5bf9\u8fd9\u4e9b\u53c2\u6570\u8fd4\u56de\u7684\u662f\u7a7a\u96c6\uff0c\u56e0\u6b64\u4e0d\u4f1a\u751f\u6210\u7ed3\u679c\u884c\u3002\u8fd9\u4e0e\u4f7f\u7528 <code class=\"literal\">LATERAL</code> \u8bed\u6cd5\u628a\u51fd\u6570\u7ed3\u679c\u505a\u5185\u8fde\u63a5\u65f6\u5f97\u5230\u7684\u884c\u4e3a\u76f8\u540c\u3002</p>\n<p lang=\"zh\"><span class=\"productname\">PostgreSQL</span>\u4e2d\uff0c\u5199\u5728\u67e5\u8be2\u7684\u9009\u62e9\u5217\u8868\u4e2d\u7684\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u7684\u884c\u4e3a\u51e0\u4e4e\u548c\u5199\u5728<code class=\"literal\">LATERAL FROM</code>\u5b50\u53e5\u9879\u4e2d\u7684\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u5b8c\u5168\u4e00\u6837\u3002\u4f8b\u5982\uff1a</p>\n<pre class=\"programlisting\">SELECT x, generate_series(1,5) AS g FROM tab;\n</pre>\n<p lang=\"zh\">\u51e0\u4e4e\u7b49\u6548\u4e8e</p>\n<pre class=\"programlisting\">SELECT x, g FROM tab, LATERAL generate_series(1,5) AS g;\n</pre>\n<p lang=\"zh\">\u8fd9\u4f1a\u662f\u5b8c\u5168\u4e00\u6837\u7684\uff0c\u9664\u4e86\u5728\u8fd9\u4e2a\u7279\u522b\u7684\u793a\u4f8b\u4e2d\uff0c\u89c4\u5212\u5668\u53ef\u4ee5\u9009\u62e9\u628a<code class=\"structname\">g</code>\u653e\u5728\u5d4c\u5957\u5faa\u73af\u8fde\u63a5\u7684\u5916\u4fa7\uff0c\u56e0\u4e3a<code class=\"structname\">g</code>\u5bf9<code class=\"structname\">tab</code>\u6ca1\u6709\u5b9e\u9645\u7684\u6a2a\u5411\u4f9d\u8d56\u3002\u90a3\u4f1a\u5bfc\u81f4\u4e00\u79cd\u4e0d\u540c\u7684\u8f93\u51fa\u884c\u987a\u5e8f\u3002\u9009\u62e9\u5217\u8868\u4e2d\u7684\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u603b\u662f\u4f1a\u88ab\u8ba1\u7b97\uff0c\u5c31\u597d\u50cf\u5b83\u4eec\u5728<code class=\"literal\">FROM</code>\u5b50\u53e5\u5269\u4f59\u90e8\u5206\u7684\u5d4c\u5957\u5faa\u73af\u8fde\u63a5\u7684\u5185\u4fa7\u4e00\u6837\uff0c\u56e0\u6b64\u5728\u8003\u8651\u6765\u81ea<code class=\"literal\">FROM</code>\u5b50\u53e5\u7684\u4e0b\u4e00\u884c\u4e4b\u524d\uff0c\u8fd9\u4e9b\u51fd\u6570\u4f1a\u8fd0\u884c\u5230\u5b8c\u6210\u3002</p>\n<p lang=\"zh\">\u5982\u679c\u5728\u67e5\u8be2\u7684\u9009\u62e9\u5217\u8868\u4e2d\u6709\u4e0d\u6b62\u4e00\u4e2a\u96c6\u5408\u8fd4\u56de\u51fd\u6570\uff0c\u5219\u884c\u4e3a\u7c7b\u4f3c\u4e8e\u628a\u90a3\u4e9b\u51fd\u6570\u653e\u5230\u4e00\u4e2a\u5355\u4e00\u7684<code class=\"literal\">LATERAL ROWS FROM( ... )</code> <code class=\"literal\">FROM</code>\u5b50\u53e5\u9879\u4e2d\u7684\u884c\u4e3a\u3002\u5bf9\u4e8e\u6765\u81ea\u5e95\u5c42\u67e5\u8be2\u7684\u6bcf\u4e00\u884c\uff0c\u90fd\u6709\u4e00\u4e2a\u7528\u5230\u6bcf\u4e2a\u51fd\u6570\u9996\u4e2a\u7ed3\u679c\u7684\u8f93\u51fa\u884c\uff0c\u7136\u540e\u662f\u4e00\u4e2a\u4f7f\u7528\u6bcf\u4e2a\u51fd\u6570\u7b2c\u4e8c\u4e2a\u7ed3\u679c\u7684\u8f93\u51fa\u884c\uff0c\u4ee5\u6b64\u7c7b\u63a8\u3002\u5982\u679c\u67d0\u4e9b\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u4ea7\u751f\u7684\u8f93\u51fa\u6bd4\u5176\u4ed6\u51fd\u6570\u5c11\uff0c\u4f1a\u7528\u7a7a\u503c\u4ee3\u66ff\u7f3a\u5931\u7684\u6570\u636e\uff0c\u56e0\u6b64\u4e3a\u4e00\u4e2a\u5e95\u5c42\u884c\u5f62\u6210\u7684\u603b\u884c\u6570\u7b49\u4e8e\u4ea7\u751f\u6700\u591a\u8f93\u51fa\u7684\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u7684\u8f93\u51fa\u884c\u6570\u3002\u56e0\u6b64\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u4f1a<span class=\"quote\">\u201c<span class=\"quote\">\u6b65\u8c03\u4e00\u81f4</span>\u201d</span>\u5730\u8fd0\u884c\u76f4\u5230\u5b83\u4eec\u7684\u8f93\u51fa\u88ab\u8017\u5c3d\uff0c\u7136\u540e\u7528\u4e0b\u4e00\u4e2a\u5e95\u5c42\u884c\u7ee7\u7eed\u6267\u884c\u3002</p>\n<p lang=\"zh\">\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u53ef\u4ee5\u88ab\u5d4c\u5957\u5728\u4e00\u4e2a\u9009\u62e9\u5217\u8868\u4e2d\uff0c\u4e0d\u8fc7\u5728<code class=\"literal\">FROM</code>\u5b50\u53e5\u9879\u4e2d\u4e0d\u5141\u8bb8\u8fd9\u6837\u505a\u3002\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b\uff0c\u5d4c\u5957\u7684\u6bcf\u4e00\u5c42\u4f1a\u88ab\u5355\u72ec\u5bf9\u5f85\uff0c\u5c31\u50cf\u5b83\u662f\u4e00\u4e2a\u5355\u72ec\u7684<code class=\"literal\">LATERAL ROWS FROM( ... )</code>\u9879\u4e00\u6837\u3002\u4f8b\u5982\uff0c\u5728</p>\n<pre class=\"programlisting\">SELECT srf1(srf2(x), srf3(y)), srf4(srf5(z)) FROM tab;\n</pre>\n<p lang=\"zh\">\u4e2d\uff0c\u96c6\u5408\u8fd4\u56de\u51fd\u6570<code class=\"function\">srf2</code>\u3001<code class=\"function\">srf3</code>\u548c<code class=\"function\">srf5</code>\u5c06\u4e3a<code class=\"structname\">tab</code>\u7684\u6bcf\u4e00\u884c\u6b65\u8c03\u4e00\u81f4\u5730\u8fd0\u884c\uff0c\u7136\u540e\u4f1a\u5bf9\u8f83\u4f4e\u5c42\u7684\u51fd\u6570\u4ea7\u751f\u7684\u6bcf\u4e00\u884c\u4ee5\u6b65\u8c03\u4e00\u81f4\u7684\u5f62\u5f0f\u5e94\u7528<code class=\"function\">srf1</code>\u548c<code class=\"function\">srf4</code>\u3002</p>\n<p lang=\"zh\">\u5728<code class=\"literal\">CASE</code>\u6216<code class=\"literal\">COALESCE</code>\u8fd9\u6837\u7684\u6761\u4ef6\u8ba1\u7b97\u7ed3\u6784\u4e2d\uff0c\u4e0d\u80fd\u4f7f\u7528\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u3002\u4f8b\u5982\uff0c\u8003\u8651</p>\n<pre class=\"programlisting\">SELECT x, CASE WHEN x &gt; 0 THEN generate_series(1, 5) ELSE 0 END FROM tab;\n</pre>\n<p lang=\"zh\">\u8868\u9762\u4e0a\u770b\uff0c\u8fd9\u5e94\u5f53\u8ba9 x &gt; 0 \u7684\u8f93\u5165\u884c\u91cd\u590d\u4e94\u6b21\uff0c\u5176\u4f59\u884c\u53ea\u51fa\u73b0\u4e00\u6b21\uff1b\u4f46\u5b9e\u9645\u4e0a\uff0cgenerate_series(1, 5) \u4f1a\u5728 CASE \u8868\u8fbe\u5f0f\u6c42\u503c\u4e4b\u524d\uff0c\u4f5c\u4e3a\u9690\u5f0f LATERAL FROM \u9879\u6267\u884c\uff0c\u56e0\u6b64\u6bcf\u4e2a\u8f93\u5165\u884c\u90fd\u4f1a\u91cd\u590d\u4e94\u6b21\u3002\u4e3a\u907f\u514d\u6df7\u6dc6\uff0c\u6b64\u7c7b\u5199\u6cd5\u4f1a\u5728\u89e3\u6790\u9636\u6bb5\u62a5\u9519\u3002</p>\n<div class=\"note\">\n<h3 class=\"title\" lang=\"zh\">\u6ce8\u610f</h3>\n<p lang=\"zh\">\u5982\u679c\u4e00\u4e2a\u51fd\u6570\u7684\u6700\u540e\u4e00\u6761\u547d\u4ee4\u662f <code class=\"command\">INSERT</code>\u3001<code class=\"command\">UPDATE</code> \u6216 <code class=\"command\">DELETE</code> \u5e76\u5e26\u6709 <code class=\"literal\">RETURNING</code>\uff0c\u90a3\u4e48\u5373\u4f7f\u8be5\u51fd\u6570\u6ca1\u6709\u58f0\u660e\u4e3a <code class=\"literal\">SETOF</code>\uff0c\u6216\u8005\u8c03\u7528\u5b83\u7684\u67e5\u8be2\u5e76\u672a\u53d6\u8d70\u5168\u90e8\u7ed3\u679c\u884c\uff0c\u8be5\u547d\u4ee4\u4e5f\u603b\u4f1a\u6267\u884c\u5230\u5b8c\u6210\u3002<code class=\"literal\">RETURNING</code> \u5b50\u53e5\u4ea7\u751f\u7684\u989d\u5916\u7ed3\u679c\u884c\u4f1a\u88ab\u9759\u9ed8\u4e22\u5f03\uff0c\u4f46\u76f8\u5e94\u7684\u8868\u4fee\u6539\u4ecd\u7136\u4f1a\u53d1\u751f\uff0c\u5e76\u4e14\u4f1a\u5728\u51fd\u6570\u8fd4\u56de\u524d\u5168\u90e8\u5b8c\u6210\u3002</p>\n</div>\n<div class=\"note\">\n<h3 class=\"title\" lang=\"zh\">\u6ce8\u610f</h3>\n<p lang=\"zh\">\u5728 <span class=\"productname\">PostgreSQL</span> 10 \u4e4b\u524d\uff0c\u9664\u975e\u591a\u4e2a\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u59cb\u7ec8\u4ea7\u751f\u76f8\u540c\u6570\u91cf\u7684\u884c\uff0c\u5426\u5219\u628a\u5b83\u4eec\u653e\u5728\u540c\u4e00\u4e2a\u9009\u62e9\u5217\u8868\u4e2d\u7684\u884c\u4e3a\u5e76\u4e0d\u5408\u7406\u3002\u5426\u5219\uff0c\u5f97\u5230\u7684\u8f93\u51fa\u884c\u6570\u4f1a\u662f\u8fd9\u4e9b\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u5404\u81ea\u4ea7\u751f\u884c\u6570\u7684\u6700\u5c0f\u516c\u500d\u6570\u3002\u6b64\u5916\uff0c\u5d4c\u5957\u7684\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u4e5f\u4e0d\u50cf\u4e0a\u6587\u6240\u63cf\u8ff0\u7684\u90a3\u6837\u5de5\u4f5c\uff1b\u76f8\u53cd\uff0c\u4e00\u4e2a\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u81f3\u591a\u53ea\u80fd\u6709\u4e00\u4e2a\u96c6\u5408\u8fd4\u56de\u53c2\u6570\uff0c\u5e76\u4e14\u6bcf\u4e00\u7ec4\u5d4c\u5957\u7684\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u90fd\u4f1a\u72ec\u7acb\u8fd0\u884c\u3002\u518d\u52a0\u4e0a\u8fc7\u53bb\u8fd8\u5141\u8bb8\u6761\u4ef6\u6267\u884c\uff08\u5373\u5728 <code class=\"literal\">CASE</code> \u7b49\u7ed3\u6784\u5185\u90e8\u4f7f\u7528\u96c6\u5408\u8fd4\u56de\u51fd\u6570\uff09\uff0c\u4e8b\u60c5\u5c31\u66f4\u52a0\u590d\u6742\u4e86\u3002\u5982\u679c\u4f60\u8981\u7f16\u5199\u9700\u8981\u5728\u65e7\u7248 <span class=\"productname\">PostgreSQL</span> \u4e0a\u8fd0\u884c\u7684\u67e5\u8be2\uff0c\u5efa\u8bae\u4f7f\u7528 <code class=\"literal\">LATERAL</code> \u8bed\u6cd5\uff0c\u56e0\u4e3a\u8fd9\u6837\u5728\u4e0d\u540c\u7248\u672c\u4e4b\u95f4\u80fd\u591f\u5f97\u5230\u4e00\u81f4\u7684\u7ed3\u679c\u3002\u5982\u679c\u4f60\u7684\u67e5\u8be2\u4f9d\u8d56\u4e8e\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u7684\u6761\u4ef6\u6267\u884c\uff0c\u6216\u8bb8\u53ef\u4ee5\u628a\u6761\u4ef6\u5224\u65ad\u79fb\u52a8\u5230\u81ea\u5b9a\u4e49\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u5185\u90e8\u6765\u4fee\u590d\u3002\u4f8b\u5982\uff0c</p>\n<pre class=\"programlisting\">SELECT x, CASE WHEN y &gt; 0 THEN generate_series(1, z) ELSE 5 END FROM tab;\n</pre>\n<p lang=\"zh\">\u53ef\u4ee5\u53d8\u6210</p>\n<pre class=\"programlisting\">CREATE FUNCTION case_generate_series(cond bool, start int, fin int, els int)\n  RETURNS SETOF int AS $$\nBEGIN\n  IF cond THEN\n    RETURN QUERY SELECT generate_series(start, fin);\n  ELSE\n    RETURN QUERY SELECT els;\n  END IF;\nEND$$ LANGUAGE plpgsql;\n\nSELECT x, case_generate_series(y &gt; 0, 1, z, 5) FROM tab;\n</pre>\n<p lang=\"zh\">\u8fd9\u79cd\u5199\u6cd5\u5728\u6240\u6709\u7248\u672c\u7684 <span class=\"productname\">PostgreSQL</span> \u4e2d\u7684\u884c\u4e3a\u90fd\u76f8\u540c\u3002</p>\n</div>\n</div>\n<div class=\"sect2\" id=\"XFUNC-SQL-FUNCTIONS-RETURNING-TABLE\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/12/xfunc-sql.html#XFUNC-SQL-FUNCTIONS-RETURNING-TABLE\">37.5.9. \u8fd4\u56de<code class=\"literal\">TABLE</code>\u7684<acronym class=\"acronym\">SQL</acronym>\u51fd\u6570</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\">\u8fd8\u6709\u53e6\u4e00\u79cd\u65b9\u6cd5\u53ef\u4ee5\u628a\u51fd\u6570\u58f0\u660e\u4e3a\u8fd4\u56de\u4e00\u4e2a\u96c6\u5408\uff0c\u5373\u4f7f\u7528 <code class=\"literal\">RETURNS TABLE(<em class=\"replaceable\"><code>columns</code></em>)</code>\u8bed\u6cd5\u3002\u8fd9\u7b49\u6548\u4e8e\u4f7f\u7528\u4e00\u4e2a\u6216\u8005\u591a\u4e2a<code class=\"literal\">OUT</code>\u53c2\u6570\u5916\u52a0\u628a\u51fd\u6570\u6807\u8bb0\u4e3a\u8fd4\u56de <code class=\"literal\">SETOF record</code>\uff08\u6216\u8005\u662f<code class=\"literal\">SETOF</code>\u5355\u4e2a\u8f93\u51fa\u53c2\u6570\u7684\u7c7b\u578b\uff09\u3002\u8fd9\u79cd\u5199\u6cd5\u662f\u5728\u6700\u8fd1\u7684 SQL \u6807\u51c6\u4e2d\u6307\u5b9a\u7684\uff0c\u56e0\u6b64\u53ef\u80fd\u6bd4\u4f7f\u7528 <code class=\"literal\">SETOF</code>\u7684\u79fb\u690d\u6027\u66f4\u597d\u3002</p>\n<p lang=\"zh\">\u4f8b\u5982\uff0c\u524d\u9762\u7684\u6c42\u548c\u5e76\u4e14\u76f8\u4e58\u7684\u793a\u4f8b\u4e5f\u53ef\u4ee5\u8fd9\u6837\u6765\u505a\uff1a</p>\n<pre class=\"programlisting\">CREATE FUNCTION sum_n_product_with_tab (x int)\nRETURNS TABLE(sum int, product int) AS $$\n    SELECT $1 + tab.y, $1 * tab.y FROM tab;\n$$ LANGUAGE SQL;\n</pre>\n<p lang=\"zh\">\u4e0d\u5141\u8bb8\u628a\u663e\u5f0f\u7684<code class=\"literal\">OUT</code>\u6216\u8005<code class=\"literal\">INOUT</code>\u53c2\u6570\u7528\u4e8e <code class=\"literal\">RETURNS TABLE</code>\u8bb0\u6cd5 \u2014 \u5fc5\u987b\u628a\u6240\u6709\u8f93\u51fa\u5217\u653e\u5728 <code class=\"literal\">TABLE</code>\u5217\u8868\u4e2d\u3002</p>\n</div>\n<div class=\"sect2\" id=\"id-1.8.3.8.18\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/12/xfunc-sql.html#id-1.8.3.8.18\">37.5.10. \u591a\u6001<acronym class=\"acronym\">SQL</acronym>\u51fd\u6570</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\"><acronym class=\"acronym\">SQL</acronym> \u51fd\u6570\u53ef\u4ee5\u88ab\u58f0\u660e\u4e3a\u63a5\u53d7\u5e76\u8fd4\u56de\u8fd9\u4e9b\u591a\u6001\u7c7b\u578b\uff1a<code class=\"type\">anyelement</code>\uff0c<code class=\"type\">anyarray</code>\uff0c<code class=\"type\">anynonarray</code>\uff0c<code class=\"type\">anyenum</code>\u3001<code class=\"type\">anyrange</code>\u3002\u5173\u4e8e\u591a\u6001\u51fd\u6570\u7684\u66f4\u8be6\u7ec6\u89e3\u91ca\uff0c\u89c1<a class=\"xref\" href=\"/docs/12/extend-type-system.html#EXTEND-TYPES-POLYMORPHIC\" title=\"37.2.5.\u00a0\u591a\u6001\u7c7b\u578b\">\u7b2c\u00a037.2.5\u00a0\u8282</a>\u3002\u4e0b\u9762\u8fd9\u4e2a\u591a\u6001\u51fd\u6570 <code class=\"function\">make_array</code> \u4f1a\u6839\u636e\u4e24\u4e2a\u4efb\u610f\u6570\u636e\u7c7b\u578b\u7684\u5143\u7d20\u6784\u9020\u4e00\u4e2a\u6570\u7ec4\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION make_array(anyelement, anyelement) RETURNS anyarray AS $$\n    SELECT ARRAY[$1, $2];\n$$ LANGUAGE SQL;\n\nSELECT make_array(1, 2) AS intarray, make_array('a'::text, 'b') AS textarray;\n intarray | textarray\n----------+-----------\n {1,2}    | {a,b}\n(1 row)\n</pre>\n<p lang=\"zh\">\u6ce8\u610f\u7c7b\u578b\u8f6c\u6362<code class=\"literal\">'a'::text</code>\u7684\u4f7f\u7528\u662f\u4e3a\u4e86\u6307\u5b9a\u8be5\u53c2\u6570\u7684\u7c7b\u578b\u662f<code class=\"type\">text</code>\u3002\u5982\u679c\u8be5\u53c2\u6570\u53ea\u662f\u4e00\u4e2a\u5b57\u7b26\u4e32\u5b57\u9762\u91cf\uff0c\u8fd9\u5c31\u662f\u5fc5\u987b\u7684\uff0c\u56e0\u4e3a\u5426\u5219\u5b83\u4f1a\u88ab\u5f53\u4f5c<code class=\"type\">unknown</code>\u7c7b\u578b\uff0c\u5e76\u4e14 <code class=\"type\">unknown</code>\u7684\u6570\u7ec4\u4e5f\u4e0d\u662f\u4e00\u79cd\u5408\u6cd5\u7684\u7c7b\u578b\u3002\u5982\u679c\u6ca1\u6709\u8be5\u7c7b\u578b\u8f6c\u6362\uff0c\u5c06\u5f97\u5230\u8fd9\u6837\u7684\u9519\u8bef\uff1a</p>\n<pre class=\"screen\"><code class=\"computeroutput\">\nERROR:  could not determine polymorphic type because input has type \"unknown\"\n</code>\n</pre>\n<p lang=\"zh\">\u5141\u8bb8\u5b58\u5728\u5177\u6709\u56fa\u5b9a\u8fd4\u56de\u7c7b\u578b\u7684\u591a\u6001\u53c2\u6570\uff0c\u4f46\u53cd\u8fc7\u6765\u5219\u4e0d\u5141\u8bb8\u3002\u4f8b\u5982\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION is_greater(anyelement, anyelement) RETURNS boolean AS $$\n    SELECT $1 &gt; $2;\n$$ LANGUAGE SQL;\n\nSELECT is_greater(1, 2);\n is_greater\n------------\n f\n(1 row)\n\nCREATE FUNCTION invalid_func() RETURNS anyelement AS $$\n    SELECT 1;\n$$ LANGUAGE SQL;\nERROR:  cannot determine result data type\nDETAIL:  A function returning a polymorphic type must have at least one polymorphic argument.\n</pre>\n<p lang=\"zh\">\u591a\u6001\u4e5f\u53ef\u4ee5\u548c\u5e26\u8f93\u51fa\u53c2\u6570\u7684\u51fd\u6570\u4e00\u8d77\u4f7f\u7528\u3002\u4f8b\u5982\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION dup (f1 anyelement, OUT f2 anyelement, OUT f3 anyarray)\nAS 'select $1, array[$1,$1]' LANGUAGE SQL;\n\nSELECT * FROM dup(22);\n f2 |   f3\n----+---------\n 22 | {22,22}\n(1 row)\n</pre>\n<p lang=\"zh\">\u591a\u6001\u4e5f\u53ef\u4ee5\u7528\u4e8e\u53ef\u53d8\u53c2\u6570\u51fd\u6570\u3002\u4f8b\u5982\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION anyleast (VARIADIC anyarray) RETURNS anyelement AS $$\n    SELECT min($1[i]) FROM generate_subscripts($1, 1) g(i);\n$$ LANGUAGE SQL;\n\nSELECT anyleast(10, -1, 5, 4);\n anyleast \n----------\n       -1\n(1 row)\n\nSELECT anyleast('abc'::text, 'def');\n anyleast \n----------\n abc\n(1 row)\n\nCREATE FUNCTION concat_values(text, VARIADIC anyarray) RETURNS text AS $$\n    SELECT array_to_string($2, $1);\n$$ LANGUAGE SQL;\n\nSELECT concat_values('|', 1, 4, 2);\n concat_values \n---------------\n 1|4|2\n(1 row)\n</pre>\n</div>\n<div class=\"sect2\" id=\"id-1.8.3.8.19\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/12/xfunc-sql.html#id-1.8.3.8.19\">37.5.11. \u5e26\u6709\u6392\u5e8f\u89c4\u5219\u7684<acronym class=\"acronym\">SQL</acronym>\u51fd\u6570</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\">\u5f53\u4e00\u4e2a SQL \u51fd\u6570\u6709\u4e00\u4e2a\u6216\u591a\u4e2a\u652f\u6301\u6392\u5e8f\u89c4\u5219\u7684\u6570\u636e\u7c7b\u578b\u53c2\u6570\u65f6\uff0c\u4f1a\u6839\u636e\u5b9e\u53c2\u6240\u5e26\u7684\u6392\u5e8f\u89c4\u5219\uff0c\u4e3a\u6bcf\u6b21\u51fd\u6570\u8c03\u7528\u786e\u5b9a\u4e00\u4e2a\u6392\u5e8f\u89c4\u5219\uff0c\u8be6\u89c1<a class=\"xref\" href=\"/docs/12/collation.html\" title=\"23.2.\u00a0\u6392\u5e8f\u89c4\u5219\u652f\u6301\">\u7b2c\u00a023.2\u00a0\u8282</a>\u3002\u5982\u679c\u80fd\u591f\u6210\u529f\u786e\u5b9a\uff08\u4e5f\u5c31\u662f\u8bf4\uff0c\u53c2\u6570\u4e4b\u95f4\u4e0d\u5b58\u5728\u9690\u5f0f\u6392\u5e8f\u89c4\u5219\u51b2\u7a81\uff09\uff0c\u90a3\u4e48\u6240\u6709\u652f\u6301\u6392\u5e8f\u89c4\u5219\u7684\u53c2\u6570\u90fd\u4f1a\u88ab\u89c6\u4e3a\u9690\u5f0f\u5e26\u6709\u8be5\u6392\u5e8f\u89c4\u5219\u3002\u8fd9\u4f1a\u5f71\u54cd\u51fd\u6570\u4e2d\u5bf9\u6392\u5e8f\u89c4\u5219\u654f\u611f\u7684\u64cd\u4f5c\u7684\u884c\u4e3a\u3002\u4f8b\u5982\uff0c\u4f7f\u7528\u4e0a\u6587\u7684 <code class=\"function\">anyleast</code> \u51fd\u6570\u65f6\uff0c</p>\n<pre class=\"programlisting\">SELECT anyleast('abc'::text, 'ABC');\n</pre>\n<p lang=\"zh\">\u7684\u7ed3\u679c\u5c06\u53d6\u51b3\u4e8e\u6570\u636e\u5e93\u7684\u9ed8\u8ba4\u6392\u5e8f\u89c4\u5219\u3002\u5728 <code class=\"literal\">C</code> \u533a\u57df\u8bbe\u7f6e\u4e0b\uff0c\u7ed3\u679c\u4f1a\u662f <code class=\"literal\">ABC</code>\uff0c\u4f46\u5728\u8bb8\u591a\u5176\u4ed6\u533a\u57df\u8bbe\u7f6e\u4e0b\u5219\u4f1a\u662f <code class=\"literal\">abc</code>\u3002\u53ef\u4ee5\u5728\u4efb\u610f\u53c2\u6570\u4e0a\u6dfb\u52a0 <code class=\"literal\">COLLATE</code> \u5b50\u53e5\u6765\u5f3a\u5236\u6307\u5b9a\u8981\u4f7f\u7528\u7684\u6392\u5e8f\u89c4\u5219\uff0c\u4f8b\u5982\uff1a</p>\n<pre class=\"programlisting\">SELECT anyleast('abc'::text, 'ABC' COLLATE \"C\");\n</pre>\n<p lang=\"zh\">\u53e6\u5916\uff0c\u5982\u679c\u4f60\u5e0c\u671b\u67d0\u4e2a\u51fd\u6570\u65e0\u8bba\u4ee5\u4ec0\u4e48\u6392\u5e8f\u89c4\u5219\u8c03\u7528\uff0c\u90fd\u59cb\u7ec8\u6309\u7279\u5b9a\u6392\u5e8f\u89c4\u5219\u5de5\u4f5c\uff0c\u53ef\u4ee5\u5728\u51fd\u6570\u5b9a\u4e49\u4e2d\u6309\u9700\u63d2\u5165 <code class=\"literal\">COLLATE</code> \u5b50\u53e5\u3002\u4e0b\u9762\u8fd9\u4e2a\u7248\u672c\u7684 <code class=\"function\">anyleast</code> \u5c06\u59cb\u7ec8\u4f7f\u7528 <code class=\"literal\">en_US</code> \u533a\u57df\u8bbe\u7f6e\u6765\u6bd4\u8f83\u5b57\u7b26\u4e32\uff1a</p>\n<pre class=\"programlisting\">CREATE FUNCTION anyleast (VARIADIC anyarray) RETURNS anyelement AS $$\n    SELECT min($1[i] COLLATE \"en_US\") FROM generate_subscripts($1, 1) g(i);\n$$ LANGUAGE SQL;\n</pre>\n<p lang=\"zh\">\u4f46\u8bf7\u6ce8\u610f\uff0c\u5982\u679c\u628a\u5b83\u7528\u4e8e\u4e0d\u652f\u6301\u6392\u5e8f\u89c4\u5219\u7684\u6570\u636e\u7c7b\u578b\uff0c\u5c31\u4f1a\u629b\u51fa\u9519\u8bef\u3002</p>\n<p lang=\"zh\">\u5982\u679c\u65e0\u6cd5\u5728\u5b9e\u53c2\u4e4b\u95f4\u786e\u5b9a\u5171\u540c\u7684\u6392\u5e8f\u89c4\u5219\uff0c\u90a3\u4e48 SQL \u51fd\u6570\u4f1a\u628a\u53c2\u6570\u89c6\u4e3a\u5e26\u6709\u5176\u6570\u636e\u7c7b\u578b\u7684\u9ed8\u8ba4\u6392\u5e8f\u89c4\u5219\uff08\u901a\u5e38\u662f\u6570\u636e\u5e93\u7684\u9ed8\u8ba4\u6392\u5e8f\u89c4\u5219\uff0c\u4f46\u5bf9\u57df\u7c7b\u578b\u53c2\u6570\u6765\u8bf4\u4e5f\u53ef\u80fd\u4e0d\u540c\uff09\u3002</p>\n<p lang=\"zh\">\u8fd9\u79cd\u652f\u6301\u6392\u5e8f\u89c4\u5219\u7684\u53c2\u6570\u7684\u884c\u4e3a\uff0c\u53ef\u4ee5\u770b\u4f5c\u662f\u4ec5\u9002\u7528\u4e8e\u6587\u672c\u6570\u636e\u7c7b\u578b\u7684\u4e00\u79cd\u53d7\u9650\u591a\u6001\u5f62\u5f0f\u3002</p>\n</div>\n</div>", "manual_path": "/docs/12/xfunc-sql.html", "localization": {"status": "complete", "sources": [{"url": "/docs/12/xfunc-sql.html", "method": "same-major semantic node", "sha256": "e94f2ddcec48af03f63f6de797ea3a45d651f3700c2ad20e4baeac36163f7922", "language": "zh", "matched_nodes": ["#XFUNC-SQL/div[10]/p[2]", "#XFUNC-SQL/div[10]/p[3]", "#XFUNC-SQL/div[10]/p[4]", "#XFUNC-SQL/div[10]/p[5]", "#XFUNC-SQL/div[10]/p[6]", "#XFUNC-SQL/div[10]/p[8]", "#XFUNC-SQL/div[11]/p[10]", "#XFUNC-SQL/div[11]/p[12]", "#XFUNC-SQL/div[11]/p[13]", "#XFUNC-SQL/div[11]/p[15]", "#XFUNC-SQL/div[11]/p[17]", "#XFUNC-SQL/div[11]/p[19]", "#XFUNC-SQL/div[11]/p[1]", "#XFUNC-SQL/div[11]/p[3]", "#XFUNC-SQL/div[11]/p[4]", "#XFUNC-SQL/div[11]/p[6]", "#XFUNC-SQL/div[11]/p[8]", "#XFUNC-SQL/div[12]/div[12]/ul[0]/li[0]", "#XFUNC-SQL/div[12]/div[12]/ul[0]/li[1]", "#XFUNC-SQL/div[12]/p[10]", "#XFUNC-SQL/div[12]/p[11]", "#XFUNC-SQL/div[12]/p[13]", "#XFUNC-SQL/div[12]/p[15]", "#XFUNC-SQL/div[12]/p[16]", "#XFUNC-SQL/div[12]/p[18]", "#XFUNC-SQL/div[12]/p[1]", "#XFUNC-SQL/div[12]/p[20]", "#XFUNC-SQL/div[12]/p[21]", "#XFUNC-SQL/div[12]/p[23]", "#XFUNC-SQL/div[12]/p[25]", "#XFUNC-SQL/div[12]/p[27]", "#XFUNC-SQL/div[12]/p[28]", "#XFUNC-SQL/div[12]/p[3]", "#XFUNC-SQL/div[12]/p[5]", "#XFUNC-SQL/div[12]/p[6]", "#XFUNC-SQL/div[12]/p[8]", "#XFUNC-SQL/div[13]/p[11]", "#XFUNC-SQL/div[13]/p[2]", "#XFUNC-SQL/div[13]/p[4]", "#XFUNC-SQL/div[13]/p[6]", "#XFUNC-SQL/div[13]/p[8]", "#XFUNC-SQL/div[13]/p[9]", "#XFUNC-SQL/div[14]/p[10]", "#XFUNC-SQL/div[14]/p[11]", "#XFUNC-SQL/div[14]/p[13]", "#XFUNC-SQL/div[14]/p[14]", "#XFUNC-SQL/div[14]/p[16]", "#XFUNC-SQL/div[14]/p[3]", "#XFUNC-SQL/div[14]/p[5]", "#XFUNC-SQL/div[14]/p[7]", "#XFUNC-SQL/div[14]/p[8]", "#XFUNC-SQL/div[15]/p[2]", "#XFUNC-SQL/div[15]/p[3]", "#XFUNC-SQL/div[15]/p[5]", "#XFUNC-SQL/div[16]/p[1]", "#XFUNC-SQL/div[16]/p[2]", "#XFUNC-SQL/div[16]/p[4]", "#XFUNC-SQL/div[16]/p[5]", "#XFUNC-SQL/div[17]/div[28]/p[1]", "#XFUNC-SQL/div[17]/div[29]/p[1]", "#XFUNC-SQL/div[17]/div[29]/p[3]", "#XFUNC-SQL/div[17]/div[29]/p[5]", "#XFUNC-SQL/div[17]/p[10]", "#XFUNC-SQL/div[17]/p[12]", "#XFUNC-SQL/div[17]/p[13]", "#XFUNC-SQL/div[17]/p[15]", "#XFUNC-SQL/div[17]/p[16]", "#XFUNC-SQL/div[17]/p[18]", "#XFUNC-SQL/div[17]/p[20]", "#XFUNC-SQL/div[17]/p[21]", "#XFUNC-SQL/div[17]/p[22]", "#XFUNC-SQL/div[17]/p[24]", "#XFUNC-SQL/div[17]/p[25]", "#XFUNC-SQL/div[17]/p[2]", "#XFUNC-SQL/div[17]/p[3]", "#XFUNC-SQL/div[17]/p[5]", "#XFUNC-SQL/div[17]/p[7]", "#XFUNC-SQL/div[17]/p[9]", "#XFUNC-SQL/div[18]/p[2]", "#XFUNC-SQL/div[18]/p[3]", "#XFUNC-SQL/div[18]/p[5]", "#XFUNC-SQL/div[19]/p[1]", "#XFUNC-SQL/div[19]/p[3]", "#XFUNC-SQL/div[19]/p[5]", "#XFUNC-SQL/div[19]/p[7]", "#XFUNC-SQL/div[19]/p[9]", "#XFUNC-SQL/div[1]/dl[0]/dt[0]", "#XFUNC-SQL/div[1]/dl[0]/dt[10]", "#XFUNC-SQL/div[1]/dl[0]/dt[1]", "#XFUNC-SQL/div[1]/dl[0]/dt[2]", "#XFUNC-SQL/div[1]/dl[0]/dt[3]", "#XFUNC-SQL/div[1]/dl[0]/dt[4]", "#XFUNC-SQL/div[1]/dl[0]/dt[5]", "#XFUNC-SQL/div[1]/dl[0]/dt[6]", "#XFUNC-SQL/div[1]/dl[0]/dt[7]", "#XFUNC-SQL/div[1]/dl[0]/dt[8]", "#XFUNC-SQL/div[1]/dl[0]/dt[9]", "#XFUNC-SQL/div[20]/p[10]", "#XFUNC-SQL/div[20]/p[2]", "#XFUNC-SQL/div[20]/p[4]", "#XFUNC-SQL/div[20]/p[6]", "#XFUNC-SQL/div[20]/p[8]", "#XFUNC-SQL/div[20]/p[9]", "#XFUNC-SQL/div[8]/h3[0]", "#XFUNC-SQL/div[8]/p[1]", "#XFUNC-SQL/p[3]", "#XFUNC-SQL/p[4]", "#XFUNC-SQL/p[5]", "#XFUNC-SQL/p[6]", "#XFUNC-SQL/p[9]"]}], "language": "zh", "original_text": {"/versions/12/description/0": "SQL-language functions", "/versions/12/facts/0/label": "Kind", "/versions/12/facts/0/value": "Native function language", "/versions/12/facts/1/label": "Trusted", "/versions/12/facts/2/label": "Validator"}, "fallback_fields": [], "source_language": "en", "original_snapshot_sha256": "6eea27106be25abb2c4d915e2b9d94574355d1ce0cf1a4349932f8a8dcac78dc"}, "comparison_data": {"kind": "Native function language", "handler": "", "trusted": "t", "validator": "fmgr_sql_validator"}, "comparison_hash": "a4af9cf453d140d941e865b952c6a41e2b704a4b30cb77b61c1cdda8a77c5035", "manual_language": "zh"}, "13": {"facts": [{"label": "\u79cd\u7c7b", "value": "\u539f\u751f\u51fd\u6570\u8bed\u8a00"}, {"label": "\u53ef\u4fe1", "value": "t"}, {"label": "\u6821\u9a8c\u51fd\u6570", "value": "fmgr_sql_validator"}], "tables": [], "aliases": [], "catalog": {"oid": "14", "descr": "SQL-language functions", "lanacl": "_null_", "lanispl": "f", "lanname": "sql", "lanowner": "PGUID", "laninline": "0", "oid_symbol": "SQLlanguageId", "lanpltrusted": "t", "lanvalidator": "fmgr_sql_validator", "lanplcallfoid": "0"}, "related": [], "release": {"ref": "https://ftp.postgresql.org/pub/source/v13.23/postgresql-13.23.tar.bz2", "label": "13.23", "major": "13", "channel": "historical", "revision": "6ec3c82726af92b7dec873fa1cdf881eca92a4219787dfad05acb6b10e041fd6", "source_sha256": "6ec3c82726af92b7dec873fa1cdf881eca92a4219787dfad05acb6b10e041fd6", "catalog_fingerprint": "c7015c845255c9d721c547c8ab9ef37825d332588c9691d982e6906b7d571002"}, "sources": [{"url": "https://ftp.postgresql.org/pub/source/v13.23/postgresql-13.23.tar.bz2", "label": "Matching PostgreSQL source archive", "sha256": "6ec3c82726af92b7dec873fa1cdf881eca92a4219787dfad05acb6b10e041fd6"}, {"url": "https://pg.center/docs/13/xfunc-sql.html", "path": "xfunc-sql.html", "label": "PostgreSQL 13 English manual", "sha256": "01d47aa90d23d6b6569afbd2b414fb29b759c05e562ff158d9f31e28cb56800f", "language": "en", "original_url": "/docs/13/xfunc-sql.html"}], "sections": [], "signature": "", "attributes": {"kind": "Native function language", "handler": "", "trusted": "t", "validator": "fmgr_sql_validator"}, "description": ["SQL \u8bed\u8a00\u51fd\u6570"], "manual_html": "<div class=\"sect1\" id=\"XFUNC-SQL\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h2 class=\"title\" lang=\"zh\">37.5. \u67e5\u8be2\u8bed\u8a00\uff08SQL\uff09\u51fd\u6570</h2>\n</div>\n</div>\n</div>\n<p lang=\"zh\">SQL \u51fd\u6570\u6267\u884c\u7531\u4efb\u610f SQL \u8bed\u53e5\u7ec4\u6210\u7684\u4e00\u4e2a\u5217\u8868\uff0c\u5e76\u8fd4\u56de\u5217\u8868\u4e2d\u6700\u540e\u4e00\u4e2a\u67e5\u8be2\u7684\u7ed3\u679c\u3002\u5728\u7b80\u5355\uff08\u975e\u96c6\u5408\uff09\u60c5\u51b5\u4e0b\uff0c\u5c06\u8fd4\u56de\u6700\u540e\u4e00\u4e2a\u67e5\u8be2\u7ed3\u679c\u7684\u7b2c\u4e00\u884c\u3002\uff08\u8bf7\u8bb0\u4f4f\uff0c\u9664\u975e\u4f7f\u7528 <code class=\"literal\">ORDER BY</code>\uff0c\u5426\u5219\u591a\u884c\u7ed3\u679c\u4e2d\u7684<span class=\"quote\">\u201c<span class=\"quote\">\u7b2c\u4e00\u884c</span>\u201d</span>\u5e76\u6ca1\u6709\u660e\u786e\u5b9a\u4e49\u3002\uff09\u5982\u679c\u6700\u540e\u4e00\u4e2a\u67e5\u8be2\u5b8c\u5168\u6ca1\u6709\u8fd4\u56de\u4efb\u4f55\u884c\uff0c\u5219\u8fd4\u56de\u7a7a\u503c\u3002</p>\n<p lang=\"zh\">\u6216\u8005\uff0c\u4e00\u4e2a SQL \u51fd\u6570\u53ef\u4ee5\u901a\u8fc7\u6307\u5b9a\u51fd\u6570\u7684\u8fd4\u56de\u7c7b\u578b\u4e3a<code class=\"literal\">SETOF <em class=\"replaceable\"><code>sometype</code></em></code>\u88ab\u58f0\u660e\u4e3a\u8fd4\u56de\u4e00\u4e2a\u96c6\u5408\uff08\u4e5f\u5c31\u662f\u591a\u4e2a\u884c\uff09\uff0c\u6216\u8005\u7b49\u6548\u5730\u58f0\u660e\u5b83\u4e3a<code class=\"literal\">RETURNS TABLE(<em class=\"replaceable\"><code>columns</code></em>)</code>\u3002\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b\uff0c\u6700\u540e\u4e00\u4e2a\u67e5\u8be2\u7684\u7ed3\u679c\u7684\u6240\u6709\u884c\u4f1a\u88ab\u8fd4\u56de\u3002\u4e0b\u6587\u5c06\u7ed9\u51fa\u8fdb\u4e00\u6b65\u7684\u7ec6\u8282\u3002</p>\n<p lang=\"zh\">SQL \u51fd\u6570\u7684\u51fd\u6570\u4f53\u5fc5\u987b\u662f\u4e00\u4e2a\u7531\u5206\u53f7\u5206\u9694\u7684 SQL \u8bed\u53e5\u5217\u8868\u3002\u6700\u540e\u4e00\u6761\u8bed\u53e5\u540e\u7684\u5206\u53f7\u662f\u53ef\u9009\u7684\u3002\u9664\u975e\u8be5\u51fd\u6570\u88ab\u58f0\u660e\u4e3a\u8fd4\u56de <code class=\"type\">void</code>\uff0c\u5426\u5219\u6700\u540e\u4e00\u6761\u8bed\u53e5\u5fc5\u987b\u662f <code class=\"command\">SELECT</code>\uff0c\u6216\u8005\u662f <code class=\"command\">INSERT</code>\u3001<code class=\"command\">UPDATE</code> \u6216 <code class=\"command\">DELETE</code> \u5e76\u5e26\u6709 <code class=\"literal\">RETURNING</code> \u5b50\u53e5\u3002</p>\n<p lang=\"zh\">\u4efb\u610f\u4e00\u7ec4 <acronym class=\"acronym\">SQL</acronym> \u8bed\u8a00\u547d\u4ee4\u90fd\u53ef\u4ee5\u6253\u5305\u5e76\u5b9a\u4e49\u6210\u51fd\u6570\u3002\u9664 <code class=\"command\">SELECT</code> \u67e5\u8be2\u5916\uff0c\u8fd9\u4e9b\u547d\u4ee4\u8fd8\u53ef\u4ee5\u5305\u542b\u6570\u636e\u4fee\u6539\u67e5\u8be2\uff08<code class=\"command\">INSERT</code>\uff0c<code class=\"command\">UPDATE</code>\u3001<code class=\"command\">DELETE</code>\uff09\uff0c\u4ee5\u53ca\u5176\u4ed6 SQL \u547d\u4ee4\u3002\uff08\u4e0d\u80fd\u4f7f\u7528\u4e8b\u52a1\u63a7\u5236\u547d\u4ee4\uff0c\u4f8b\u5982 <code class=\"command\">COMMIT</code>\uff0c<code class=\"command\">SAVEPOINT</code>\uff0c\u4ee5\u53ca\u67d0\u4e9b\u5de5\u5177\u547d\u4ee4\uff0c\u4f8b\u5982 <code class=\"literal\">VACUUM</code>\uff0c\u6765\u7f16\u5199 <acronym class=\"acronym\">SQL</acronym> \u51fd\u6570\u3002\uff09\u4e0d\u8fc7\uff0c\u6700\u540e\u4e00\u6761\u547d\u4ee4\u5fc5\u987b\u662f <code class=\"command\">SELECT</code>\uff0c\u6216\u8005\u5e26\u6709 <code class=\"literal\">RETURNING</code> \u5b50\u53e5\uff0c\u5e76\u8fd4\u56de\u4e0e\u51fd\u6570\u58f0\u660e\u8fd4\u56de\u7c7b\u578b\u76f8\u7b26\u7684\u7ed3\u679c\u3002\u6216\u8005\uff0c\u5982\u679c\u4f60\u60f3\u5b9a\u4e49\u4e00\u4e2a\u6267\u884c\u52a8\u4f5c\u4f46\u6ca1\u6709\u6709\u7528\u8fd4\u56de\u503c\u7684 SQL \u51fd\u6570\uff0c\u4e5f\u53ef\u4ee5\u628a\u5b83\u5b9a\u4e49\u4e3a\u8fd4\u56de <code class=\"type\">void</code>\u3002\u4f8b\u5982\uff0c\u4e0b\u9762\u8fd9\u4e2a\u51fd\u6570\u4f1a\u5220\u9664 <code class=\"literal\">emp</code> \u8868\u4e2d\u85aa\u8d44\u4e3a\u8d1f\u7684\u884c\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION clean_emp() RETURNS void AS '\n    DELETE FROM emp\n        WHERE salary &lt; 0;\n' LANGUAGE SQL;\n\nSELECT clean_emp();\n\n clean_emp\n-----------\n\n(1 row)\n</pre>\n<div class=\"note\">\n<h3 class=\"title\" lang=\"zh\">\u6ce8\u610f</h3>\n<p lang=\"zh\">SQL \u51fd\u6570\u7684\u6574\u4e2a\u51fd\u6570\u4f53\u90fd\u4f1a\u5148\u7ecf\u8fc7\u89e3\u6790\uff0c\u7136\u540e\u624d\u5f00\u59cb\u6267\u884c\u3002\u867d\u7136 SQL \u51fd\u6570\u53ef\u4ee5\u5305\u542b\u4fee\u6539\u7cfb\u7edf\u76ee\u5f55\u7684\u547d\u4ee4\uff08\u4f8b\u5982 <code class=\"command\">CREATE TABLE</code>\uff09\uff0c\u4f46\u5728\u5bf9\u51fd\u6570\u4e2d\u7684\u540e\u7eed\u547d\u4ee4\u8fdb\u884c\u89e3\u6790\u5206\u6790\u65f6\uff0c\u8fd9\u4e9b\u547d\u4ee4\u7684\u6548\u679c\u8fd8\u4e0d\u53ef\u89c1\u3002\u56e0\u6b64\uff0c\u4f8b\u5982\u5c06 <code class=\"literal\">CREATE TABLE foo (...); INSERT INTO foo VALUES(...);</code> \u6253\u5305\u5230\u540c\u4e00\u4e2a SQL \u51fd\u6570\u4e2d\uff0c\u5c31\u4e0d\u4f1a\u6309\u9884\u671f\u5de5\u4f5c\uff0c\u56e0\u4e3a <code class=\"structname\">foo</code> \u5728\u89e3\u6790 <code class=\"command\">INSERT</code> \u547d\u4ee4\u65f6\u8fd8\u4e0d\u5b58\u5728\u3002\u5728\u8fd9\u7c7b\u60c5\u51b5\u4e0b\uff0c\u5efa\u8bae\u4f7f\u7528 <span class=\"application\">PL/pgSQL</span> \u800c\u4e0d\u662f SQL \u51fd\u6570\u3002</p>\n</div>\n<p lang=\"zh\"><code class=\"command\">CREATE FUNCTION</code> \u547d\u4ee4\u7684\u8bed\u6cd5\u8981\u6c42\u628a\u51fd\u6570\u4f53\u5199\u6210\u4e00\u4e2a\u5b57\u7b26\u4e32\u5e38\u91cf\u3002\u5bf9\u4e8e\u5b57\u7b26\u4e32\u5e38\u91cf\uff0c\u901a\u5e38\u4f7f\u7528\u7f8e\u5143\u5f15\u7528\u6700\u65b9\u4fbf\uff08\u89c1<a class=\"xref\" href=\"/docs/13/sql-syntax.html#SQL-SYNTAX-DOLLAR-QUOTING\" title=\"4.1.2.4.\u00a0\u7f8e\u5143\u5f15\u7528\u7684\u5b57\u7b26\u4e32\u5e38\u91cf\">\u7b2c\u00a04.1.2.4\u00a0\u8282</a>\uff09\u3002\u5982\u679c\u4f60\u9009\u62e9\u4f7f\u7528\u5e38\u89c4\u7684\u5355\u5f15\u53f7\u5b57\u7b26\u4e32\u5e38\u91cf\u8bed\u6cd5\uff0c\u90a3\u4e48\u5fc5\u987b\u5728\u51fd\u6570\u4f53\u4e2d\u5c06\u5355\u5f15\u53f7\uff08<code class=\"literal\">'</code>\uff09\u548c\u53cd\u659c\u7ebf\uff08<code class=\"literal\">\\</code>\uff09\u5199\u6210\u53cc\u4efd\uff08\u5047\u5b9a\u4f7f\u7528\u8f6c\u4e49\u5b57\u7b26\u4e32\u8bed\u6cd5\uff0c\u89c1<a class=\"xref\" href=\"/docs/13/sql-syntax.html#SQL-SYNTAX-STRINGS\" title=\"4.1.2.1.\u00a0\u5b57\u7b26\u4e32\u5e38\u91cf\">\u7b2c\u00a04.1.2.1\u00a0\u8282</a>\uff09\u3002</p>\n<div class=\"sect2\" id=\"XFUNC-SQL-FUNCTION-ARGUMENTS\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/13/xfunc-sql.html#XFUNC-SQL-FUNCTION-ARGUMENTS\">37.5.1. <acronym class=\"acronym\">SQL</acronym>\u51fd\u6570\u7684\u53c2\u6570</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\">\u4e00\u4e2a SQL \u51fd\u6570\u7684\u53c2\u6570\u53ef\u4ee5\u5728\u51fd\u6570\u4f53\u4e2d\u7528\u540d\u79f0\u6216\u7f16\u53f7\u5f15\u7528\u3002\u4e0b\u9762\u4f1a\u6709\u4e24\u79cd\u65b9\u6cd5\u7684\u793a\u4f8b\u3002</p>\n<p lang=\"zh\">\u8981\u4f7f\u7528\u4e00\u4e2a\u540d\u79f0\uff0c\u5c06\u51fd\u6570\u53c2\u6570\u58f0\u660e\u4e3a\u5e26\u6709\u4e00\u4e2a\u540d\u79f0\uff0c\u7136\u540e\u5728\u51fd\u6570\u4f53\u4e2d\u53ea\u5199\u8be5\u540d\u79f0\u3002\u5982\u679c\u53c2\u6570\u540d\u79f0\u4e0e\u51fd\u6570\u5185\u5f53\u524d SQL \u547d\u4ee4\u4e2d\u7684\u4efb\u610f\u5217\u540d\u76f8\u540c\uff0c\u5217\u540d\u5c06\u4f18\u5148\u3002\u5982\u679c\u4e0d\u60f3\u8fd9\u6837\uff0c\u53ef\u4ee5\u7528\u51fd\u6570\u672c\u8eab\u7684\u540d\u79f0\u6765\u9650\u5b9a\u53c2\u6570\u540d\uff0c\u4e5f\u5c31\u662f<code class=\"literal\"><em class=\"replaceable\"><code>function_name</code></em>.<em class=\"replaceable\"><code>argument_name</code></em></code>\uff08\u5982\u679c\u8fd9\u4f1a\u4e0e\u4e00\u4e2a\u88ab\u9650\u5b9a\u7684\u5217\u540d\u51b2\u7a81\uff0c\u7167\u4f8b\u8fd8\u662f\u5217\u540d\u8d62\u5f97\u4f18\u5148\u3002\u4f60\u53ef\u4ee5\u901a\u8fc7\u4e3a SQL \u547d\u4ee4\u4e2d\u7684\u8868\u9009\u62e9\u4e00\u4e2a\u4e0d\u540c\u7684\u522b\u540d\u6765\u907f\u514d\u8fd9\u79cd\u6df7\u6dc6\uff09\u3002</p>\n<p lang=\"zh\">\u5728\u66f4\u65e7\u7684\u6570\u5b57\u65b9\u6cd5\u4e2d\uff0c\u53c2\u6570\u53ef\u4ee5\u7528\u8bed\u6cd5<code class=\"literal\">$<em class=\"replaceable\"><code>n</code></em></code>\u5f15\u7528\uff1a<code class=\"literal\">$1</code>\u6307\u7684\u662f\u7b2c\u4e00\u4e2a\u8f93\u5165\u53c2\u6570\uff0c<code class=\"literal\">$2</code>\u6307\u7684\u662f\u7b2c\u4e8c\u4e2a\uff0c\u4ee5\u6b64\u7c7b\u63a8\u3002\u4e0d\u7ba1\u7279\u5b9a\u7684\u53c2\u6570\u662f\u5426\u4f7f\u7528\u540d\u79f0\u58f0\u660e\uff0c\u8fd9\u79cd\u65b9\u6cd5\u90fd\u6709\u6548\u3002</p>\n<p lang=\"zh\">\u5982\u679c\u4e00\u4e2a\u53c2\u6570\u662f\u4e00\u79cd\u590d\u5408\u7c7b\u578b\uff0c\u90a3\u4e48\u70b9\u53f7\u8bb0\u6cd5\uff08\u5982 <code class=\"literal\"><em class=\"replaceable\"><code>argname</code></em>.<em class=\"replaceable\"><code>fieldname</code></em></code> \u6216<code class=\"literal\">$1.<em class=\"replaceable\"><code>fieldname</code></em></code>\uff09\u4e5f\u53ef\u4ee5\u88ab\u7528\u6765\u8bbf\u95ee\u8be5\u53c2\u6570\u7684\u5c5e\u6027\u3002\u540c\u6837\uff0c\u4f60\u53ef\u80fd\u9700\u8981\u7528\u51fd\u6570\u7684\u540d\u79f0\u6765\u9650\u5b9a\u53c2\u6570\u7684\u540d\u79f0\u4ee5\u907f\u514d\u6b67\u4e49\u3002</p>\n<p lang=\"zh\">SQL \u51fd\u6570\u53c2\u6570\u53ea\u80fd\u88ab\u7528\u505a\u6570\u636e\u503c\u800c\u4e0d\u80fd\u4f5c\u4e3a\u6807\u8bc6\u7b26\u3002\u4f8b\u5982\u8fd9\u662f\u5408\u7406\u7684\uff1a</p>\n<pre class=\"programlisting\">INSERT INTO mytable VALUES ($1);\n</pre>\n<p lang=\"zh\">\u4f46\u8fd9\u6837\u5c31\u4e0d\u884c\uff1a</p>\n<pre class=\"programlisting\">INSERT INTO $1 VALUES (42);\n</pre>\n<div class=\"note\">\n<h3 class=\"title\" lang=\"zh\">\u6ce8\u610f</h3>\n<p lang=\"zh\">PostgreSQL 9.2 \u5f00\u59cb\u652f\u6301\u901a\u8fc7\u540d\u79f0\u5f15\u7528 SQL \u51fd\u6570\u53c2\u6570\u3002\u9700\u8981\u7528\u4e8e\u66f4\u65e9\u7248\u672c\u670d\u52a1\u5668\u7684\u51fd\u6570\u5fc5\u987b\u4f7f\u7528 $n \u8bb0\u6cd5\u3002</p>\n</div>\n</div>\n<div class=\"sect2\" id=\"XFUNC-SQL-BASE-FUNCTIONS\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/13/xfunc-sql.html#XFUNC-SQL-BASE-FUNCTIONS\">37.5.2. \u57fa\u7840\u7c7b\u578b\u4e0a\u7684<acronym class=\"acronym\">SQL</acronym>\u51fd\u6570</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\">\u6700\u7b80\u5355\u7684 <acronym class=\"acronym\">SQL</acronym> \u51fd\u6570\u6ca1\u6709\u53c2\u6570\uff0c\u53ea\u662f\u8fd4\u56de\u4e00\u4e2a\u57fa\u7840\u7c7b\u578b\uff0c\u4f8b\u5982 <code class=\"type\">integer</code>\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION one() RETURNS integer AS $$\n    SELECT 1 AS result;\n$$ LANGUAGE SQL;\n\n-- Alternative syntax for string literal:\nCREATE FUNCTION one() RETURNS integer AS '\n    SELECT 1 AS result;\n' LANGUAGE SQL;\n\nSELECT one();\n\n one\n-----\n   1\n</pre>\n<p lang=\"zh\">\u6ce8\u610f\u6211\u4eec\u4e3a\u8be5\u51fd\u6570\u7684\u7ed3\u679c\u5728\u51fd\u6570\u4f53\u5185\u5b9a\u4e49\u4e86\u4e00\u4e2a\u5217\u522b\u540d\uff08\u540d\u4e3a<code class=\"literal\">result</code>\uff09\uff0c\u4f46\u662f\u8fd9\u4e2a\u5217\u522b\u540d\u5728\u51fd\u6570\u4ee5\u5916\u662f\u4e0d\u53ef\u89c1\u7684\u3002\u56e0\u6b64\uff0c\u7ed3\u679c\u88ab\u6807\u8bb0\u4e3a<code class=\"literal\">one</code>\u800c\u4e0d\u662f<code class=\"literal\">result</code>\u3002</p>\n<p lang=\"zh\">\u5b9a\u4e49\u63a5\u53d7\u57fa\u7840\u7c7b\u578b\u53c2\u6570\u7684 <acronym class=\"acronym\">SQL</acronym> \u51fd\u6570\u4e5f\u51e0\u4e4e\u540c\u6837\u5bb9\u6613\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION add_em(x integer, y integer) RETURNS integer AS $$\n    SELECT x + y;\n$$ LANGUAGE SQL;\n\nSELECT add_em(1, 2) AS answer;\n\n answer\n--------\n      3\n</pre>\n<p lang=\"zh\">\u6216\u8005\uff0c\u6211\u4eec\u4e5f\u53ef\u4ee5\u4e0d\u7528\u53c2\u6570\u540d\uff0c\u800c\u6539\u7528\u6570\u5b57\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION add_em(integer, integer) RETURNS integer AS $$\n    SELECT $1 + $2;\n$$ LANGUAGE SQL;\n\nSELECT add_em(1, 2) AS answer;\n\n answer\n--------\n      3\n</pre>\n<p lang=\"zh\">\u4e0b\u9762\u662f\u4e00\u4e2a\u66f4\u6709\u7528\u7684\u51fd\u6570\uff0c\u5b83\u53ef\u4ee5\u7528\u6765\u4ece\u94f6\u884c\u8d26\u6237\u4e2d\u6263\u6b3e\uff1a</p>\n<pre class=\"programlisting\">CREATE FUNCTION tf1 (accountno integer, debit numeric) RETURNS numeric AS $$\n    UPDATE bank\n        SET balance = balance - debit\n        WHERE accountno = tf1.accountno;\n    SELECT 1;\n$$ LANGUAGE SQL;\n</pre>\n<p lang=\"zh\">\u7528\u6237\u53ef\u4ee5\u8fd9\u6837\u6267\u884c\u8be5\u51fd\u6570\uff0c\u4ece 17 \u53f7\u8d26\u6237\u4e2d\u6263\u9664 $100.00\uff1a</p>\n<pre class=\"programlisting\">SELECT tf1(17, 100.0);\n</pre>\n<p lang=\"zh\">\u5728\u8fd9\u4e2a\u793a\u4f8b\u4e2d\uff0c\u6211\u4eec\u4e3a\u7b2c\u4e00\u4e2a\u53c2\u6570\u9009\u62e9\u4e86\u540d\u79f0<code class=\"literal\">accountno</code>\uff0c\u4f46\u662f\u8fd9\u548c\u8868<code class=\"literal\">bank</code>\u4e2d\u7684\u4e00\u4e2a\u5217\u540d\u76f8\u540c\u3002\u5728<code class=\"command\">UPDATE</code>\u547d\u4ee4\u4e2d\uff0c<code class=\"literal\">accountno</code>\u5f15\u7528\u5217<code class=\"literal\">bank.accountno</code>\uff0c\u56e0\u6b64 <code class=\"literal\">tf1.accountno</code>\u5fc5\u987b\u88ab\u7528\u6765\u5f15\u7528\u8be5\u53c2\u6570\u3002\u6211\u4eec\u5f53\u7136\u53ef\u4ee5\u901a\u8fc7\u4e3a\u8be5\u53c2\u6570\u4f7f\u7528\u4e00\u4e2a\u4e0d\u540c\u7684\u540d\u79f0\u6765\u907f\u514d\u8fd9\u6837\u7684\u95ee\u9898\u3002</p>\n<p lang=\"zh\">\u5b9e\u9645\u4e0a\u6211\u4eec\u53ef\u80fd\u559c\u6b22\u4ece\u8be5\u51fd\u6570\u5f97\u5230\u4e00\u4e2a\u66f4\u6709\u7528\u7684\u7ed3\u679c\u800c\u4e0d\u662f\u4e00\u4e2a\u5e38\u6570 1\uff0c\u56e0\u6b64\u4e00\u4e2a\u66f4\u53ef\u80fd\u7684\u5b9a\u4e49\u662f\uff1a</p>\n<pre class=\"programlisting\">CREATE FUNCTION tf1 (accountno integer, debit numeric) RETURNS numeric AS $$\n    UPDATE bank\n        SET balance = balance - debit\n        WHERE accountno = tf1.accountno;\n    SELECT balance FROM bank WHERE accountno = tf1.accountno;\n$$ LANGUAGE SQL;\n</pre>\n<p lang=\"zh\">\u5b83\u4f1a\u8c03\u6574\u4f59\u989d\u5e76\u4e14\u8fd4\u56de\u65b0\u7684\u4f59\u989d\u3002\u540c\u6837\u7684\u4e8b\u60c5\u4e5f\u53ef\u4ee5\u7528\u4e00\u4e2a\u4f7f\u7528<code class=\"literal\">RETURNING</code>\u7684\u547d\u4ee4\u5b9e\u73b0\uff1a</p>\n<pre class=\"programlisting\">CREATE FUNCTION tf1 (accountno integer, debit numeric) RETURNS numeric AS $$\n    UPDATE bank\n        SET balance = balance - debit\n        WHERE accountno = tf1.accountno\n    RETURNING balance;\n$$ LANGUAGE SQL;\n</pre>\n<p lang=\"zh\">\u5982\u679c\u6700\u540e\u7684 <code class=\"literal\">SELECT</code> \u6216 <code class=\"literal\">RETURNING</code> \u5b50\u53e5\u8fd4\u56de\u7684\u7c7b\u578b\uff0c\u4e0e\u8be5 <acronym class=\"acronym\">SQL</acronym> \u51fd\u6570\u58f0\u660e\u7684\u7ed3\u679c\u7c7b\u578b\u5e76\u4e0d\u5b8c\u5168\u4e00\u81f4\uff0c<span class=\"productname\">PostgreSQL</span> \u4f1a\u81ea\u52a8\u5c06\u503c\u8f6c\u6362\u4e3a\u6240\u9700\u7c7b\u578b\uff0c\u53ea\u8981\u901a\u8fc7\u9690\u5f0f\u8f6c\u6362\u6216\u8d4b\u503c\u8f6c\u6362\u53ef\u4ee5\u505a\u5230\u3002\u5426\u5219\uff0c\u5c31\u5fc5\u987b\u5199\u51fa\u663e\u5f0f\u8f6c\u6362\u3002\u4f8b\u5982\uff0c\u5047\u8bbe\u6211\u4eec\u5e0c\u671b\u524d\u9762\u7684 <code class=\"function\">add_em</code> \u51fd\u6570\u6539\u4e3a\u8fd4\u56de <code class=\"type\">float8</code>\u3002\u53ea\u9700\u5199\u6210\uff1a</p>\n<pre class=\"programlisting\">CREATE FUNCTION add_em(integer, integer) RETURNS float8 AS $$\n    SELECT $1 + $2;\n$$ LANGUAGE SQL;\n</pre>\n<p lang=\"zh\">\u56e0\u4e3a <code class=\"type\">integer</code> \u7c7b\u578b\u7684\u548c\u53ef\u4ee5\u9690\u5f0f\u8f6c\u6362\u4e3a <code class=\"type\">float8</code>\u3002\uff08\u6709\u5173\u7c7b\u578b\u8f6c\u6362\u7684\u66f4\u591a\u4fe1\u606f\uff0c\u8bf7\u53c2\u9605<a class=\"xref\" href=\"/docs/13/typeconv.html\" title=\"\u7b2c\u00a010\u00a0\u7ae0\u00a0\u7c7b\u578b\u8f6c\u6362\">\u7b2c\u00a010\u00a0\u7ae0</a>\u6216<a class=\"xref\" href=\"/docs/13/sql-createcast.html\" title=\"CREATE CAST\"><span class=\"refentrytitle\">CREATE CAST</span></a>\u3002\uff09</p>\n</div>\n<div class=\"sect2\" id=\"XFUNC-SQL-COMPOSITE-FUNCTIONS\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/13/xfunc-sql.html#XFUNC-SQL-COMPOSITE-FUNCTIONS\">37.5.3. \u590d\u5408\u7c7b\u578b\u4e0a\u7684<acronym class=\"acronym\">SQL</acronym>\u51fd\u6570</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\">\u7f16\u5199\u63a5\u53d7\u590d\u5408\u7c7b\u578b\u53c2\u6570\u7684\u51fd\u6570\u65f6\uff0c\u6211\u4eec\u4e0d\u4ec5\u5fc5\u987b\u6307\u5b9a\u8981\u7528\u54ea\u4e2a\u53c2\u6570\uff0c\u8fd8\u5fc5\u987b\u6307\u5b9a\u8be5\u53c2\u6570\u7684\u54ea\u4e2a\u5c5e\u6027\uff08\u5b57\u6bb5\uff09\u3002\u4f8b\u5982\uff0c\u5047\u8bbe <code class=\"type\">emp</code> \u662f\u4e00\u4e2a\u5305\u542b\u96c7\u5458\u6570\u636e\u7684\u8868\uff0c\u56e0\u6b64\u5b83\u4e5f\u662f\u8be5\u8868\u6bcf\u4e00\u884c\u5bf9\u5e94\u7684\u590d\u5408\u7c7b\u578b\u540d\u79f0\u3002\u4e0b\u9762\u7684\u51fd\u6570 <code class=\"function\">double_salary</code> \u7528\u6765\u8ba1\u7b97\u67d0\u4eba\u7684\u5de5\u8d44\u7ffb\u500d\u540e\u4f1a\u662f\u591a\u5c11\uff1a</p>\n<pre class=\"screen\">CREATE TABLE emp (\n    name        text,\n    salary      numeric,\n    age         integer,\n    cubicle     point\n);\n\nINSERT INTO emp VALUES ('Bill', 4200, 45, '(2,1)');\n\nCREATE FUNCTION double_salary(emp) RETURNS numeric AS $$\n    SELECT $1.salary * 2 AS salary;\n$$ LANGUAGE SQL;\n\nSELECT name, double_salary(emp.*) AS dream\n    FROM emp\n    WHERE emp.cubicle ~= point '(2,1)';\n\n name | dream\n------+-------\n Bill |  8400\n</pre>\n<p lang=\"zh\">\u6ce8\u610f\u8fd9\u91cc\u7528 <code class=\"literal\">$1.salary</code> \u8bed\u6cd5\u6765\u9009\u53d6\u53c2\u6570\u884c\u503c\u4e2d\u7684\u4e00\u4e2a\u5b57\u6bb5\u3002\u8fd8\u8981\u6ce8\u610f\uff0c\u8c03\u7528\u65f6\u7684 <code class=\"command\">SELECT</code> \u547d\u4ee4\u4f7f\u7528 <em class=\"replaceable\"><code>table_name</code></em><code class=\"literal\">.*</code> \u5c06\u8868\u7684\u5f53\u524d\u6574\u884c\u53d6\u4f5c\u4e00\u4e2a\u590d\u5408\u503c\u3002\u8be5\u8868\u884c\u4e5f\u53ef\u4ee5\u4ec5\u7528\u8868\u540d\u6765\u5f15\u7528\uff1a</p>\n<pre class=\"screen\">SELECT name, double_salary(emp) AS dream\n    FROM emp\n    WHERE emp.cubicle ~= point '(2,1)';\n</pre>\n<p lang=\"zh\">\u4f46\u8fd9\u79cd\u7528\u6cd5\u5df2\u88ab\u5f03\u7528\uff0c\u56e0\u4e3a\u5b83\u5f88\u5bb9\u6613\u8ba9\u4eba\u6df7\u6dc6\uff08\u5173\u4e8e\u8868\u884c\u590d\u5408\u503c\u8fd9\u4e24\u79cd\u8bb0\u6cd5\u7684\u66f4\u591a\u7ec6\u8282\uff0c\u89c1<a class=\"xref\" href=\"/docs/13/rowtypes.html#ROWTYPES-USAGE\" title=\"8.16.5.\u00a0\u5728\u67e5\u8be2\u4e2d\u4f7f\u7528\u590d\u5408\u7c7b\u578b\">\u7b2c\u00a08.16.5\u00a0\u8282</a>\uff09\u3002</p>\n<p lang=\"zh\">\u6709\u65f6\u5019\u5373\u65f6\u6784\u9020\u4e00\u4e2a\u590d\u5408\u53c2\u6570\u503c\u4f1a\u5f88\u65b9\u4fbf\u3002\u8fd9\u53ef\u4ee5\u7528<code class=\"literal\">ROW</code>\u6784\u9020\u5668\u5b8c\u6210\u3002\u4f8b\u5982\uff0c\u6211\u4eec\u53ef\u4ee5\u8c03\u6574\u88ab\u4f20\u9012\u7ed9\u51fd\u6570\u7684\u6570\u636e\uff1a</p>\n<pre class=\"screen\">SELECT name, double_salary(ROW(name, salary*1.1, age, cubicle)) AS dream\n    FROM emp;\n</pre>\n<p lang=\"zh\">\u4e5f\u53ef\u4ee5\u6784\u5efa\u4e00\u4e2a\u8fd4\u56de\u590d\u5408\u7c7b\u578b\u7684\u51fd\u6570\u3002\u8fd9\u662f\u4e00\u4e2a\u8fd4\u56de\u5355\u4e00<code class=\"type\">emp</code>\u884c\u7684\u51fd\u6570\u793a\u4f8b\uff1a</p>\n<pre class=\"programlisting\">CREATE FUNCTION new_emp() RETURNS emp AS $$\n    SELECT text 'None' AS name,\n        1000.0 AS salary,\n        25 AS age,\n        point '(2,2)' AS cubicle;\n$$ LANGUAGE SQL;\n</pre>\n<p lang=\"zh\">\u5728\u8fd9\u4e2a\u793a\u4f8b\u4e2d\uff0c\u6211\u4eec\u4e3a\u6bcf\u4e00\u4e2a\u5c5e\u6027\u6307\u5b9a\u4e86\u4e00\u4e2a\u5e38\u91cf\u503c\uff0c\u4f46\u662f\u53ef\u4ee5\u7528\u4efb\u4f55\u8ba1\u7b97\u6765\u66ff\u6362\u8fd9\u4e9b\u5e38\u91cf\u3002</p>\n<p lang=\"zh\">\u5b9a\u4e49\u8be5\u51fd\u6570\u65f6\u6709\u4e24\u70b9\u91cd\u8981\u6ce8\u610f\u4e8b\u9879\uff1a</p>\n<div class=\"itemizedlist\">\n<ul class=\"itemizedlist\">\n<li class=\"listitem\" lang=\"zh\">\n<p>\u67e5\u8be2\u4e2d\u7684\u9009\u62e9\u5217\u8868\u987a\u5e8f\u5fc5\u987b\u4e0e\u5217\u5728\u590d\u5408\u7c7b\u578b\u4e2d\u51fa\u73b0\u7684\u987a\u5e8f\u5b8c\u5168\u76f8\u540c\u3002\uff08\u7cfb\u7edf\u4e0d\u8003\u8651\u50cf\u4e0a\u9762\u8fd9\u6837\u6307\u5b9a\u7684\u5217\u540d\u3002\uff09</p>\n</li>\n<li class=\"listitem\" lang=\"zh\">\n<p>\u6211\u4eec\u5fc5\u987b\u786e\u4fdd\u6bcf\u4e2a\u8868\u8fbe\u5f0f\u7684\u7c7b\u578b\u90fd\u53ef\u4ee5\u8f6c\u6362\u4e3a\u590d\u5408\u7c7b\u578b\u7684\u76f8\u5e94\u5217\u7684\u7c7b\u578b\u3002\u5426\u5219\u6211\u4eec\u4f1a\u5f97\u5230\u8fd9\u6837\u7684\u9519\u8bef\uff1a</p>\n<pre class=\"screen\">\n<code class=\"computeroutput\">\nERROR:  return type mismatch in function declared to return emp\nDETAIL:  Final statement returns text instead of point at column 4.\n</code>\n</pre>\n<p>\u4e0e\u57fa\u7840\u7c7b\u578b\u7684\u60c5\u51b5\u4e00\u6837\uff0c\u7cfb\u7edf\u4e0d\u4f1a\u81ea\u52a8\u63d2\u5165\u663e\u5f0f\u8f6c\u6362\uff0c\u53ea\u4f1a\u63d2\u5165\u9690\u5f0f\u6216\u8d4b\u503c\u8f6c\u6362\u3002</p>\n</li>\n</ul>\n</div>\n<p lang=\"zh\">\u5b9a\u4e49\u540c\u6837\u7684\u51fd\u6570\u7684\u4e00\u79cd\u4e0d\u540c\u7684\u65b9\u6cd5\u662f\uff1a</p>\n<pre class=\"programlisting\">CREATE FUNCTION new_emp() RETURNS emp AS $$\n    SELECT ROW('None', 1000.0, 25, '(2,2)')::emp;\n$$ LANGUAGE SQL;\n</pre>\n<p lang=\"zh\">\u8fd9\u91cc\u6211\u4eec\u5199\u4e86\u4e00\u4e2a\u53ea\u8fd4\u56de\u5355\u5217\u3001\u4e14\u8be5\u5217\u5177\u6709\u6b63\u786e\u590d\u5408\u7c7b\u578b\u7684 <code class=\"command\">SELECT</code>\u3002\u5728\u8fd9\u79cd\u573a\u666f\u4e0b\uff0c\u8fd9\u6837\u5199\u5e76\u4e0d\u89c1\u5f97\u66f4\u597d\uff0c\u4f46\u5728\u67d0\u4e9b\u60c5\u51b5\u4e0b\u4f1a\u5f88\u65b9\u4fbf \u2014 \u4f8b\u5982\uff0c\u9700\u8981\u901a\u8fc7\u8c03\u7528\u53e6\u4e00\u4e2a\u8fd4\u56de\u76ee\u6807\u590d\u5408\u503c\u7684\u51fd\u6570\u6765\u8ba1\u7b97\u7ed3\u679c\u65f6\u3002\u8fd8\u6709\u4e00\u79cd\u60c5\u51b5\u662f\uff0c\u5982\u679c\u6211\u4eec\u8981\u7f16\u5199\u7684\u51fd\u6570\u8fd4\u56de\u7684\u662f\u57fa\u4e8e\u590d\u5408\u7c7b\u578b\u7684\u57df\uff0c\u800c\u4e0d\u662f\u666e\u901a\u590d\u5408\u7c7b\u578b\uff0c\u90a3\u4e48\u5c31\u5fc5\u987b\u5199\u6210\u8fd4\u56de\u5355\u5217\u7684\u5f62\u5f0f\uff0c\u56e0\u4e3a\u6ca1\u6709\u529e\u6cd5\u8ba9\u6574\u884c\u7ed3\u679c\u53d1\u751f\u6240\u9700\u7684\u5f3a\u5236\u8f6c\u6362\u3002</p>\n<p lang=\"zh\">\u6211\u4eec\u65e2\u53ef\u4ee5\u628a\u8fd9\u4e2a\u51fd\u6570\u76f4\u63a5\u5f53\u4f5c\u503c\u8868\u8fbe\u5f0f\u8c03\u7528\uff1a</p>\n<pre class=\"screen\">SELECT new_emp();\n\n         new_emp\n--------------------------\n (None,1000.0,25,\"(2,2)\")\n</pre>\n<p lang=\"zh\">\u4e5f\u53ef\u4ee5\u628a\u5b83\u5f53\u4f5c\u8868\u51fd\u6570\u6765\u8c03\u7528\uff1a</p>\n<pre class=\"screen\">SELECT * FROM new_emp();\n\n name | salary | age | cubicle\n------+--------+-----+---------\n None | 1000.0 |  25 | (2,2)\n</pre>\n<p lang=\"zh\">\u7b2c\u4e8c\u79cd\u65b9\u5f0f\u4f1a\u5728<a class=\"xref\" href=\"/docs/13/xfunc-sql.html#XFUNC-SQL-TABLE-FUNCTIONS\" title=\"37.5.7.\u00a0SQL \u51fd\u6570\u4f5c\u4e3a\u8868\u6765\u6e90\">\u7b2c\u00a037.5.7\u00a0\u8282</a>\u4e2d\u8fdb\u4e00\u6b65\u8bf4\u660e\u3002</p>\n<p lang=\"zh\">\u5f53\u4f60\u4f7f\u7528\u8fd4\u56de\u590d\u5408\u7c7b\u578b\u7684\u51fd\u6570\u65f6\uff0c\u53ef\u80fd\u53ea\u9700\u8981\u53d6\u5176\u7ed3\u679c\u4e2d\u7684\u4e00\u4e2a\u5b57\u6bb5\uff08\u5c5e\u6027\uff09\u3002\u53ef\u4ee5\u4f7f\u7528\u4e0b\u9762\u8fd9\u6837\u7684\u8bed\u6cd5\uff1a</p>\n<pre class=\"screen\">SELECT (new_emp()).name;\n\n name\n------\n None\n</pre>\n<p lang=\"zh\">\u8fd9\u91cc\u9700\u8981\u989d\u5916\u7684\u62ec\u53f7\uff0c\u4ee5\u514d\u89e3\u6790\u5668\u4ea7\u751f\u6b67\u4e49\u3002\u5982\u679c\u4e0d\u52a0\u62ec\u53f7\uff0c\u7ed3\u679c\u4f1a\u662f\u8fd9\u6837\uff1a</p>\n<pre class=\"screen\">SELECT new_emp().name;\nERROR:  syntax error at or near \".\"\nLINE 1: SELECT new_emp().name;\n                        ^\n</pre>\n<p lang=\"zh\">\u53e6\u4e00\u79cd\u9009\u62e9\u662f\u4f7f\u7528\u51fd\u6570\u8bb0\u6cd5\u6765\u63d0\u53d6\u5c5e\u6027\uff1a</p>\n<pre class=\"screen\">SELECT name(new_emp());\n\n name\n------\n None\n</pre>\n<p lang=\"zh\">\u5982<a class=\"xref\" href=\"/docs/13/rowtypes.html#ROWTYPES-USAGE\" title=\"8.16.5.\u00a0\u5728\u67e5\u8be2\u4e2d\u4f7f\u7528\u590d\u5408\u7c7b\u578b\">\u7b2c\u00a08.16.5\u00a0\u8282</a>\u6240\u8ff0\uff0c\u5b57\u6bb5\u8bb0\u6cd5\u548c\u51fd\u6570\u8bb0\u6cd5\u662f\u7b49\u4ef7\u7684\u3002</p>\n<p lang=\"zh\">\u53e6\u4e00\u79cd\u4f7f\u7528\u51fd\u6570\u8fd4\u56de\u590d\u5408\u7c7b\u578b\u7684\u65b9\u6cd5\u662f\u5c06\u7ed3\u679c\u4f20\u9012\u7ed9\u53e6\u4e00\u4e2a\u63a5\u53d7\u6b63\u786e\u884c\u7c7b\u578b\u4f5c\u4e3a\u8f93\u5165\u7684\u51fd\u6570\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION getname(emp) RETURNS text AS $$\n    SELECT $1.name;\n$$ LANGUAGE SQL;\n\nSELECT getname(new_emp());\n getname\n---------\n None\n(1 row)\n</pre>\n</div>\n<div class=\"sect2\" id=\"XFUNC-OUTPUT-PARAMETERS\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/13/xfunc-sql.html#XFUNC-OUTPUT-PARAMETERS\">37.5.4. \u5e26\u6709\u8f93\u51fa\u53c2\u6570\u7684<acronym class=\"acronym\">SQL</acronym>\u51fd\u6570</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\">\u63cf\u8ff0\u51fd\u6570\u7ed3\u679c\u7684\u53e6\u4e00\u79cd\u65b9\u6cd5\u662f\u4f7f\u7528<em class=\"firstterm\">\u8f93\u51fa\u53c2\u6570</em>\uff0c\u4f8b\u5982\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION add_em (IN x int, IN y int, OUT sum int)\nAS 'SELECT x + y'\nLANGUAGE SQL;\n\nSELECT add_em(3,7);\n add_em\n--------\n     10\n(1 row)\n</pre>\n<p lang=\"zh\">\u8fd9\u4e0e<a class=\"xref\" href=\"/docs/13/xfunc-sql.html#XFUNC-SQL-BASE-FUNCTIONS\" title=\"37.5.2.\u00a0\u57fa\u7840\u7c7b\u578b\u4e0a\u7684SQL\u51fd\u6570\">\u7b2c\u00a037.5.2\u00a0\u8282</a>\u4e2d\u5c55\u793a\u7684 <code class=\"literal\">add_em</code> \u7248\u672c\u672c\u8d28\u4e0a\u5e76\u65e0\u4e0d\u540c\u3002\u8f93\u51fa\u53c2\u6570\u7684\u771f\u6b63\u4ef7\u503c\u5728\u4e8e\uff0c\u5b83\u4eec\u4e3a\u5b9a\u4e49\u8fd4\u56de\u591a\u5217\u7684\u51fd\u6570\u63d0\u4f9b\u4e86\u4e00\u79cd\u65b9\u4fbf\u7684\u65b9\u6cd5\u3002\u4f8b\u5982\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION sum_n_product (x int, y int, OUT sum int, OUT product int)\nAS 'SELECT x + y, x * y'\nLANGUAGE SQL;\n\n SELECT * FROM sum_n_product(11,42);\n sum | product\n-----+---------\n  53 |     462\n(1 row)\n</pre>\n<p lang=\"zh\">\u8fd9\u91cc\u672c\u8d28\u4e0a\u53d1\u751f\u7684\u4e8b\u60c5\u662f\uff1a\u6211\u4eec\u4e3a\u8be5\u51fd\u6570\u7684\u7ed3\u679c\u521b\u5efa\u4e86\u4e00\u4e2a\u533f\u540d\u590d\u5408\u7c7b\u578b\u3002\u4e0a\u9762\u7684\u793a\u4f8b\u4e0e\u4e0b\u9762\u8fd9\u79cd\u5199\u6cd5\u7684\u6700\u7ec8\u6548\u679c\u76f8\u540c\uff1a</p>\n<pre class=\"screen\">CREATE TYPE sum_prod AS (sum int, product int);\n\nCREATE FUNCTION sum_n_product (int, int) RETURNS sum_prod\nAS 'SELECT $1 + $2, $1 * $2'\nLANGUAGE SQL;\n</pre>\n<p lang=\"zh\">\u4f46\u901a\u5e38\u4e0d\u5fc5\u989d\u5916\u5b9a\u4e49\u4e00\u4e2a\u72ec\u7acb\u7684\u590d\u5408\u7c7b\u578b\u4f1a\u66f4\u65b9\u4fbf\u3002\u6ce8\u610f\uff0c\u9644\u5728\u8f93\u51fa\u53c2\u6570\u4e0a\u7684\u540d\u79f0\u5e76\u975e\u53ea\u662f\u88c5\u9970\uff0c\u5b83\u4eec\u51b3\u5b9a\u4e86\u8fd9\u4e2a\u533f\u540d\u590d\u5408\u7c7b\u578b\u7684\u5217\u540d\u3002\uff08\u5982\u679c\u7701\u7565\u8f93\u51fa\u53c2\u6570\u540d\u79f0\uff0c\u7cfb\u7edf\u4f1a\u81ea\u884c\u9009\u62e9\u4e00\u4e2a\u540d\u79f0\u3002\uff09</p>\n<p lang=\"zh\">\u5728\u4ece SQL \u8c03\u7528\u8fd9\u6837\u4e00\u4e2a\u51fd\u6570\u65f6\uff0c\u8f93\u51fa\u53c2\u6570\u4e0d\u4f1a\u88ab\u5305\u62ec\u5728\u8c03\u7528\u53c2\u6570\u5217\u8868\u4e2d\u3002\u8fd9\u662f\u56e0\u4e3a<span class=\"productname\">PostgreSQL</span>\u53ea\u8003\u8651\u8f93\u5165\u53c2\u6570\u6765\u5b9a\u4e49\u51fd\u6570\u7684\u8c03\u7528\u7b7e\u540d\u3002\u8fd9\u4e5f\u610f\u5473\u7740\u5728\u4e3a\u8bf8\u5982\u5220\u9664\u51fd\u6570\u7b49\u76ee\u7684\u5f15\u7528\u8be5\u51fd\u6570\u65f6\u53ea\u6709\u8f93\u5165\u53c2\u6570\u6709\u5173\u7cfb\u3002\u6211\u4eec\u53ef\u4ee5\u7528\u4e0b\u9762\u7684\u547d\u4ee4\u4e4b\u4e00\u5220\u9664\u4e0a\u8ff0\u51fd\u6570</p>\n<pre class=\"screen\">DROP FUNCTION sum_n_product (x int, y int, OUT sum int, OUT product int);\nDROP FUNCTION sum_n_product (int, int);\n</pre>\n<p lang=\"zh\">\u53c2\u6570\u53ef\u4ee5\u88ab\u6807\u8bb0\u4e3a<code class=\"literal\">IN</code>\uff08\u9ed8\u8ba4\uff09\u3001<code class=\"literal\">OUT</code>\u3001<code class=\"literal\">INOUT</code>\u6216\u8005<code class=\"literal\">VARIADIC</code>\u3002\u4e00\u4e2a<code class=\"literal\">INOUT</code>\u53c2\u6570\u65e2\u4f5c\u4e3a\u4e00\u4e2a\u8f93\u5165\u53c2\u6570\uff08\u8c03\u7528\u53c2\u6570\u5217\u8868\u7684\u4e00\u90e8\u5206\uff09\u53c8\u4f5c\u4e3a\u4e00\u4e2a\u8f93\u51fa\u53c2\u6570\uff08\u7ed3\u679c\u8bb0\u5f55\u7c7b\u578b\u7684\u4e00\u90e8\u5206\uff09\u3002<code class=\"literal\">VARIADIC</code>\u53c2\u6570\u662f\u8f93\u5165\u53c2\u6570\uff0c\u4f46\u88ab\u6309\u7167\u4e0b\u6587\u6240\u8ff0\u7279\u6b8a\u5bf9\u5f85\u3002</p>\n</div>\n<div class=\"sect2\" id=\"XFUNC-SQL-VARIADIC-FUNCTIONS\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/13/xfunc-sql.html#XFUNC-SQL-VARIADIC-FUNCTIONS\">37.5.5. \u5e26\u6709\u53ef\u53d8\u6570\u91cf\u53c2\u6570\u7684<acronym class=\"acronym\">SQL</acronym>\u51fd\u6570</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\"><acronym class=\"acronym\">SQL</acronym> \u51fd\u6570\u53ef\u4ee5\u88ab\u58f0\u660e\u4e3a\u63a5\u53d7\u53ef\u53d8\u6570\u91cf\u7684\u53c2\u6570\uff0c\u53ea\u8981\u6240\u6709<span class=\"quote\">\u201c<span class=\"quote\">\u53ef\u9009</span>\u201d</span>\u53c2\u6570\u90fd\u5c5e\u4e8e\u540c\u4e00\u79cd\u6570\u636e\u7c7b\u578b\u3002\u53ef\u9009\u53c2\u6570\u4f1a\u4ee5\u6570\u7ec4\u5f62\u5f0f\u4f20\u9012\u7ed9\u51fd\u6570\u3002\u5b9a\u4e49\u8fd9\u7c7b\u51fd\u6570\u65f6\uff0c\u9700\u8981\u628a\u6700\u540e\u4e00\u4e2a\u53c2\u6570\u6807\u8bb0\u4e3a <code class=\"literal\">VARIADIC</code>\uff1b\u8be5\u53c2\u6570\u5fc5\u987b\u88ab\u58f0\u660e\u4e3a\u6570\u7ec4\u7c7b\u578b\u3002\u4f8b\u5982\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION mleast(VARIADIC arr numeric[]) RETURNS numeric AS $$\n    SELECT min($1[i]) FROM generate_subscripts($1, 1) g(i);\n$$ LANGUAGE SQL;\n\nSELECT mleast(10, -1, 5, 4.4);\n mleast \n--------\n     -1\n(1 row)\n</pre>\n<p lang=\"zh\">\u5b9e\u9645\u4e0a\uff0c\u4f4d\u4e8e <code class=\"literal\">VARIADIC</code> \u4f4d\u7f6e\u53ca\u4e4b\u540e\u7684\u6240\u6709\u5b9e\u53c2\u90fd\u4f1a\u88ab\u6536\u96c6\u6210\u4e00\u4e2a\u4e00\u7ef4\u6570\u7ec4\uff0c\u5c31\u50cf\u4f60\u5199\u6210\u4e86\uff1a</p>\n<pre class=\"screen\">SELECT mleast(ARRAY[10, -1, 5, 4.4]);    -- doesn't work\n</pre>\n<p lang=\"zh\">\u4e0d\u8fc7\u4f60\u5b9e\u9645\u4e0a\u4e0d\u80fd\u8fd9\u6837\u5199\uff0c\u81f3\u5c11\u5b83\u4e0d\u4f1a\u5339\u914d\u8fd9\u4e2a\u51fd\u6570\u5b9a\u4e49\u3002\u88ab\u6807\u8bb0\u4e3a <code class=\"literal\">VARIADIC</code> \u7684\u53c2\u6570\u5339\u914d\u7684\u662f\u5176\u5143\u7d20\u7c7b\u578b\u51fa\u73b0\u4e00\u6b21\u6216\u591a\u6b21\uff0c\u800c\u4e0d\u662f\u5b83\u81ea\u8eab\u7684\u6570\u7ec4\u7c7b\u578b\u3002</p>\n<p lang=\"zh\">\u6709\u65f6\u5019\uff0c\u80fd\u591f\u628a\u4e00\u4e2a\u5df2\u7ecf\u6784\u9020\u597d\u7684\u6570\u7ec4\u4f20\u7ed9\u53ef\u53d8\u53c2\u6570\u51fd\u6570\u4f1a\u5f88\u6709\u7528\uff0c\u5c24\u5176\u662f\u5f53\u4e00\u4e2a\u53ef\u53d8\u53c2\u6570\u51fd\u6570\u60f3\u628a\u5b83\u7684\u6570\u7ec4\u53c2\u6570\u518d\u4f20\u7ed9\u53e6\u4e00\u4e2a\u51fd\u6570\u65f6\u3002\u6b64\u5916\uff0c\u5728\u5141\u8bb8\u4e0d\u53d7\u4fe1\u4efb\u7528\u6237\u521b\u5efa\u5bf9\u8c61\u7684\u6a21\u5f0f\u4e2d\u8c03\u7528\u53ef\u53d8\u53c2\u6570\u51fd\u6570\u65f6\uff0c\u8fd9\u662f\u552f\u4e00\u5b89\u5168\u7684\u65b9\u5f0f\uff0c\u89c1<a class=\"xref\" href=\"/docs/13/typeconv-func.html\" title=\"10.3.\u00a0\u51fd\u6570\">\u7b2c\u00a010.3\u00a0\u8282</a>\u3002\u4f60\u53ef\u4ee5\u5728\u8c03\u7528\u4e2d\u6307\u5b9a<code class=\"literal\">VARIADIC</code>\u6765\u505a\u5230\u8fd9\u4e00\u70b9\uff1a</p>\n<pre class=\"screen\">SELECT mleast(VARIADIC ARRAY[10, -1, 5, 4.4]);\n</pre>\n<p lang=\"zh\">\u8fd9\u6837\u4f1a\u963b\u6b62\u51fd\u6570\u7684\u53ef\u53d8\u53c2\u6570\u6309\u5176\u5143\u7d20\u7c7b\u578b\u5c55\u5f00\uff0c\u4ece\u800c\u8ba9\u6570\u7ec4\u5b9e\u53c2\u80fd\u591f\u6309\u5e38\u89c4\u65b9\u5f0f\u5339\u914d\u3002<code class=\"literal\">VARIADIC</code> \u53ea\u80fd\u9644\u52a0\u5728\u51fd\u6570\u8c03\u7528\u7684\u6700\u540e\u4e00\u4e2a\u5b9e\u53c2\u4e0a\u3002</p>\n<p lang=\"zh\">\u5728\u8c03\u7528\u4e2d\u6307\u5b9a<code class=\"literal\">VARIADIC</code>\u4e5f\u662f\u5411\u53ef\u53d8\u53c2\u6570\u51fd\u6570\u4f20\u9012\u7a7a\u6570\u7ec4\u7684\u552f\u4e00\u65b9\u5f0f\uff0c\u4f8b\u5982\uff1a</p>\n<pre class=\"screen\">SELECT mleast(VARIADIC ARRAY[]::numeric[]);\n</pre>\n<p lang=\"zh\">\u4ec5\u4ec5\u5199\u6210<code class=\"literal\">SELECT mleast()</code>\u662f\u884c\u4e0d\u901a\u7684\uff0c\u56e0\u4e3a\u53ef\u53d8\u53c2\u6570\u5fc5\u987b\u5339\u914d\u81f3\u5c11\u4e00\u4e2a\u5b9e\u53c2\u3002\uff08\u5982\u679c\u4f60\u5e0c\u671b\u5141\u8bb8\u8fd9\u79cd\u8c03\u7528\uff0c\u53ef\u4ee5\u518d\u5b9a\u4e49\u4e00\u4e2a\u540c\u540d\u4e14\u4e0d\u5e26\u53c2\u6570\u7684\u51fd\u6570<code class=\"literal\">mleast</code>\u3002\uff09</p>\n<p lang=\"zh\">\u4ece\u53ef\u53d8\u53c2\u6570\u6d3e\u751f\u51fa\u7684\u6570\u7ec4\u5143\u7d20\u53c2\u6570\u4f1a\u88ab\u89c6\u4e3a\u6ca1\u6709\u81ea\u5df1\u7684\u540d\u5b57\u3002\u8fd9\u610f\u5473\u7740\u9664\u975e\u4f60\u6307\u5b9a\u4e86 <code class=\"literal\">VARIADIC</code>\uff0c\u5426\u5219\u4e0d\u80fd\u4f7f\u7528\u547d\u540d\u53c2\u6570\u6765\u8c03\u7528\u53ef\u53d8\u53c2\u6570\u51fd\u6570\uff08<a class=\"xref\" href=\"/docs/13/sql-syntax-calling-funcs.html\" title=\"4.3.\u00a0\u8c03\u7528\u51fd\u6570\">\u7b2c\u00a04.3\u00a0\u8282</a>\uff09\u3002\u4f8b\u5982\uff0c\u4e0b\u9762\u7684\u8c03\u7528\u662f\u53ef\u884c\u7684\uff1a</p>\n<pre class=\"screen\">SELECT mleast(VARIADIC arr =&gt; ARRAY[10, -1, 5, 4.4]);\n</pre>\n<p lang=\"zh\">\u4f46\u8fd9\u4e9b\u5c31\u4e0d\u884c\uff1a</p>\n<pre class=\"screen\">SELECT mleast(arr =&gt; 10);\nSELECT mleast(arr =&gt; ARRAY[10, -1, 5, 4.4]);\n</pre>\n</div>\n<div class=\"sect2\" id=\"XFUNC-SQL-PARAMETER-DEFAULTS\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/13/xfunc-sql.html#XFUNC-SQL-PARAMETER-DEFAULTS\">37.5.6. \u5e26\u6709\u53c2\u6570\u9ed8\u8ba4\u503c\u7684<acronym class=\"acronym\">SQL</acronym>\u51fd\u6570</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\">\u51fd\u6570\u53ef\u4ee5\u88ab\u58f0\u660e\u4e3a\u5bf9\u4e00\u4e9b\u6216\u8005\u6240\u6709\u8f93\u5165\u53c2\u6570\u5177\u6709\u9ed8\u8ba4\u503c\u3002\u53ea\u8981\u8c03\u7528\u51fd\u6570\u65f6\u6ca1\u6709\u7ed9\u51fa\u8db3\u591f\u591a\u7684\u5b9e\u53c2\uff0c\u5c31\u4f1a\u63d2\u5165\u9ed8\u8ba4\u503c\u6765\u5f25\u8865\u7f3a\u5931\u7684\u5b9e\u53c2\u3002\u7531\u4e8e\u53c2\u6570\u53ea\u80fd\u4ece\u5b9e\u53c2\u5217\u8868\u7684\u5c3e\u90e8\u5f00\u59cb\u88ab\u7701\u7565\uff0c\u5728\u4e00\u4e2a\u6709\u9ed8\u8ba4\u503c\u7684\u53c2\u6570\u4e4b\u540e\u7684\u6240\u6709\u53c2\u6570\u90fd\u4e0d\u5f97\u4e0d\u4e5f\u5177\u6709\u9ed8\u8ba4\u503c\uff08\u5c3d\u7ba1\u4f7f\u7528\u547d\u540d\u53c2\u6570\u8bb0\u6cd5\u53ef\u4ee5\u5141\u8bb8\u653e\u677e\u8fd9\u79cd\u9650\u5236\uff0c\u8fd9\u79cd\u9650\u5236\u4ecd\u7136\u4f1a\u88ab\u5f3a\u5236\u4ee5\u4fbf\u4f4d\u7f6e\u53c2\u6570\u8bb0\u6cd5\u80fd\u5de5\u4f5c\uff09\u3002\u4e0d\u7ba1\u4f60\u662f\u5426\u4f7f\u7528\u5b83\uff0c\u8fd9\u79cd\u80fd\u529b\u90fd\u8981\u6c42\u5728\u67d0\u4e9b\u7528\u6237\u4e0d\u4fe1\u4efb\u5176\u4ed6\u7528\u6237\u7684\u6570\u636e\u5e93\u4e2d\u8c03\u7528\u51fd\u6570\u65f6\u91c7\u53d6\u4e00\u4e9b\u9884\u9632\u63aa\u65bd\uff0c\u89c1<a class=\"xref\" href=\"/docs/13/typeconv-func.html\" title=\"10.3.\u00a0\u51fd\u6570\">\u7b2c\u00a010.3\u00a0\u8282</a>\u3002</p>\n<p lang=\"zh\">\u4f8b\u5982\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION foo(a int, b int DEFAULT 2, c int DEFAULT 3)\nRETURNS int\nLANGUAGE SQL\nAS $$\n    SELECT $1 + $2 + $3;\n$$;\n\nSELECT foo(10, 20, 30);\n foo \n-----\n  60\n(1 row)\n\nSELECT foo(10, 20);\n foo \n-----\n  33\n(1 row)\n\nSELECT foo(10);\n foo \n-----\n  15\n(1 row)\n\nSELECT foo();  -- fails since there is no default for the first argument\nERROR:  function foo() does not exist\n</pre>\n<p lang=\"zh\">\u4e5f\u53ef\u4ee5\u7528 <code class=\"literal\">=</code> \u7b26\u53f7\u4ee3\u66ff\u5173\u952e\u5b57 <code class=\"literal\">DEFAULT</code>\u3002</p>\n</div>\n<div class=\"sect2\" id=\"XFUNC-SQL-TABLE-FUNCTIONS\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/13/xfunc-sql.html#XFUNC-SQL-TABLE-FUNCTIONS\">37.5.7. <acronym class=\"acronym\">SQL</acronym> \u51fd\u6570\u4f5c\u4e3a\u8868\u6765\u6e90</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\">\u6240\u6709\u7684 SQL \u51fd\u6570\u90fd\u53ef\u4ee5\u88ab\u7528\u5728\u67e5\u8be2\u7684<code class=\"literal\">FROM</code>\u5b50\u53e5\u4e2d\uff0c\u4f46\u662f\u5bf9\u4e8e\u8fd4\u56de\u590d\u5408\u7c7b\u578b\u7684\u51fd\u6570\u7279\u522b\u6709\u7528\u3002\u5982\u679c\u51fd\u6570\u88ab\u5b9a\u4e49\u4e3a\u8fd4\u56de\u4e00\u79cd\u57fa\u7840\u7c7b\u578b\uff0c\u8be5\u8868\u51fd\u6570\u4f1a\u4ea7\u751f\u4e00\u4e2a\u5355\u5217\u8868\u3002\u5982\u679c\u8be5\u51fd\u6570\u88ab\u5b9a\u4e49\u4e3a\u8fd4\u56de\u4e00\u79cd\u590d\u5408\u7c7b\u578b\uff0c\u8be5\u8868\u51fd\u6570\u4f1a\u4e3a\u8be5\u590d\u5408\u7c7b\u578b\u7684\u6bcf\u4e00\u4e2a\u5c5e\u6027\u4ea7\u751f\u4e00\u5217\u3002</p>\n<p lang=\"zh\">\u4ee5\u4e0b\u662f\u4e00\u4e2a\u793a\u4f8b\uff1a</p>\n<pre class=\"screen\">CREATE TABLE foo (fooid int, foosubid int, fooname text);\nINSERT INTO foo VALUES (1, 1, 'Joe');\nINSERT INTO foo VALUES (1, 2, 'Ed');\nINSERT INTO foo VALUES (2, 1, 'Mary');\n\nCREATE FUNCTION getfoo(int) RETURNS foo AS $$\n    SELECT * FROM foo WHERE fooid = $1;\n$$ LANGUAGE SQL;\n\nSELECT *, upper(fooname) FROM getfoo(1) AS t1;\n\n fooid | foosubid | fooname | upper\n-------+----------+---------+-------\n     1 |        1 | Joe     | JOE\n(1 row)\n</pre>\n<p lang=\"zh\">\u5982\u793a\u4f8b\u6240\u793a\uff0c\u6211\u4eec\u53ef\u4ee5\u50cf\u64cd\u4f5c\u666e\u901a\u8868\u7684\u5217\u4e00\u6837\u64cd\u4f5c\u51fd\u6570\u7ed3\u679c\u4e2d\u7684\u5217\u3002</p>\n<p lang=\"zh\">\u6ce8\u610f\u6211\u4eec\u53ea\u4ece\u51fd\u6570\u5f97\u5230\u4e86\u4e00\u884c\u3002\u8fd9\u662f\u56e0\u4e3a\u6211\u4eec\u6ca1\u6709\u4f7f\u7528<code class=\"literal\">SETOF</code>\u3002\u8fd9\u4f1a\u5728\u4e0b\u4e00\u8282\u4e2d\u4ecb\u7ecd\u3002</p>\n</div>\n<div class=\"sect2\" id=\"XFUNC-SQL-FUNCTIONS-RETURNING-SET\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/13/xfunc-sql.html#XFUNC-SQL-FUNCTIONS-RETURNING-SET\">37.5.8. \u8fd4\u56de\u96c6\u5408\u7684<acronym class=\"acronym\">SQL</acronym>\u51fd\u6570</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\">\u5f53\u4e00\u4e2a SQL \u51fd\u6570\u88ab\u58f0\u660e\u4e3a\u8fd4\u56de<code class=\"literal\">SETOF <em class=\"replaceable\"><code>sometype</code></em></code>\u65f6\uff0c\u8be5\u51fd\u6570\u7684\u6700\u540e\u4e00\u4e2a\u67e5\u8be2\u4f1a\u88ab\u6267\u884c\u5b8c\uff0c\u5e76\u4e14\u5b83\u8f93\u51fa\u7684\u6bcf\u4e00\u884c\u90fd\u4f1a\u88ab\u4f5c\u4e3a\u7ed3\u679c\u96c6\u7684\u4e00\u4e2a\u5143\u7d20\u8fd4\u56de\u3002</p>\n<p lang=\"zh\">\u8fd9\u4e00\u7279\u6027\u901a\u5e38\u662f\u5728\u67e5\u8be2\u7684 <code class=\"literal\">FROM</code> \u5b50\u53e5\u4e2d\u8c03\u7528\u51fd\u6570\u65f6\u4f7f\u7528\u7684\u3002\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b\uff0c\u51fd\u6570\u8fd4\u56de\u7684\u6bcf\u4e00\u884c\u90fd\u4f1a\u6210\u4e3a\u67e5\u8be2\u6240\u89c1\u8868\u4e2d\u7684\u4e00\u884c\u3002\u4f8b\u5982\uff0c\u5047\u8bbe\u8868 <code class=\"literal\">foo</code> \u4e0e\u4e0a\u6587\u76f8\u540c\uff0c\u6211\u4eec\u5199\uff1a</p>\n<pre class=\"programlisting\">CREATE FUNCTION getfoo(int) RETURNS SETOF foo AS $$\n    SELECT * FROM foo WHERE fooid = $1;\n$$ LANGUAGE SQL;\n\nSELECT * FROM getfoo(1) AS t1;\n</pre>\n<p lang=\"zh\">\u90a3\u4e48\u4f1a\u5f97\u5230\uff1a</p>\n<pre class=\"screen\"> fooid | foosubid | fooname\n-------+----------+---------\n     1 |        1 | Joe\n     1 |        2 | Ed\n(2 rows)\n</pre>\n<p lang=\"zh\">\u4e5f\u53ef\u4ee5\u901a\u8fc7\u8f93\u51fa\u53c2\u6570\u5b9a\u4e49\u7684\u5217\u6765\u8fd4\u56de\u591a\u884c\uff0c\u4f8b\u5982\uff1a</p>\n<pre class=\"programlisting\">CREATE TABLE tab (y int, z int);\nINSERT INTO tab VALUES (1, 2), (3, 4), (5, 6), (7, 8);\n\nCREATE FUNCTION sum_n_product_with_tab (x int, OUT sum int, OUT product int)\nRETURNS SETOF record\nAS $$\n    SELECT $1 + tab.y, $1 * tab.y FROM tab;\n$$ LANGUAGE SQL;\n\nSELECT * FROM sum_n_product_with_tab(10);\n sum | product\n-----+---------\n  11 |      10\n  13 |      30\n  15 |      50\n  17 |      70\n(4 rows)\n</pre>\n<p lang=\"zh\">\u8fd9\u91cc\u7684\u5173\u952e\u70b9\u662f\uff1a\u4f60\u5fc5\u987b\u5199\u6210 <code class=\"literal\">RETURNS SETOF record</code>\uff0c\u4ee5\u8868\u660e\u8be5\u51fd\u6570\u8fd4\u56de\u7684\u662f\u591a\u884c\u800c\u4e0d\u662f\u5355\u884c\u3002\u5982\u679c\u53ea\u6709\u4e00\u4e2a\u8f93\u51fa\u53c2\u6570\uff0c\u5219\u5199\u8be5\u53c2\u6570\u7684\u7c7b\u578b\uff0c\u800c\u4e0d\u662f <code class=\"type\">record</code>\u3002</p>\n<p lang=\"zh\">\u901a\u8fc7\u591a\u6b21\u8c03\u7528\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u6765\u6784\u9020\u67e5\u8be2\u7ed3\u679c\u901a\u5e38\u5f88\u6709\u7528\uff0c\u5176\u4e2d\u6bcf\u6b21\u8c03\u7528\u7684\u53c2\u6570\u90fd\u6765\u81ea\u8868\u6216\u5b50\u67e5\u8be2\u7684\u8fde\u7eed\u884c\u3002\u9996\u9009\u65b9\u5f0f\u662f\u4f7f\u7528 <code class=\"literal\">LATERAL</code> \u5173\u952e\u5b57\uff0c\u8be6\u89c1<a class=\"xref\" href=\"/docs/13/queries-table-expressions.html#QUERIES-LATERAL\" title=\"7.2.1.5.\u00a0LATERAL\u5b50\u67e5\u8be2\">\u7b2c\u00a07.2.1.5\u00a0\u8282</a>\u3002\u4e0b\u9762\u662f\u4e00\u4e2a\u4f7f\u7528\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u679a\u4e3e\u6811\u7ed3\u6784\u5143\u7d20\u7684\u793a\u4f8b\uff1a</p>\n<pre class=\"screen\">SELECT * FROM nodes;\n   name    | parent\n-----------+--------\n Top       |\n Child1    | Top\n Child2    | Top\n Child3    | Top\n SubChild1 | Child1\n SubChild2 | Child1\n(6 rows)\n\nCREATE FUNCTION listchildren(text) RETURNS SETOF text AS $$\n    SELECT name FROM nodes WHERE parent = $1\n$$ LANGUAGE SQL STABLE;\n\nSELECT * FROM listchildren('Top');\n listchildren\n--------------\n Child1\n Child2\n Child3\n(3 rows)\n\nSELECT name, child FROM nodes, LATERAL listchildren(name) AS child;\n  name  |   child\n--------+-----------\n Top    | Child1\n Top    | Child2\n Top    | Child3\n Child1 | SubChild1\n Child1 | SubChild2\n(5 rows)\n</pre>\n<p lang=\"zh\">\u8fd9\u4e2a\u4f8b\u5b50\u5e76\u6ca1\u6709\u505a\u51fa\u4efb\u4f55\u65e0\u6cd5\u7528\u7b80\u5355\u8fde\u63a5\u5b9e\u73b0\u7684\u4e8b\uff0c\u4f46\u5728\u66f4\u590d\u6742\u7684\u8ba1\u7b97\u4e2d\uff0c\u628a\u4e00\u90e8\u5206\u5de5\u4f5c\u653e\u8fdb\u51fd\u6570\u91cc\u901a\u5e38\u4f1a\u975e\u5e38\u65b9\u4fbf\u3002</p>\n<p lang=\"zh\">\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u4e5f\u53ef\u4ee5\u51fa\u73b0\u5728\u67e5\u8be2\u7684\u9009\u62e9\u5217\u8868\u4e2d\u3002\u5bf9\u4e8e\u67e5\u8be2\u672c\u8eab\u751f\u6210\u7684\u6bcf\u4e00\u884c\uff0c\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u90fd\u4f1a\u88ab\u8c03\u7528\uff0c\u5e76\u4e3a\u5176\u7ed3\u679c\u96c6\u4e2d\u7684\u6bcf\u4e00\u4e2a\u5143\u7d20\u751f\u6210\u4e00\u884c\u8f93\u51fa\u3002\u524d\u9762\u7684\u4f8b\u5b50\u4e5f\u53ef\u4ee5\u5199\u6210\u8fd9\u6837\uff1a</p>\n<pre class=\"screen\">SELECT listchildren('Top');\n listchildren\n--------------\n Child1\n Child2\n Child3\n(3 rows)\n\nSELECT name, listchildren(name) FROM nodes;\n  name  | listchildren\n--------+--------------\n Top    | Child1\n Top    | Child2\n Top    | Child3\n Child1 | SubChild1\n Child1 | SubChild2\n(5 rows)\n</pre>\n<p lang=\"zh\">\u5728\u6700\u540e\u4e00\u4e2a <code class=\"command\">SELECT</code> \u4e2d\uff0c\u6ce8\u610f\u6ca1\u6709\u4e3a <code class=\"literal\">Child2</code>\u3001<code class=\"literal\">Child3</code> \u7b49\u663e\u793a\u4efb\u4f55\u8f93\u51fa\u884c\u3002\u8fd9\u662f\u56e0\u4e3a <code class=\"function\">listchildren</code> \u5bf9\u8fd9\u4e9b\u53c2\u6570\u8fd4\u56de\u7684\u662f\u7a7a\u96c6\uff0c\u56e0\u6b64\u4e0d\u4f1a\u751f\u6210\u7ed3\u679c\u884c\u3002\u8fd9\u4e0e\u4f7f\u7528 <code class=\"literal\">LATERAL</code> \u8bed\u6cd5\u628a\u51fd\u6570\u7ed3\u679c\u505a\u5185\u8fde\u63a5\u65f6\u5f97\u5230\u7684\u884c\u4e3a\u76f8\u540c\u3002</p>\n<p lang=\"zh\"><span class=\"productname\">PostgreSQL</span>\u4e2d\uff0c\u5199\u5728\u67e5\u8be2\u7684\u9009\u62e9\u5217\u8868\u4e2d\u7684\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u7684\u884c\u4e3a\u51e0\u4e4e\u548c\u5199\u5728<code class=\"literal\">LATERAL FROM</code>\u5b50\u53e5\u9879\u4e2d\u7684\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u5b8c\u5168\u4e00\u6837\u3002\u4f8b\u5982\uff1a</p>\n<pre class=\"programlisting\">SELECT x, generate_series(1,5) AS g FROM tab;\n</pre>\n<p lang=\"zh\">\u51e0\u4e4e\u7b49\u6548\u4e8e</p>\n<pre class=\"programlisting\">SELECT x, g FROM tab, LATERAL generate_series(1,5) AS g;\n</pre>\n<p lang=\"zh\">\u8fd9\u4f1a\u662f\u5b8c\u5168\u4e00\u6837\u7684\uff0c\u9664\u4e86\u5728\u8fd9\u4e2a\u7279\u522b\u7684\u793a\u4f8b\u4e2d\uff0c\u89c4\u5212\u5668\u53ef\u4ee5\u9009\u62e9\u628a<code class=\"structname\">g</code>\u653e\u5728\u5d4c\u5957\u5faa\u73af\u8fde\u63a5\u7684\u5916\u4fa7\uff0c\u56e0\u4e3a<code class=\"structname\">g</code>\u5bf9<code class=\"structname\">tab</code>\u6ca1\u6709\u5b9e\u9645\u7684\u6a2a\u5411\u4f9d\u8d56\u3002\u90a3\u4f1a\u5bfc\u81f4\u4e00\u79cd\u4e0d\u540c\u7684\u8f93\u51fa\u884c\u987a\u5e8f\u3002\u9009\u62e9\u5217\u8868\u4e2d\u7684\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u603b\u662f\u4f1a\u88ab\u8ba1\u7b97\uff0c\u5c31\u597d\u50cf\u5b83\u4eec\u5728<code class=\"literal\">FROM</code>\u5b50\u53e5\u5269\u4f59\u90e8\u5206\u7684\u5d4c\u5957\u5faa\u73af\u8fde\u63a5\u7684\u5185\u4fa7\u4e00\u6837\uff0c\u56e0\u6b64\u5728\u8003\u8651\u6765\u81ea<code class=\"literal\">FROM</code>\u5b50\u53e5\u7684\u4e0b\u4e00\u884c\u4e4b\u524d\uff0c\u8fd9\u4e9b\u51fd\u6570\u4f1a\u8fd0\u884c\u5230\u5b8c\u6210\u3002</p>\n<p lang=\"zh\">\u5982\u679c\u5728\u67e5\u8be2\u7684\u9009\u62e9\u5217\u8868\u4e2d\u6709\u4e0d\u6b62\u4e00\u4e2a\u96c6\u5408\u8fd4\u56de\u51fd\u6570\uff0c\u5219\u884c\u4e3a\u7c7b\u4f3c\u4e8e\u628a\u90a3\u4e9b\u51fd\u6570\u653e\u5230\u4e00\u4e2a\u5355\u4e00\u7684<code class=\"literal\">LATERAL ROWS FROM( ... )</code> <code class=\"literal\">FROM</code>\u5b50\u53e5\u9879\u4e2d\u7684\u884c\u4e3a\u3002\u5bf9\u4e8e\u6765\u81ea\u5e95\u5c42\u67e5\u8be2\u7684\u6bcf\u4e00\u884c\uff0c\u90fd\u6709\u4e00\u4e2a\u7528\u5230\u6bcf\u4e2a\u51fd\u6570\u9996\u4e2a\u7ed3\u679c\u7684\u8f93\u51fa\u884c\uff0c\u7136\u540e\u662f\u4e00\u4e2a\u4f7f\u7528\u6bcf\u4e2a\u51fd\u6570\u7b2c\u4e8c\u4e2a\u7ed3\u679c\u7684\u8f93\u51fa\u884c\uff0c\u4ee5\u6b64\u7c7b\u63a8\u3002\u5982\u679c\u67d0\u4e9b\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u4ea7\u751f\u7684\u8f93\u51fa\u6bd4\u5176\u4ed6\u51fd\u6570\u5c11\uff0c\u4f1a\u7528\u7a7a\u503c\u4ee3\u66ff\u7f3a\u5931\u7684\u6570\u636e\uff0c\u56e0\u6b64\u4e3a\u4e00\u4e2a\u5e95\u5c42\u884c\u5f62\u6210\u7684\u603b\u884c\u6570\u7b49\u4e8e\u4ea7\u751f\u6700\u591a\u8f93\u51fa\u7684\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u7684\u8f93\u51fa\u884c\u6570\u3002\u56e0\u6b64\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u4f1a<span class=\"quote\">\u201c<span class=\"quote\">\u6b65\u8c03\u4e00\u81f4</span>\u201d</span>\u5730\u8fd0\u884c\u76f4\u5230\u5b83\u4eec\u7684\u8f93\u51fa\u88ab\u8017\u5c3d\uff0c\u7136\u540e\u7528\u4e0b\u4e00\u4e2a\u5e95\u5c42\u884c\u7ee7\u7eed\u6267\u884c\u3002</p>\n<p lang=\"zh\">\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u53ef\u4ee5\u88ab\u5d4c\u5957\u5728\u4e00\u4e2a\u9009\u62e9\u5217\u8868\u4e2d\uff0c\u4e0d\u8fc7\u5728<code class=\"literal\">FROM</code>\u5b50\u53e5\u9879\u4e2d\u4e0d\u5141\u8bb8\u8fd9\u6837\u505a\u3002\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b\uff0c\u5d4c\u5957\u7684\u6bcf\u4e00\u5c42\u4f1a\u88ab\u5355\u72ec\u5bf9\u5f85\uff0c\u5c31\u50cf\u5b83\u662f\u4e00\u4e2a\u5355\u72ec\u7684<code class=\"literal\">LATERAL ROWS FROM( ... )</code>\u9879\u4e00\u6837\u3002\u4f8b\u5982\uff0c\u5728</p>\n<pre class=\"programlisting\">SELECT srf1(srf2(x), srf3(y)), srf4(srf5(z)) FROM tab;\n</pre>\n<p lang=\"zh\">\u4e2d\uff0c\u96c6\u5408\u8fd4\u56de\u51fd\u6570<code class=\"function\">srf2</code>\u3001<code class=\"function\">srf3</code>\u548c<code class=\"function\">srf5</code>\u5c06\u4e3a<code class=\"structname\">tab</code>\u7684\u6bcf\u4e00\u884c\u6b65\u8c03\u4e00\u81f4\u5730\u8fd0\u884c\uff0c\u7136\u540e\u4f1a\u5bf9\u8f83\u4f4e\u5c42\u7684\u51fd\u6570\u4ea7\u751f\u7684\u6bcf\u4e00\u884c\u4ee5\u6b65\u8c03\u4e00\u81f4\u7684\u5f62\u5f0f\u5e94\u7528<code class=\"function\">srf1</code>\u548c<code class=\"function\">srf4</code>\u3002</p>\n<p lang=\"zh\">\u5728<code class=\"literal\">CASE</code>\u6216<code class=\"literal\">COALESCE</code>\u8fd9\u6837\u7684\u6761\u4ef6\u8ba1\u7b97\u7ed3\u6784\u4e2d\uff0c\u4e0d\u80fd\u4f7f\u7528\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u3002\u4f8b\u5982\uff0c\u8003\u8651</p>\n<pre class=\"programlisting\">SELECT x, CASE WHEN x &gt; 0 THEN generate_series(1, 5) ELSE 0 END FROM tab;\n</pre>\n<p lang=\"zh\">\u8868\u9762\u4e0a\u770b\uff0c\u8fd9\u5e94\u5f53\u8ba9 x &gt; 0 \u7684\u8f93\u5165\u884c\u91cd\u590d\u4e94\u6b21\uff0c\u5176\u4f59\u884c\u53ea\u51fa\u73b0\u4e00\u6b21\uff1b\u4f46\u5b9e\u9645\u4e0a\uff0cgenerate_series(1, 5) \u4f1a\u5728 CASE \u8868\u8fbe\u5f0f\u6c42\u503c\u4e4b\u524d\uff0c\u4f5c\u4e3a\u9690\u5f0f LATERAL FROM \u9879\u6267\u884c\uff0c\u56e0\u6b64\u6bcf\u4e2a\u8f93\u5165\u884c\u90fd\u4f1a\u91cd\u590d\u4e94\u6b21\u3002\u4e3a\u907f\u514d\u6df7\u6dc6\uff0c\u6b64\u7c7b\u5199\u6cd5\u4f1a\u5728\u89e3\u6790\u9636\u6bb5\u62a5\u9519\u3002</p>\n<div class=\"note\">\n<h3 class=\"title\" lang=\"zh\">\u6ce8\u610f</h3>\n<p lang=\"zh\">\u5982\u679c\u4e00\u4e2a\u51fd\u6570\u7684\u6700\u540e\u4e00\u6761\u547d\u4ee4\u662f <code class=\"command\">INSERT</code>\u3001<code class=\"command\">UPDATE</code> \u6216 <code class=\"command\">DELETE</code> \u5e76\u5e26\u6709 <code class=\"literal\">RETURNING</code>\uff0c\u90a3\u4e48\u5373\u4f7f\u8be5\u51fd\u6570\u6ca1\u6709\u58f0\u660e\u4e3a <code class=\"literal\">SETOF</code>\uff0c\u6216\u8005\u8c03\u7528\u5b83\u7684\u67e5\u8be2\u5e76\u672a\u53d6\u8d70\u5168\u90e8\u7ed3\u679c\u884c\uff0c\u8be5\u547d\u4ee4\u4e5f\u603b\u4f1a\u6267\u884c\u5230\u5b8c\u6210\u3002<code class=\"literal\">RETURNING</code> \u5b50\u53e5\u4ea7\u751f\u7684\u989d\u5916\u7ed3\u679c\u884c\u4f1a\u88ab\u9759\u9ed8\u4e22\u5f03\uff0c\u4f46\u76f8\u5e94\u7684\u8868\u4fee\u6539\u4ecd\u7136\u4f1a\u53d1\u751f\uff0c\u5e76\u4e14\u4f1a\u5728\u51fd\u6570\u8fd4\u56de\u524d\u5168\u90e8\u5b8c\u6210\u3002</p>\n</div>\n<div class=\"note\">\n<h3 class=\"title\" lang=\"zh\">\u6ce8\u610f</h3>\n<p lang=\"zh\">\u5728 <span class=\"productname\">PostgreSQL</span> 10 \u4e4b\u524d\uff0c\u9664\u975e\u591a\u4e2a\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u59cb\u7ec8\u4ea7\u751f\u76f8\u540c\u6570\u91cf\u7684\u884c\uff0c\u5426\u5219\u628a\u5b83\u4eec\u653e\u5728\u540c\u4e00\u4e2a\u9009\u62e9\u5217\u8868\u4e2d\u7684\u884c\u4e3a\u5e76\u4e0d\u5408\u7406\u3002\u5426\u5219\uff0c\u5f97\u5230\u7684\u8f93\u51fa\u884c\u6570\u4f1a\u662f\u8fd9\u4e9b\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u5404\u81ea\u4ea7\u751f\u884c\u6570\u7684\u6700\u5c0f\u516c\u500d\u6570\u3002\u6b64\u5916\uff0c\u5d4c\u5957\u7684\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u4e5f\u4e0d\u50cf\u4e0a\u6587\u6240\u63cf\u8ff0\u7684\u90a3\u6837\u5de5\u4f5c\uff1b\u76f8\u53cd\uff0c\u4e00\u4e2a\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u81f3\u591a\u53ea\u80fd\u6709\u4e00\u4e2a\u96c6\u5408\u8fd4\u56de\u53c2\u6570\uff0c\u5e76\u4e14\u6bcf\u4e00\u7ec4\u5d4c\u5957\u7684\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u90fd\u4f1a\u72ec\u7acb\u8fd0\u884c\u3002\u518d\u52a0\u4e0a\u8fc7\u53bb\u8fd8\u5141\u8bb8\u6761\u4ef6\u6267\u884c\uff08\u5373\u5728 <code class=\"literal\">CASE</code> \u7b49\u7ed3\u6784\u5185\u90e8\u4f7f\u7528\u96c6\u5408\u8fd4\u56de\u51fd\u6570\uff09\uff0c\u4e8b\u60c5\u5c31\u66f4\u52a0\u590d\u6742\u4e86\u3002\u5982\u679c\u4f60\u8981\u7f16\u5199\u9700\u8981\u5728\u65e7\u7248 <span class=\"productname\">PostgreSQL</span> \u4e0a\u8fd0\u884c\u7684\u67e5\u8be2\uff0c\u5efa\u8bae\u4f7f\u7528 <code class=\"literal\">LATERAL</code> \u8bed\u6cd5\uff0c\u56e0\u4e3a\u8fd9\u6837\u5728\u4e0d\u540c\u7248\u672c\u4e4b\u95f4\u80fd\u591f\u5f97\u5230\u4e00\u81f4\u7684\u7ed3\u679c\u3002\u5982\u679c\u4f60\u7684\u67e5\u8be2\u4f9d\u8d56\u4e8e\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u7684\u6761\u4ef6\u6267\u884c\uff0c\u6216\u8bb8\u53ef\u4ee5\u628a\u6761\u4ef6\u5224\u65ad\u79fb\u52a8\u5230\u81ea\u5b9a\u4e49\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u5185\u90e8\u6765\u4fee\u590d\u3002\u4f8b\u5982\uff0c</p>\n<pre class=\"programlisting\">SELECT x, CASE WHEN y &gt; 0 THEN generate_series(1, z) ELSE 5 END FROM tab;\n</pre>\n<p lang=\"zh\">\u53ef\u4ee5\u53d8\u6210</p>\n<pre class=\"programlisting\">CREATE FUNCTION case_generate_series(cond bool, start int, fin int, els int)\n  RETURNS SETOF int AS $$\nBEGIN\n  IF cond THEN\n    RETURN QUERY SELECT generate_series(start, fin);\n  ELSE\n    RETURN QUERY SELECT els;\n  END IF;\nEND$$ LANGUAGE plpgsql;\n\nSELECT x, case_generate_series(y &gt; 0, 1, z, 5) FROM tab;\n</pre>\n<p lang=\"zh\">\u8fd9\u79cd\u5199\u6cd5\u5728\u6240\u6709\u7248\u672c\u7684 <span class=\"productname\">PostgreSQL</span> \u4e2d\u7684\u884c\u4e3a\u90fd\u76f8\u540c\u3002</p>\n</div>\n</div>\n<div class=\"sect2\" id=\"XFUNC-SQL-FUNCTIONS-RETURNING-TABLE\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/13/xfunc-sql.html#XFUNC-SQL-FUNCTIONS-RETURNING-TABLE\">37.5.9. \u8fd4\u56de<code class=\"literal\">TABLE</code>\u7684<acronym class=\"acronym\">SQL</acronym>\u51fd\u6570</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\">\u8fd8\u6709\u53e6\u4e00\u79cd\u65b9\u6cd5\u53ef\u4ee5\u628a\u51fd\u6570\u58f0\u660e\u4e3a\u8fd4\u56de\u4e00\u4e2a\u96c6\u5408\uff0c\u5373\u4f7f\u7528 <code class=\"literal\">RETURNS TABLE(<em class=\"replaceable\"><code>columns</code></em>)</code>\u8bed\u6cd5\u3002\u8fd9\u7b49\u6548\u4e8e\u4f7f\u7528\u4e00\u4e2a\u6216\u8005\u591a\u4e2a<code class=\"literal\">OUT</code>\u53c2\u6570\u5916\u52a0\u628a\u51fd\u6570\u6807\u8bb0\u4e3a\u8fd4\u56de <code class=\"literal\">SETOF record</code>\uff08\u6216\u8005\u662f<code class=\"literal\">SETOF</code>\u5355\u4e2a\u8f93\u51fa\u53c2\u6570\u7684\u7c7b\u578b\uff09\u3002\u8fd9\u79cd\u5199\u6cd5\u662f\u5728\u6700\u8fd1\u7684 SQL \u6807\u51c6\u4e2d\u6307\u5b9a\u7684\uff0c\u56e0\u6b64\u53ef\u80fd\u6bd4\u4f7f\u7528 <code class=\"literal\">SETOF</code>\u7684\u79fb\u690d\u6027\u66f4\u597d\u3002</p>\n<p lang=\"zh\">\u4f8b\u5982\uff0c\u524d\u9762\u7684\u6c42\u548c\u5e76\u4e14\u76f8\u4e58\u7684\u793a\u4f8b\u4e5f\u53ef\u4ee5\u8fd9\u6837\u6765\u505a\uff1a</p>\n<pre class=\"programlisting\">CREATE FUNCTION sum_n_product_with_tab (x int)\nRETURNS TABLE(sum int, product int) AS $$\n    SELECT $1 + tab.y, $1 * tab.y FROM tab;\n$$ LANGUAGE SQL;\n</pre>\n<p lang=\"zh\">\u4e0d\u5141\u8bb8\u628a\u663e\u5f0f\u7684<code class=\"literal\">OUT</code>\u6216\u8005<code class=\"literal\">INOUT</code>\u53c2\u6570\u7528\u4e8e <code class=\"literal\">RETURNS TABLE</code>\u8bb0\u6cd5 \u2014 \u5fc5\u987b\u628a\u6240\u6709\u8f93\u51fa\u5217\u653e\u5728 <code class=\"literal\">TABLE</code>\u5217\u8868\u4e2d\u3002</p>\n</div>\n<div class=\"sect2\" id=\"XFUNC-SQL-POLYMORPHIC-FUNCTIONS\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/13/xfunc-sql.html#XFUNC-SQL-POLYMORPHIC-FUNCTIONS\">37.5.10. \u591a\u6001<acronym class=\"acronym\">SQL</acronym>\u51fd\u6570</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\"><acronym class=\"acronym\">SQL</acronym> \u51fd\u6570\u53ef\u4ee5\u88ab\u58f0\u660e\u4e3a\u63a5\u53d7\u5e76\u8fd4\u56de<a class=\"xref\" href=\"/docs/13/extend-type-system.html#EXTEND-TYPES-POLYMORPHIC\" title=\"37.2.5.\u00a0\u591a\u6001\u7c7b\u578b\">\u7b2c\u00a037.2.5\u00a0\u8282</a>\u4e2d\u63cf\u8ff0\u7684\u591a\u6001\u7c7b\u578b\u3002\u4e0b\u9762\u8fd9\u4e2a\u591a\u6001\u51fd\u6570 <code class=\"function\">make_array</code> \u4f1a\u6839\u636e\u4e24\u4e2a\u4efb\u610f\u6570\u636e\u7c7b\u578b\u7684\u5143\u7d20\u6784\u9020\u4e00\u4e2a\u6570\u7ec4\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION make_array(anyelement, anyelement) RETURNS anyarray AS $$\n    SELECT ARRAY[$1, $2];\n$$ LANGUAGE SQL;\n\nSELECT make_array(1, 2) AS intarray, make_array('a'::text, 'b') AS textarray;\n intarray | textarray\n----------+-----------\n {1,2}    | {a,b}\n(1 row)\n</pre>\n<p lang=\"zh\">\u6ce8\u610f\u7c7b\u578b\u8f6c\u6362<code class=\"literal\">'a'::text</code>\u7684\u4f7f\u7528\u662f\u4e3a\u4e86\u6307\u5b9a\u8be5\u53c2\u6570\u7684\u7c7b\u578b\u662f<code class=\"type\">text</code>\u3002\u5982\u679c\u8be5\u53c2\u6570\u53ea\u662f\u4e00\u4e2a\u5b57\u7b26\u4e32\u5b57\u9762\u91cf\uff0c\u8fd9\u5c31\u662f\u5fc5\u987b\u7684\uff0c\u56e0\u4e3a\u5426\u5219\u5b83\u4f1a\u88ab\u5f53\u4f5c<code class=\"type\">unknown</code>\u7c7b\u578b\uff0c\u5e76\u4e14 <code class=\"type\">unknown</code>\u7684\u6570\u7ec4\u4e5f\u4e0d\u662f\u4e00\u79cd\u5408\u6cd5\u7684\u7c7b\u578b\u3002\u5982\u679c\u6ca1\u6709\u8be5\u7c7b\u578b\u8f6c\u6362\uff0c\u5c06\u5f97\u5230\u8fd9\u6837\u7684\u9519\u8bef\uff1a</p>\n<pre class=\"screen\">ERROR:  could not determine polymorphic type because input has type unknown\n</pre>\n<p lang=\"zh\">\u6309\u7167\u4e0a\u9762\u7684\u65b9\u5f0f\u58f0\u660e <code class=\"function\">make_array</code> \u65f6\uff0c\u4f60\u5fc5\u987b\u63d0\u4f9b\u4e24\u4e2a\u6570\u636e\u7c7b\u578b\u5b8c\u5168\u76f8\u540c\u7684\u53c2\u6570\uff1b\u7cfb\u7edf\u4e0d\u4f1a\u5c1d\u8bd5\u89e3\u51b3\u5b83\u4eec\u4e4b\u95f4\u7684\u7c7b\u578b\u5dee\u5f02\u3002\u4f8b\u5982\uff0c\u4e0b\u9762\u8fd9\u6837\u662f\u4e0d\u884c\u7684\uff1a</p>\n<pre class=\"screen\">SELECT make_array(1, 2.5) AS numericarray;\nERROR:  function make_array(integer, numeric) does not exist\n</pre>\n<p lang=\"zh\">\u53e6\u4e00\u79cd\u65b9\u6cd5\u662f\u4f7f\u7528<span class=\"quote\">\u201c<span class=\"quote\">common</span>\u201d</span>\u8fd9\u4e00\u65cf\u591a\u6001\u7c7b\u578b\uff0c\u5b83\u5141\u8bb8\u7cfb\u7edf\u5c1d\u8bd5\u8bc6\u522b\u4e00\u4e2a\u5408\u9002\u7684\u516c\u5171\u7c7b\u578b\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION make_array2(anycompatible, anycompatible)\nRETURNS anycompatiblearray AS $$\n    SELECT ARRAY[$1, $2];\n$$ LANGUAGE SQL;\n\nSELECT make_array2(1, 2.5) AS numericarray;\n numericarray\n--------------\n {1,2.5}\n(1 row)\n</pre>\n<p lang=\"zh\">\u7531\u4e8e\u516c\u5171\u7c7b\u578b\u89e3\u6790\u89c4\u5219\u5728\u6240\u6709\u8f93\u5165\u90fd\u662f\u672a\u77e5\u7c7b\u578b\u65f6\u9ed8\u8ba4\u9009\u62e9 <code class=\"type\">text</code>\uff0c\u6240\u4ee5\u4e0b\u9762\u7684\u5199\u6cd5\u4e5f\u80fd\u5de5\u4f5c\uff1a</p>\n<pre class=\"screen\">SELECT make_array2('a', 'b') AS textarray;\n textarray \n-----------\n {a,b}\n(1 row)\n</pre>\n<p lang=\"zh\">\u5141\u8bb8\u5b58\u5728\u5177\u6709\u56fa\u5b9a\u8fd4\u56de\u7c7b\u578b\u7684\u591a\u6001\u53c2\u6570\uff0c\u4f46\u53cd\u8fc7\u6765\u5219\u4e0d\u5141\u8bb8\u3002\u4f8b\u5982\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION is_greater(anyelement, anyelement) RETURNS boolean AS $$\n    SELECT $1 &gt; $2;\n$$ LANGUAGE SQL;\n\nSELECT is_greater(1, 2);\n is_greater\n------------\n f\n(1 row)\n\nCREATE FUNCTION invalid_func() RETURNS anyelement AS $$\n    SELECT 1;\n$$ LANGUAGE SQL;\nERROR:  cannot determine result data type\nDETAIL:  A result of type anyelement requires at least one input of type anyelement, anyarray, anynonarray, anyenum, or anyrange.\n</pre>\n<p lang=\"zh\">\u591a\u6001\u4e5f\u53ef\u4ee5\u548c\u5e26\u8f93\u51fa\u53c2\u6570\u7684\u51fd\u6570\u4e00\u8d77\u4f7f\u7528\u3002\u4f8b\u5982\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION dup (f1 anyelement, OUT f2 anyelement, OUT f3 anyarray)\nAS 'select $1, array[$1,$1]' LANGUAGE SQL;\n\nSELECT * FROM dup(22);\n f2 |   f3\n----+---------\n 22 | {22,22}\n(1 row)\n</pre>\n<p lang=\"zh\">\u591a\u6001\u4e5f\u53ef\u4ee5\u7528\u4e8e\u53ef\u53d8\u53c2\u6570\u51fd\u6570\u3002\u4f8b\u5982\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION anyleast (VARIADIC anyarray) RETURNS anyelement AS $$\n    SELECT min($1[i]) FROM generate_subscripts($1, 1) g(i);\n$$ LANGUAGE SQL;\n\nSELECT anyleast(10, -1, 5, 4);\n anyleast \n----------\n       -1\n(1 row)\n\nSELECT anyleast('abc'::text, 'def');\n anyleast \n----------\n abc\n(1 row)\n\nCREATE FUNCTION concat_values(text, VARIADIC anyarray) RETURNS text AS $$\n    SELECT array_to_string($2, $1);\n$$ LANGUAGE SQL;\n\nSELECT concat_values('|', 1, 4, 2);\n concat_values \n---------------\n 1|4|2\n(1 row)\n</pre>\n</div>\n<div class=\"sect2\" id=\"id-1.8.3.8.19\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/13/xfunc-sql.html#id-1.8.3.8.19\">37.5.11. \u5e26\u6709\u6392\u5e8f\u89c4\u5219\u7684<acronym class=\"acronym\">SQL</acronym>\u51fd\u6570</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\">\u5f53\u4e00\u4e2a SQL \u51fd\u6570\u6709\u4e00\u4e2a\u6216\u591a\u4e2a\u652f\u6301\u6392\u5e8f\u89c4\u5219\u7684\u6570\u636e\u7c7b\u578b\u53c2\u6570\u65f6\uff0c\u4f1a\u6839\u636e\u5b9e\u53c2\u6240\u5e26\u7684\u6392\u5e8f\u89c4\u5219\uff0c\u4e3a\u6bcf\u6b21\u51fd\u6570\u8c03\u7528\u786e\u5b9a\u4e00\u4e2a\u6392\u5e8f\u89c4\u5219\uff0c\u8be6\u89c1<a class=\"xref\" href=\"/docs/13/collation.html\" title=\"23.2.\u00a0\u6392\u5e8f\u89c4\u5219\u652f\u6301\">\u7b2c\u00a023.2\u00a0\u8282</a>\u3002\u5982\u679c\u80fd\u591f\u6210\u529f\u786e\u5b9a\uff08\u4e5f\u5c31\u662f\u8bf4\uff0c\u53c2\u6570\u4e4b\u95f4\u4e0d\u5b58\u5728\u9690\u5f0f\u6392\u5e8f\u89c4\u5219\u51b2\u7a81\uff09\uff0c\u90a3\u4e48\u6240\u6709\u652f\u6301\u6392\u5e8f\u89c4\u5219\u7684\u53c2\u6570\u90fd\u4f1a\u88ab\u89c6\u4e3a\u9690\u5f0f\u5e26\u6709\u8be5\u6392\u5e8f\u89c4\u5219\u3002\u8fd9\u4f1a\u5f71\u54cd\u51fd\u6570\u4e2d\u5bf9\u6392\u5e8f\u89c4\u5219\u654f\u611f\u7684\u64cd\u4f5c\u7684\u884c\u4e3a\u3002\u4f8b\u5982\uff0c\u4f7f\u7528\u4e0a\u6587\u7684 <code class=\"function\">anyleast</code> \u51fd\u6570\u65f6\uff0c</p>\n<pre class=\"programlisting\">SELECT anyleast('abc'::text, 'ABC');\n</pre>\n<p lang=\"zh\">\u7684\u7ed3\u679c\u5c06\u53d6\u51b3\u4e8e\u6570\u636e\u5e93\u7684\u9ed8\u8ba4\u6392\u5e8f\u89c4\u5219\u3002\u5728 <code class=\"literal\">C</code> \u533a\u57df\u8bbe\u7f6e\u4e0b\uff0c\u7ed3\u679c\u4f1a\u662f <code class=\"literal\">ABC</code>\uff0c\u4f46\u5728\u8bb8\u591a\u5176\u4ed6\u533a\u57df\u8bbe\u7f6e\u4e0b\u5219\u4f1a\u662f <code class=\"literal\">abc</code>\u3002\u53ef\u4ee5\u5728\u4efb\u610f\u53c2\u6570\u4e0a\u6dfb\u52a0 <code class=\"literal\">COLLATE</code> \u5b50\u53e5\u6765\u5f3a\u5236\u6307\u5b9a\u8981\u4f7f\u7528\u7684\u6392\u5e8f\u89c4\u5219\uff0c\u4f8b\u5982\uff1a</p>\n<pre class=\"programlisting\">SELECT anyleast('abc'::text, 'ABC' COLLATE \"C\");\n</pre>\n<p lang=\"zh\">\u53e6\u5916\uff0c\u5982\u679c\u4f60\u5e0c\u671b\u67d0\u4e2a\u51fd\u6570\u65e0\u8bba\u4ee5\u4ec0\u4e48\u6392\u5e8f\u89c4\u5219\u8c03\u7528\uff0c\u90fd\u59cb\u7ec8\u6309\u7279\u5b9a\u6392\u5e8f\u89c4\u5219\u5de5\u4f5c\uff0c\u53ef\u4ee5\u5728\u51fd\u6570\u5b9a\u4e49\u4e2d\u6309\u9700\u63d2\u5165 <code class=\"literal\">COLLATE</code> \u5b50\u53e5\u3002\u4e0b\u9762\u8fd9\u4e2a\u7248\u672c\u7684 <code class=\"function\">anyleast</code> \u5c06\u59cb\u7ec8\u4f7f\u7528 <code class=\"literal\">en_US</code> \u533a\u57df\u8bbe\u7f6e\u6765\u6bd4\u8f83\u5b57\u7b26\u4e32\uff1a</p>\n<pre class=\"programlisting\">CREATE FUNCTION anyleast (VARIADIC anyarray) RETURNS anyelement AS $$\n    SELECT min($1[i] COLLATE \"en_US\") FROM generate_subscripts($1, 1) g(i);\n$$ LANGUAGE SQL;\n</pre>\n<p lang=\"zh\">\u4f46\u8bf7\u6ce8\u610f\uff0c\u5982\u679c\u628a\u5b83\u7528\u4e8e\u4e0d\u652f\u6301\u6392\u5e8f\u89c4\u5219\u7684\u6570\u636e\u7c7b\u578b\uff0c\u5c31\u4f1a\u629b\u51fa\u9519\u8bef\u3002</p>\n<p lang=\"zh\">\u5982\u679c\u65e0\u6cd5\u5728\u5b9e\u53c2\u4e4b\u95f4\u786e\u5b9a\u5171\u540c\u7684\u6392\u5e8f\u89c4\u5219\uff0c\u90a3\u4e48 SQL \u51fd\u6570\u4f1a\u628a\u53c2\u6570\u89c6\u4e3a\u5e26\u6709\u5176\u6570\u636e\u7c7b\u578b\u7684\u9ed8\u8ba4\u6392\u5e8f\u89c4\u5219\uff08\u901a\u5e38\u662f\u6570\u636e\u5e93\u7684\u9ed8\u8ba4\u6392\u5e8f\u89c4\u5219\uff0c\u4f46\u5bf9\u57df\u7c7b\u578b\u53c2\u6570\u6765\u8bf4\u4e5f\u53ef\u80fd\u4e0d\u540c\uff09\u3002</p>\n<p lang=\"zh\">\u8fd9\u79cd\u652f\u6301\u6392\u5e8f\u89c4\u5219\u7684\u53c2\u6570\u7684\u884c\u4e3a\uff0c\u53ef\u4ee5\u770b\u4f5c\u662f\u4ec5\u9002\u7528\u4e8e\u6587\u672c\u6570\u636e\u7c7b\u578b\u7684\u4e00\u79cd\u53d7\u9650\u591a\u6001\u5f62\u5f0f\u3002</p>\n</div>\n</div>", "manual_path": "/docs/13/xfunc-sql.html", "localization": {"status": "complete", "sources": [{"url": "/docs/13/xfunc-sql.html", "method": "same-major semantic node", "sha256": "ee2025d3237eed8cf187c5fb25ff41a0339651a1d0549b69201353b4c21c7766", "language": "zh", "matched_nodes": ["#XFUNC-SQL/div[10]/p[2]", "#XFUNC-SQL/div[10]/p[3]", "#XFUNC-SQL/div[10]/p[4]", "#XFUNC-SQL/div[10]/p[5]", "#XFUNC-SQL/div[10]/p[6]", "#XFUNC-SQL/div[10]/p[8]", "#XFUNC-SQL/div[11]/p[10]", "#XFUNC-SQL/div[11]/p[12]", "#XFUNC-SQL/div[11]/p[13]", "#XFUNC-SQL/div[11]/p[15]", "#XFUNC-SQL/div[11]/p[17]", "#XFUNC-SQL/div[11]/p[19]", "#XFUNC-SQL/div[11]/p[1]", "#XFUNC-SQL/div[11]/p[3]", "#XFUNC-SQL/div[11]/p[4]", "#XFUNC-SQL/div[11]/p[6]", "#XFUNC-SQL/div[11]/p[8]", "#XFUNC-SQL/div[12]/div[12]/ul[0]/li[0]", "#XFUNC-SQL/div[12]/div[12]/ul[0]/li[1]", "#XFUNC-SQL/div[12]/p[10]", "#XFUNC-SQL/div[12]/p[11]", "#XFUNC-SQL/div[12]/p[13]", "#XFUNC-SQL/div[12]/p[15]", "#XFUNC-SQL/div[12]/p[16]", "#XFUNC-SQL/div[12]/p[18]", "#XFUNC-SQL/div[12]/p[1]", "#XFUNC-SQL/div[12]/p[20]", "#XFUNC-SQL/div[12]/p[21]", "#XFUNC-SQL/div[12]/p[23]", "#XFUNC-SQL/div[12]/p[25]", "#XFUNC-SQL/div[12]/p[27]", "#XFUNC-SQL/div[12]/p[28]", "#XFUNC-SQL/div[12]/p[3]", "#XFUNC-SQL/div[12]/p[5]", "#XFUNC-SQL/div[12]/p[6]", "#XFUNC-SQL/div[12]/p[8]", "#XFUNC-SQL/div[13]/p[11]", "#XFUNC-SQL/div[13]/p[2]", "#XFUNC-SQL/div[13]/p[4]", "#XFUNC-SQL/div[13]/p[6]", "#XFUNC-SQL/div[13]/p[8]", "#XFUNC-SQL/div[13]/p[9]", "#XFUNC-SQL/div[14]/p[10]", "#XFUNC-SQL/div[14]/p[11]", "#XFUNC-SQL/div[14]/p[13]", "#XFUNC-SQL/div[14]/p[14]", "#XFUNC-SQL/div[14]/p[16]", "#XFUNC-SQL/div[14]/p[3]", "#XFUNC-SQL/div[14]/p[5]", "#XFUNC-SQL/div[14]/p[7]", "#XFUNC-SQL/div[14]/p[8]", "#XFUNC-SQL/div[15]/p[2]", "#XFUNC-SQL/div[15]/p[3]", "#XFUNC-SQL/div[15]/p[5]", "#XFUNC-SQL/div[16]/p[1]", "#XFUNC-SQL/div[16]/p[2]", "#XFUNC-SQL/div[16]/p[4]", "#XFUNC-SQL/div[16]/p[5]", "#XFUNC-SQL/div[17]/div[28]/p[1]", "#XFUNC-SQL/div[17]/div[29]/p[1]", "#XFUNC-SQL/div[17]/div[29]/p[3]", "#XFUNC-SQL/div[17]/div[29]/p[5]", "#XFUNC-SQL/div[17]/p[10]", "#XFUNC-SQL/div[17]/p[12]", "#XFUNC-SQL/div[17]/p[13]", "#XFUNC-SQL/div[17]/p[15]", "#XFUNC-SQL/div[17]/p[16]", "#XFUNC-SQL/div[17]/p[18]", "#XFUNC-SQL/div[17]/p[20]", "#XFUNC-SQL/div[17]/p[21]", "#XFUNC-SQL/div[17]/p[22]", "#XFUNC-SQL/div[17]/p[24]", "#XFUNC-SQL/div[17]/p[25]", "#XFUNC-SQL/div[17]/p[2]", "#XFUNC-SQL/div[17]/p[3]", "#XFUNC-SQL/div[17]/p[5]", "#XFUNC-SQL/div[17]/p[7]", "#XFUNC-SQL/div[17]/p[9]", "#XFUNC-SQL/div[18]/p[2]", "#XFUNC-SQL/div[18]/p[3]", "#XFUNC-SQL/div[18]/p[5]", "#XFUNC-SQL/div[19]/p[11]", "#XFUNC-SQL/div[19]/p[13]", "#XFUNC-SQL/div[19]/p[15]", "#XFUNC-SQL/div[19]/p[1]", "#XFUNC-SQL/div[19]/p[3]", "#XFUNC-SQL/div[19]/p[5]", "#XFUNC-SQL/div[19]/p[7]", "#XFUNC-SQL/div[19]/p[9]", "#XFUNC-SQL/div[1]/dl[0]/dt[0]", "#XFUNC-SQL/div[1]/dl[0]/dt[10]", "#XFUNC-SQL/div[1]/dl[0]/dt[1]", "#XFUNC-SQL/div[1]/dl[0]/dt[2]", "#XFUNC-SQL/div[1]/dl[0]/dt[3]", "#XFUNC-SQL/div[1]/dl[0]/dt[4]", "#XFUNC-SQL/div[1]/dl[0]/dt[5]", "#XFUNC-SQL/div[1]/dl[0]/dt[6]", "#XFUNC-SQL/div[1]/dl[0]/dt[7]", "#XFUNC-SQL/div[1]/dl[0]/dt[8]", "#XFUNC-SQL/div[1]/dl[0]/dt[9]", "#XFUNC-SQL/div[20]/p[10]", "#XFUNC-SQL/div[20]/p[2]", "#XFUNC-SQL/div[20]/p[4]", "#XFUNC-SQL/div[20]/p[6]", "#XFUNC-SQL/div[20]/p[8]", "#XFUNC-SQL/div[20]/p[9]", "#XFUNC-SQL/div[8]/h3[0]", "#XFUNC-SQL/div[8]/p[1]", "#XFUNC-SQL/p[3]", "#XFUNC-SQL/p[4]", "#XFUNC-SQL/p[5]", "#XFUNC-SQL/p[6]", "#XFUNC-SQL/p[9]"]}], "language": "zh", "original_text": {"/versions/13/description/0": "SQL-language functions", "/versions/13/facts/0/label": "Kind", "/versions/13/facts/0/value": "Native function language", "/versions/13/facts/1/label": "Trusted", "/versions/13/facts/2/label": "Validator"}, "fallback_fields": [], "source_language": "en", "original_snapshot_sha256": "7e0a40a3a408c34ba49b2409e64fa08f94db073d923f9574ce86690c1e28f5a2"}, "comparison_data": {"kind": "Native function language", "handler": "", "trusted": "t", "validator": "fmgr_sql_validator"}, "comparison_hash": "a4af9cf453d140d941e865b952c6a41e2b704a4b30cb77b61c1cdda8a77c5035", "manual_language": "zh"}, "14": {"facts": [{"label": "\u79cd\u7c7b", "value": "\u539f\u751f\u51fd\u6570\u8bed\u8a00"}, {"label": "\u53ef\u4fe1", "value": "t"}, {"label": "\u6821\u9a8c\u51fd\u6570", "value": "fmgr_sql_validator"}], "tables": [], "aliases": [], "catalog": {"oid": "14", "descr": "SQL-language functions", "lanacl": "_null_", "lanispl": "f", "lanname": "sql", "lanowner": "POSTGRES", "laninline": "0", "oid_symbol": "SQLlanguageId", "lanpltrusted": "t", "lanvalidator": "fmgr_sql_validator", "lanplcallfoid": "0"}, "related": [], "release": {"ref": "https://ftp.postgresql.org/pub/source/v14.24/postgresql-14.24.tar.bz2", "label": "14.24", "major": "14", "channel": "stable", "revision": "a7fa7ed3d558172355f51406097a7bd4f6b473be80f311ef7cda96bf383d8897", "source_sha256": "a7fa7ed3d558172355f51406097a7bd4f6b473be80f311ef7cda96bf383d8897", "catalog_fingerprint": "b272e6a82e4c46efda81c3a6a4cdf7de6a83dfff7f02f226a392fbe9acdd3adb"}, "sources": [{"url": "https://ftp.postgresql.org/pub/source/v14.24/postgresql-14.24.tar.bz2", "label": "Matching PostgreSQL source archive", "sha256": "a7fa7ed3d558172355f51406097a7bd4f6b473be80f311ef7cda96bf383d8897"}, {"url": "https://pg.center/docs/14/xfunc-sql.html", "path": "xfunc-sql.html", "label": "PostgreSQL 14 English manual", "sha256": "0f09c18b1f114e8da00391415daf42a6b826d2791a74fb0b933f0674c16ece58", "language": "en", "original_url": "/docs/14/xfunc-sql.html"}], "sections": [], "signature": "", "attributes": {"kind": "Native function language", "handler": "", "trusted": "t", "validator": "fmgr_sql_validator"}, "description": ["SQL \u8bed\u8a00\u51fd\u6570"], "manual_html": "<div class=\"sect1\" id=\"XFUNC-SQL\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h2 class=\"title\" lang=\"zh\">38.5. \u67e5\u8be2\u8bed\u8a00\uff08SQL\uff09\u51fd\u6570</h2>\n</div>\n</div>\n</div>\n<p lang=\"zh\">SQL \u51fd\u6570\u6267\u884c\u7531\u4efb\u610f SQL \u8bed\u53e5\u7ec4\u6210\u7684\u4e00\u4e2a\u5217\u8868\uff0c\u5e76\u8fd4\u56de\u5217\u8868\u4e2d\u6700\u540e\u4e00\u4e2a\u67e5\u8be2\u7684\u7ed3\u679c\u3002\u5728\u7b80\u5355\uff08\u975e\u96c6\u5408\uff09\u60c5\u51b5\u4e0b\uff0c\u5c06\u8fd4\u56de\u6700\u540e\u4e00\u4e2a\u67e5\u8be2\u7ed3\u679c\u7684\u7b2c\u4e00\u884c\u3002\uff08\u8bf7\u8bb0\u4f4f\uff0c\u9664\u975e\u4f7f\u7528 <code class=\"literal\">ORDER BY</code>\uff0c\u5426\u5219\u591a\u884c\u7ed3\u679c\u4e2d\u7684<span class=\"quote\">\u201c<span class=\"quote\">\u7b2c\u4e00\u884c</span>\u201d</span>\u5e76\u6ca1\u6709\u660e\u786e\u5b9a\u4e49\u3002\uff09\u5982\u679c\u6700\u540e\u4e00\u4e2a\u67e5\u8be2\u5b8c\u5168\u6ca1\u6709\u8fd4\u56de\u4efb\u4f55\u884c\uff0c\u5219\u8fd4\u56de\u7a7a\u503c\u3002</p>\n<p lang=\"zh\">\u6216\u8005\uff0c\u4e00\u4e2a SQL \u51fd\u6570\u53ef\u4ee5\u901a\u8fc7\u6307\u5b9a\u51fd\u6570\u7684\u8fd4\u56de\u7c7b\u578b\u4e3a<code class=\"literal\">SETOF <em class=\"replaceable\"><code>sometype</code></em></code>\u88ab\u58f0\u660e\u4e3a\u8fd4\u56de\u4e00\u4e2a\u96c6\u5408\uff08\u4e5f\u5c31\u662f\u591a\u4e2a\u884c\uff09\uff0c\u6216\u8005\u7b49\u6548\u5730\u58f0\u660e\u5b83\u4e3a<code class=\"literal\">RETURNS TABLE(<em class=\"replaceable\"><code>columns</code></em>)</code>\u3002\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b\uff0c\u6700\u540e\u4e00\u4e2a\u67e5\u8be2\u7684\u7ed3\u679c\u7684\u6240\u6709\u884c\u4f1a\u88ab\u8fd4\u56de\u3002\u4e0b\u6587\u5c06\u7ed9\u51fa\u8fdb\u4e00\u6b65\u7684\u7ec6\u8282\u3002</p>\n<p lang=\"zh\">SQL \u51fd\u6570\u7684\u51fd\u6570\u4f53\u5fc5\u987b\u662f\u4e00\u4e2a\u7531\u5206\u53f7\u5206\u9694\u7684 SQL \u8bed\u53e5\u5217\u8868\u3002\u6700\u540e\u4e00\u6761\u8bed\u53e5\u540e\u7684\u5206\u53f7\u662f\u53ef\u9009\u7684\u3002\u9664\u975e\u8be5\u51fd\u6570\u88ab\u58f0\u660e\u4e3a\u8fd4\u56de <code class=\"type\">void</code>\uff0c\u5426\u5219\u6700\u540e\u4e00\u6761\u8bed\u53e5\u5fc5\u987b\u662f <code class=\"command\">SELECT</code>\uff0c\u6216\u8005\u662f <code class=\"command\">INSERT</code>\u3001<code class=\"command\">UPDATE</code> \u6216 <code class=\"command\">DELETE</code> \u5e76\u5e26\u6709 <code class=\"literal\">RETURNING</code> \u5b50\u53e5\u3002</p>\n<p lang=\"zh\">\u4efb\u610f\u4e00\u7ec4 <acronym class=\"acronym\">SQL</acronym> \u8bed\u8a00\u547d\u4ee4\u90fd\u53ef\u4ee5\u6253\u5305\u5e76\u5b9a\u4e49\u6210\u51fd\u6570\u3002\u9664 <code class=\"command\">SELECT</code> \u67e5\u8be2\u5916\uff0c\u8fd9\u4e9b\u547d\u4ee4\u8fd8\u53ef\u4ee5\u5305\u542b\u6570\u636e\u4fee\u6539\u67e5\u8be2\uff08<code class=\"command\">INSERT</code>\u3001<code class=\"command\">UPDATE</code>\u3001<code class=\"command\">DELETE</code>\uff09\uff0c\u4ee5\u53ca\u5176\u4ed6 SQL \u547d\u4ee4\u3002\uff08\u5728 <acronym class=\"acronym\">SQL</acronym> \u51fd\u6570\u4e2d\u4e0d\u80fd\u4f7f\u7528\u4e8b\u52a1\u63a7\u5236\u547d\u4ee4\uff0c\u4f8b\u5982 <code class=\"command\">COMMIT</code>\u3001<code class=\"command\">SAVEPOINT</code>\uff0c\u4e5f\u4e0d\u80fd\u4f7f\u7528\u67d0\u4e9b\u5de5\u5177\u547d\u4ee4\uff0c\u4f8b\u5982 <code class=\"literal\">VACUUM</code>\u3002\uff09\u4e0d\u8fc7\uff0c\u6700\u540e\u4e00\u6761\u547d\u4ee4\u5fc5\u987b\u662f <code class=\"command\">SELECT</code>\uff0c\u6216\u8005\u5e26\u6709 <code class=\"literal\">RETURNING</code> \u5b50\u53e5\uff0c\u5e76\u8fd4\u56de\u4e0e\u51fd\u6570\u58f0\u660e\u8fd4\u56de\u7c7b\u578b\u76f8\u7b26\u7684\u7ed3\u679c\u3002\u6216\u8005\uff0c\u5982\u679c\u4f60\u60f3\u5b9a\u4e49\u4e00\u4e2a\u6267\u884c\u52a8\u4f5c\u4f46\u6ca1\u6709\u6709\u7528\u8fd4\u56de\u503c\u7684 SQL \u51fd\u6570\uff0c\u4e5f\u53ef\u4ee5\u628a\u5b83\u5b9a\u4e49\u4e3a\u8fd4\u56de <code class=\"type\">void</code>\u3002\u4f8b\u5982\uff0c\u4e0b\u9762\u8fd9\u4e2a\u51fd\u6570\u4f1a\u4ece <code class=\"literal\">emp</code> \u8868\u4e2d\u5220\u9664\u85aa\u8d44\u4e3a\u8d1f\u7684\u884c\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION clean_emp() RETURNS void AS '\n    DELETE FROM emp\n        WHERE salary &lt; 0;\n' LANGUAGE SQL;\n\nSELECT clean_emp();\n\n clean_emp\n-----------\n\n(1 row)\n</pre>\n<p lang=\"zh\">\u4f60\u4e5f\u53ef\u4ee5\u628a\u8fd9\u4e2a\u5199\u4e3a\u4e00\u4e2a\u8fc7\u7a0b\uff0c\u90a3\u6837\u907f\u514d\u8fd4\u56de\u7c7b\u578b\u7684\u95ee\u9898\u3002\u4f8b\u5982\uff1a</p>\n<pre class=\"screen\">CREATE PROCEDURE clean_emp() AS '\n    DELETE FROM emp\n        WHERE salary &lt; 0;\n' LANGUAGE SQL;\n\nCALL clean_emp();\n</pre>\n<p lang=\"zh\">\u5728\u50cf\u8fd9\u6837\u7684\u7b80\u5355\u60c5\u51b5\u4e2d\uff0c\u8fd4\u56de<code class=\"type\">void</code>\u7684\u51fd\u6570\u4e0e\u8fc7\u7a0b\u4e4b\u95f4\u7684\u5dee\u5f02\u4e3b\u8981\u662f\u98ce\u683c\u4e0a\u9762\u7684\u3002\u4e0d\u8fc7\uff0c\u8fc7\u7a0b\u8fd8\u63d0\u4f9b\u4e86\u51fd\u6570\u6240\u6ca1\u6709\u7684\u989d\u5916\u80fd\u529b\uff0c\u4f8b\u5982\u4e8b\u52a1\u63a7\u5236\u3002\u6b64\u5916\uff0c\u8fc7\u7a0b\u662f SQL \u6807\u51c6\u7684\u4e00\u90e8\u5206\uff0c\u800c\u8fd4\u56de<code class=\"type\">void</code>\u5219\u662f PostgreSQL \u6269\u5c55\u3002</p>\n<div class=\"note\">\n<h3 class=\"title\" lang=\"zh\">\u6ce8\u610f</h3>\n<p lang=\"zh\">SQL \u51fd\u6570\u7684\u6574\u4e2a\u51fd\u6570\u4f53\u4f1a\u5728\u4efb\u4f55\u8bed\u53e5\u6267\u884c\u4e4b\u524d\u5b8c\u6210\u89e3\u6790\u3002\u867d\u7136 SQL \u51fd\u6570\u53ef\u4ee5\u5305\u542b\u4fee\u6539\u7cfb\u7edf\u76ee\u5f55\u7684\u547d\u4ee4\uff0c\u4f8b\u5982 CREATE TABLE\uff0c\u4f46\u5728\u5206\u6790\u51fd\u6570\u4e2d\u540e\u7eed\u547d\u4ee4\u65f6\uff0c\u8fd9\u4e9b\u4fee\u6539\u5c1a\u4e0d\u53ef\u89c1\u3002\u56e0\u6b64\uff0c\u5c06 CREATE TABLE foo (...); INSERT INTO foo VALUES(...); \u653e\u5728\u540c\u4e00\u4e2a SQL \u51fd\u6570\u4e2d\u4e0d\u4f1a\u6309\u9884\u671f\u5de5\u4f5c\uff0c\u56e0\u4e3a\u89e3\u6790 INSERT \u65f6 foo \u5c1a\u4e0d\u5b58\u5728\u3002\u6b64\u7c7b\u60c5\u51b5\u5efa\u8bae\u6539\u7528 PL/pgSQL\u3002</p>\n</div>\n<p lang=\"zh\"><code class=\"command\">CREATE FUNCTION</code> \u547d\u4ee4\u7684\u8bed\u6cd5\u8981\u6c42\u628a\u51fd\u6570\u4f53\u5199\u6210\u4e00\u4e2a\u5b57\u7b26\u4e32\u5e38\u91cf\u3002\u5bf9\u4e8e\u5b57\u7b26\u4e32\u5e38\u91cf\uff0c\u901a\u5e38\u4f7f\u7528\u7f8e\u5143\u5f15\u7528\u6700\u65b9\u4fbf\uff08\u89c1<a class=\"xref\" href=\"/docs/14/sql-syntax.html#SQL-SYNTAX-DOLLAR-QUOTING\" title=\"4.1.2.4.\u00a0\u7f8e\u5143\u5f15\u7528\u7684\u5b57\u7b26\u4e32\u5e38\u91cf\">\u7b2c\u00a04.1.2.4\u00a0\u8282</a>\uff09\u3002\u5982\u679c\u4f60\u9009\u62e9\u4f7f\u7528\u5e38\u89c4\u7684\u5355\u5f15\u53f7\u5b57\u7b26\u4e32\u5e38\u91cf\u8bed\u6cd5\uff0c\u90a3\u4e48\u5fc5\u987b\u5728\u51fd\u6570\u4f53\u4e2d\u5c06\u5355\u5f15\u53f7\uff08<code class=\"literal\">'</code>\uff09\u548c\u53cd\u659c\u7ebf\uff08<code class=\"literal\">\\</code>\uff09\u5199\u6210\u53cc\u4efd\uff08\u5047\u5b9a\u4f7f\u7528\u8f6c\u4e49\u5b57\u7b26\u4e32\u8bed\u6cd5\uff0c\u89c1<a class=\"xref\" href=\"/docs/14/sql-syntax.html#SQL-SYNTAX-STRINGS\" title=\"4.1.2.1.\u00a0\u5b57\u7b26\u4e32\u5e38\u91cf\">\u7b2c\u00a04.1.2.1\u00a0\u8282</a>\uff09\u3002</p>\n<div class=\"sect2\" id=\"XFUNC-SQL-FUNCTION-ARGUMENTS\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/14/xfunc-sql.html#XFUNC-SQL-FUNCTION-ARGUMENTS\">38.5.1. <acronym class=\"acronym\">SQL</acronym>\u51fd\u6570\u7684\u53c2\u6570</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\">\u4e00\u4e2a SQL \u51fd\u6570\u7684\u53c2\u6570\u53ef\u4ee5\u5728\u51fd\u6570\u4f53\u4e2d\u7528\u540d\u79f0\u6216\u7f16\u53f7\u5f15\u7528\u3002\u4e0b\u9762\u4f1a\u6709\u4e24\u79cd\u65b9\u6cd5\u7684\u793a\u4f8b\u3002</p>\n<p lang=\"zh\">\u8981\u4f7f\u7528\u4e00\u4e2a\u540d\u79f0\uff0c\u5c06\u51fd\u6570\u53c2\u6570\u58f0\u660e\u4e3a\u5e26\u6709\u4e00\u4e2a\u540d\u79f0\uff0c\u7136\u540e\u5728\u51fd\u6570\u4f53\u4e2d\u53ea\u5199\u8be5\u540d\u79f0\u3002\u5982\u679c\u53c2\u6570\u540d\u79f0\u4e0e\u51fd\u6570\u5185\u5f53\u524d SQL \u547d\u4ee4\u4e2d\u7684\u4efb\u610f\u5217\u540d\u76f8\u540c\uff0c\u5217\u540d\u5c06\u4f18\u5148\u3002\u5982\u679c\u4e0d\u60f3\u8fd9\u6837\uff0c\u53ef\u4ee5\u7528\u51fd\u6570\u672c\u8eab\u7684\u540d\u79f0\u6765\u9650\u5b9a\u53c2\u6570\u540d\uff0c\u4e5f\u5c31\u662f<code class=\"literal\"><em class=\"replaceable\"><code>function_name</code></em>.<em class=\"replaceable\"><code>argument_name</code></em></code>\uff08\u5982\u679c\u8fd9\u4f1a\u4e0e\u4e00\u4e2a\u88ab\u9650\u5b9a\u7684\u5217\u540d\u51b2\u7a81\uff0c\u7167\u4f8b\u8fd8\u662f\u5217\u540d\u8d62\u5f97\u4f18\u5148\u3002\u4f60\u53ef\u4ee5\u901a\u8fc7\u4e3a SQL \u547d\u4ee4\u4e2d\u7684\u8868\u9009\u62e9\u4e00\u4e2a\u4e0d\u540c\u7684\u522b\u540d\u6765\u907f\u514d\u8fd9\u79cd\u6df7\u6dc6\uff09\u3002</p>\n<p lang=\"zh\">\u5728\u66f4\u65e7\u7684\u6570\u5b57\u65b9\u6cd5\u4e2d\uff0c\u53c2\u6570\u53ef\u4ee5\u7528\u8bed\u6cd5<code class=\"literal\">$<em class=\"replaceable\"><code>n</code></em></code>\u5f15\u7528\uff1a<code class=\"literal\">$1</code>\u6307\u7684\u662f\u7b2c\u4e00\u4e2a\u8f93\u5165\u53c2\u6570\uff0c<code class=\"literal\">$2</code>\u6307\u7684\u662f\u7b2c\u4e8c\u4e2a\uff0c\u4ee5\u6b64\u7c7b\u63a8\u3002\u4e0d\u7ba1\u7279\u5b9a\u7684\u53c2\u6570\u662f\u5426\u4f7f\u7528\u540d\u79f0\u58f0\u660e\uff0c\u8fd9\u79cd\u65b9\u6cd5\u90fd\u6709\u6548\u3002</p>\n<p lang=\"zh\">\u5982\u679c\u4e00\u4e2a\u53c2\u6570\u662f\u4e00\u79cd\u590d\u5408\u7c7b\u578b\uff0c\u90a3\u4e48\u70b9\u53f7\u8bb0\u6cd5\uff08\u5982 <code class=\"literal\"><em class=\"replaceable\"><code>argname</code></em>.<em class=\"replaceable\"><code>fieldname</code></em></code> \u6216<code class=\"literal\">$1.<em class=\"replaceable\"><code>fieldname</code></em></code>\uff09\u4e5f\u53ef\u4ee5\u88ab\u7528\u6765\u8bbf\u95ee\u8be5\u53c2\u6570\u7684\u5c5e\u6027\u3002\u540c\u6837\uff0c\u4f60\u53ef\u80fd\u9700\u8981\u7528\u51fd\u6570\u7684\u540d\u79f0\u6765\u9650\u5b9a\u53c2\u6570\u7684\u540d\u79f0\u4ee5\u907f\u514d\u6b67\u4e49\u3002</p>\n<p lang=\"zh\">SQL \u51fd\u6570\u53c2\u6570\u53ea\u80fd\u88ab\u7528\u4f5c\u6570\u636e\u503c\u800c\u4e0d\u80fd\u4f5c\u4e3a\u6807\u8bc6\u7b26\u3002\u4f8b\u5982\u8fd9\u662f\u5408\u7406\u7684\uff1a</p>\n<pre class=\"programlisting\">INSERT INTO mytable VALUES ($1);\n</pre>\n<p lang=\"zh\">\u4f46\u8fd9\u6837\u5c31\u4e0d\u884c\uff1a</p>\n<pre class=\"programlisting\">INSERT INTO $1 VALUES (42);\n</pre>\n<div class=\"note\">\n<h3 class=\"title\" lang=\"zh\">\u6ce8\u610f</h3>\n<p lang=\"zh\">PostgreSQL 9.2 \u5f00\u59cb\u652f\u6301\u901a\u8fc7\u540d\u79f0\u5f15\u7528 SQL \u51fd\u6570\u53c2\u6570\u3002\u9700\u8981\u7528\u4e8e\u66f4\u65e9\u7248\u672c\u670d\u52a1\u5668\u7684\u51fd\u6570\u5fc5\u987b\u4f7f\u7528 $n \u8bb0\u6cd5\u3002</p>\n</div>\n</div>\n<div class=\"sect2\" id=\"XFUNC-SQL-BASE-FUNCTIONS\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/14/xfunc-sql.html#XFUNC-SQL-BASE-FUNCTIONS\">38.5.2. \u57fa\u7840\u7c7b\u578b\u4e0a\u7684<acronym class=\"acronym\">SQL</acronym>\u51fd\u6570</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\">\u6700\u7b80\u5355\u7684 <acronym class=\"acronym\">SQL</acronym> \u51fd\u6570\u6ca1\u6709\u53c2\u6570\uff0c\u53ea\u662f\u8fd4\u56de\u4e00\u4e2a\u57fa\u7840\u7c7b\u578b\uff0c\u4f8b\u5982 <code class=\"type\">integer</code>\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION one() RETURNS integer AS $$\n    SELECT 1 AS result;\n$$ LANGUAGE SQL;\n\n-- Alternative syntax for string literal:\nCREATE FUNCTION one() RETURNS integer AS '\n    SELECT 1 AS result;\n' LANGUAGE SQL;\n\nSELECT one();\n\n one\n-----\n   1\n</pre>\n<p lang=\"zh\">\u6ce8\u610f\u6211\u4eec\u4e3a\u8be5\u51fd\u6570\u7684\u7ed3\u679c\u5728\u51fd\u6570\u4f53\u5185\u5b9a\u4e49\u4e86\u4e00\u4e2a\u5217\u522b\u540d\uff08\u540d\u4e3a<code class=\"literal\">result</code>\uff09\uff0c\u4f46\u662f\u8fd9\u4e2a\u5217\u522b\u540d\u5728\u51fd\u6570\u4ee5\u5916\u662f\u4e0d\u53ef\u89c1\u7684\u3002\u56e0\u6b64\uff0c\u7ed3\u679c\u88ab\u6807\u8bb0\u4e3a<code class=\"literal\">one</code>\u800c\u4e0d\u662f<code class=\"literal\">result</code>\u3002</p>\n<p lang=\"zh\">\u5b9a\u4e49\u63a5\u53d7\u57fa\u7840\u7c7b\u578b\u53c2\u6570\u7684 <acronym class=\"acronym\">SQL</acronym> \u51fd\u6570\u4e5f\u51e0\u4e4e\u540c\u6837\u5bb9\u6613\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION add_em(x integer, y integer) RETURNS integer AS $$\n    SELECT x + y;\n$$ LANGUAGE SQL;\n\nSELECT add_em(1, 2) AS answer;\n\n answer\n--------\n      3\n</pre>\n<p lang=\"zh\">\u6216\u8005\uff0c\u6211\u4eec\u4e5f\u53ef\u4ee5\u4e0d\u7528\u53c2\u6570\u540d\uff0c\u800c\u6539\u7528\u6570\u5b57\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION add_em(integer, integer) RETURNS integer AS $$\n    SELECT $1 + $2;\n$$ LANGUAGE SQL;\n\nSELECT add_em(1, 2) AS answer;\n\n answer\n--------\n      3\n</pre>\n<p lang=\"zh\">\u4e0b\u9762\u662f\u4e00\u4e2a\u66f4\u6709\u7528\u7684\u51fd\u6570\uff0c\u5b83\u53ef\u4ee5\u7528\u6765\u4ece\u94f6\u884c\u8d26\u6237\u4e2d\u6263\u6b3e\uff1a</p>\n<pre class=\"programlisting\">CREATE FUNCTION tf1 (accountno integer, debit numeric) RETURNS numeric AS $$\n    UPDATE bank\n        SET balance = balance - debit\n        WHERE accountno = tf1.accountno;\n    SELECT 1;\n$$ LANGUAGE SQL;\n</pre>\n<p lang=\"zh\">\u7528\u6237\u53ef\u4ee5\u8fd9\u6837\u6267\u884c\u8be5\u51fd\u6570\uff0c\u4ece 17 \u53f7\u8d26\u6237\u4e2d\u6263\u9664 $100.00\uff1a</p>\n<pre class=\"programlisting\">SELECT tf1(17, 100.0);\n</pre>\n<p lang=\"zh\">\u5728\u8fd9\u4e2a\u793a\u4f8b\u4e2d\uff0c\u6211\u4eec\u4e3a\u7b2c\u4e00\u4e2a\u53c2\u6570\u9009\u62e9\u4e86\u540d\u79f0<code class=\"literal\">accountno</code>\uff0c\u4f46\u662f\u8fd9\u548c\u8868<code class=\"literal\">bank</code>\u4e2d\u7684\u4e00\u4e2a\u5217\u540d\u76f8\u540c\u3002\u5728<code class=\"command\">UPDATE</code>\u547d\u4ee4\u4e2d\uff0c<code class=\"literal\">accountno</code>\u5f15\u7528\u5217<code class=\"literal\">bank.accountno</code>\uff0c\u56e0\u6b64 <code class=\"literal\">tf1.accountno</code>\u5fc5\u987b\u88ab\u7528\u6765\u5f15\u7528\u8be5\u53c2\u6570\u3002\u6211\u4eec\u5f53\u7136\u53ef\u4ee5\u901a\u8fc7\u4e3a\u8be5\u53c2\u6570\u4f7f\u7528\u4e00\u4e2a\u4e0d\u540c\u7684\u540d\u79f0\u6765\u907f\u514d\u8fd9\u6837\u7684\u95ee\u9898\u3002</p>\n<p lang=\"zh\">\u5b9e\u9645\u4e0a\u6211\u4eec\u53ef\u80fd\u559c\u6b22\u4ece\u8be5\u51fd\u6570\u5f97\u5230\u4e00\u4e2a\u66f4\u6709\u7528\u7684\u7ed3\u679c\u800c\u4e0d\u662f\u4e00\u4e2a\u5e38\u6570 1\uff0c\u56e0\u6b64\u4e00\u4e2a\u66f4\u53ef\u80fd\u7684\u5b9a\u4e49\u662f\uff1a</p>\n<pre class=\"programlisting\">CREATE FUNCTION tf1 (accountno integer, debit numeric) RETURNS numeric AS $$\n    UPDATE bank\n        SET balance = balance - debit\n        WHERE accountno = tf1.accountno;\n    SELECT balance FROM bank WHERE accountno = tf1.accountno;\n$$ LANGUAGE SQL;\n</pre>\n<p lang=\"zh\">\u5b83\u4f1a\u8c03\u6574\u4f59\u989d\u5e76\u4e14\u8fd4\u56de\u65b0\u7684\u4f59\u989d\u3002\u540c\u6837\u7684\u4e8b\u60c5\u4e5f\u53ef\u4ee5\u7528\u4e00\u4e2a\u4f7f\u7528<code class=\"literal\">RETURNING</code>\u7684\u547d\u4ee4\u5b9e\u73b0\uff1a</p>\n<pre class=\"programlisting\">CREATE FUNCTION tf1 (accountno integer, debit numeric) RETURNS numeric AS $$\n    UPDATE bank\n        SET balance = balance - debit\n        WHERE accountno = tf1.accountno\n    RETURNING balance;\n$$ LANGUAGE SQL;\n</pre>\n<p lang=\"zh\">\u5982\u679c\u6700\u540e\u7684 <code class=\"literal\">SELECT</code> \u6216 <code class=\"literal\">RETURNING</code> \u5b50\u53e5\u8fd4\u56de\u7684\u7c7b\u578b\uff0c\u4e0e\u8be5 <acronym class=\"acronym\">SQL</acronym> \u51fd\u6570\u58f0\u660e\u7684\u7ed3\u679c\u7c7b\u578b\u5e76\u4e0d\u5b8c\u5168\u4e00\u81f4\uff0c<span class=\"productname\">PostgreSQL</span> \u4f1a\u81ea\u52a8\u5c06\u503c\u8f6c\u6362\u4e3a\u6240\u9700\u7c7b\u578b\uff0c\u53ea\u8981\u901a\u8fc7\u9690\u5f0f\u8f6c\u6362\u6216\u8d4b\u503c\u8f6c\u6362\u53ef\u4ee5\u505a\u5230\u3002\u5426\u5219\uff0c\u5c31\u5fc5\u987b\u5199\u51fa\u663e\u5f0f\u8f6c\u6362\u3002\u4f8b\u5982\uff0c\u5047\u8bbe\u6211\u4eec\u5e0c\u671b\u524d\u9762\u7684 <code class=\"function\">add_em</code> \u51fd\u6570\u6539\u4e3a\u8fd4\u56de <code class=\"type\">float8</code>\u3002\u53ea\u9700\u5199\u6210\uff1a</p>\n<pre class=\"programlisting\">CREATE FUNCTION add_em(integer, integer) RETURNS float8 AS $$\n    SELECT $1 + $2;\n$$ LANGUAGE SQL;\n</pre>\n<p lang=\"zh\">\u56e0\u4e3a <code class=\"type\">integer</code> \u7c7b\u578b\u7684\u548c\u53ef\u4ee5\u9690\u5f0f\u8f6c\u6362\u4e3a <code class=\"type\">float8</code>\u3002\uff08\u6709\u5173\u7c7b\u578b\u8f6c\u6362\u7684\u66f4\u591a\u4fe1\u606f\uff0c\u8bf7\u53c2\u9605<a class=\"xref\" href=\"/docs/14/typeconv.html\" title=\"\u7b2c\u00a010\u00a0\u7ae0\u00a0\u7c7b\u578b\u8f6c\u6362\">\u7b2c\u00a010\u00a0\u7ae0</a>\u6216<a class=\"xref\" href=\"/docs/14/sql-createcast.html\" title=\"CREATE CAST\"><span class=\"refentrytitle\">CREATE CAST</span></a>\u3002\uff09</p>\n</div>\n<div class=\"sect2\" id=\"XFUNC-SQL-COMPOSITE-FUNCTIONS\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/14/xfunc-sql.html#XFUNC-SQL-COMPOSITE-FUNCTIONS\">38.5.3. \u590d\u5408\u7c7b\u578b\u4e0a\u7684<acronym class=\"acronym\">SQL</acronym>\u51fd\u6570</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\">\u7f16\u5199\u63a5\u53d7\u590d\u5408\u7c7b\u578b\u53c2\u6570\u7684\u51fd\u6570\u65f6\uff0c\u6211\u4eec\u4e0d\u4ec5\u5fc5\u987b\u6307\u5b9a\u8981\u7528\u54ea\u4e2a\u53c2\u6570\uff0c\u8fd8\u5fc5\u987b\u6307\u5b9a\u8be5\u53c2\u6570\u7684\u54ea\u4e2a\u5c5e\u6027\uff08\u5b57\u6bb5\uff09\u3002\u4f8b\u5982\uff0c\u5047\u8bbe <code class=\"type\">emp</code> \u662f\u4e00\u4e2a\u5305\u542b\u96c7\u5458\u6570\u636e\u7684\u8868\uff0c\u56e0\u6b64\u5b83\u4e5f\u662f\u8be5\u8868\u6bcf\u4e00\u884c\u5bf9\u5e94\u7684\u590d\u5408\u7c7b\u578b\u540d\u79f0\u3002\u4e0b\u9762\u7684\u51fd\u6570 <code class=\"function\">double_salary</code> \u7528\u6765\u8ba1\u7b97\u67d0\u4eba\u7684\u5de5\u8d44\u7ffb\u500d\u540e\u4f1a\u662f\u591a\u5c11\uff1a</p>\n<pre class=\"screen\">CREATE TABLE emp (\n    name        text,\n    salary      numeric,\n    age         integer,\n    cubicle     point\n);\n\nINSERT INTO emp VALUES ('Bill', 4200, 45, '(2,1)');\n\nCREATE FUNCTION double_salary(emp) RETURNS numeric AS $$\n    SELECT $1.salary * 2 AS salary;\n$$ LANGUAGE SQL;\n\nSELECT name, double_salary(emp.*) AS dream\n    FROM emp\n    WHERE emp.cubicle ~= point '(2,1)';\n\n name | dream\n------+-------\n Bill |  8400\n</pre>\n<p lang=\"zh\">\u6ce8\u610f\u8fd9\u91cc\u7528 <code class=\"literal\">$1.salary</code> \u8bed\u6cd5\u6765\u9009\u53d6\u53c2\u6570\u884c\u503c\u4e2d\u7684\u4e00\u4e2a\u5b57\u6bb5\u3002\u8fd8\u8981\u6ce8\u610f\uff0c\u8c03\u7528\u65f6\u7684 <code class=\"command\">SELECT</code> \u547d\u4ee4\u4f7f\u7528 <em class=\"replaceable\"><code>table_name</code></em><code class=\"literal\">.*</code> \u5c06\u8868\u7684\u5f53\u524d\u6574\u884c\u53d6\u4f5c\u4e00\u4e2a\u590d\u5408\u503c\u3002\u8be5\u8868\u884c\u4e5f\u53ef\u4ee5\u4ec5\u7528\u8868\u540d\u6765\u5f15\u7528\uff1a</p>\n<pre class=\"screen\">SELECT name, double_salary(emp) AS dream\n    FROM emp\n    WHERE emp.cubicle ~= point '(2,1)';\n</pre>\n<p lang=\"zh\">\u4f46\u8fd9\u79cd\u7528\u6cd5\u5df2\u88ab\u5f03\u7528\uff0c\u56e0\u4e3a\u5b83\u5f88\u5bb9\u6613\u8ba9\u4eba\u6df7\u6dc6\uff08\u5173\u4e8e\u8868\u884c\u590d\u5408\u503c\u8fd9\u4e24\u79cd\u8bb0\u6cd5\u7684\u66f4\u591a\u7ec6\u8282\uff0c\u89c1<a class=\"xref\" href=\"/docs/14/rowtypes.html#ROWTYPES-USAGE\" title=\"8.16.5.\u00a0\u5728\u67e5\u8be2\u4e2d\u4f7f\u7528\u590d\u5408\u7c7b\u578b\">\u7b2c\u00a08.16.5\u00a0\u8282</a>\uff09\u3002</p>\n<p lang=\"zh\">\u6709\u65f6\u5019\u5373\u65f6\u6784\u9020\u4e00\u4e2a\u590d\u5408\u53c2\u6570\u503c\u4f1a\u5f88\u65b9\u4fbf\u3002\u8fd9\u53ef\u4ee5\u7528<code class=\"literal\">ROW</code>\u6784\u9020\u5668\u5b8c\u6210\u3002\u4f8b\u5982\uff0c\u6211\u4eec\u53ef\u4ee5\u8c03\u6574\u88ab\u4f20\u9012\u7ed9\u51fd\u6570\u7684\u6570\u636e\uff1a</p>\n<pre class=\"screen\">SELECT name, double_salary(ROW(name, salary*1.1, age, cubicle)) AS dream\n    FROM emp;\n</pre>\n<p lang=\"zh\">\u4e5f\u53ef\u4ee5\u6784\u5efa\u4e00\u4e2a\u8fd4\u56de\u590d\u5408\u7c7b\u578b\u7684\u51fd\u6570\u3002\u8fd9\u662f\u4e00\u4e2a\u8fd4\u56de\u5355\u4e00<code class=\"type\">emp</code>\u884c\u7684\u51fd\u6570\u793a\u4f8b\uff1a</p>\n<pre class=\"programlisting\">CREATE FUNCTION new_emp() RETURNS emp AS $$\n    SELECT text 'None' AS name,\n        1000.0 AS salary,\n        25 AS age,\n        point '(2,2)' AS cubicle;\n$$ LANGUAGE SQL;\n</pre>\n<p lang=\"zh\">\u5728\u8fd9\u4e2a\u793a\u4f8b\u4e2d\uff0c\u6211\u4eec\u4e3a\u6bcf\u4e00\u4e2a\u5c5e\u6027\u6307\u5b9a\u4e86\u4e00\u4e2a\u5e38\u91cf\u503c\uff0c\u4f46\u662f\u53ef\u4ee5\u7528\u4efb\u4f55\u8ba1\u7b97\u6765\u66ff\u6362\u8fd9\u4e9b\u5e38\u91cf\u3002</p>\n<p lang=\"zh\">\u5b9a\u4e49\u8be5\u51fd\u6570\u65f6\u6709\u4e24\u70b9\u91cd\u8981\u6ce8\u610f\u4e8b\u9879\uff1a</p>\n<div class=\"itemizedlist\">\n<ul class=\"itemizedlist\">\n<li class=\"listitem\" lang=\"zh\">\n<p>\u67e5\u8be2\u4e2d\u7684\u9009\u62e9\u5217\u8868\u987a\u5e8f\u5fc5\u987b\u4e0e\u5217\u5728\u590d\u5408\u7c7b\u578b\u4e2d\u51fa\u73b0\u7684\u987a\u5e8f\u5b8c\u5168\u76f8\u540c\u3002\uff08\u7cfb\u7edf\u4e0d\u8003\u8651\u50cf\u4e0a\u9762\u8fd9\u6837\u6307\u5b9a\u7684\u5217\u540d\u3002\uff09</p>\n</li>\n<li class=\"listitem\" lang=\"zh\">\n<p>\u6211\u4eec\u5fc5\u987b\u786e\u4fdd\u6bcf\u4e2a\u8868\u8fbe\u5f0f\u7684\u7c7b\u578b\u90fd\u53ef\u4ee5\u8f6c\u6362\u4e3a\u590d\u5408\u7c7b\u578b\u7684\u76f8\u5e94\u5217\u7684\u7c7b\u578b\u3002\u5426\u5219\u6211\u4eec\u4f1a\u5f97\u5230\u8fd9\u6837\u7684\u9519\u8bef\uff1a</p>\n<pre class=\"screen\">\n<code class=\"computeroutput\">\nERROR:  return type mismatch in function declared to return emp\nDETAIL:  Final statement returns text instead of point at column 4.\n</code>\n</pre>\n<p>\u4e0e\u57fa\u7840\u7c7b\u578b\u7684\u60c5\u51b5\u4e00\u6837\uff0c\u7cfb\u7edf\u4e0d\u4f1a\u81ea\u52a8\u63d2\u5165\u663e\u5f0f\u8f6c\u6362\uff0c\u53ea\u4f1a\u63d2\u5165\u9690\u5f0f\u6216\u8d4b\u503c\u8f6c\u6362\u3002</p>\n</li>\n</ul>\n</div>\n<p lang=\"zh\">\u5b9a\u4e49\u540c\u6837\u7684\u51fd\u6570\u7684\u4e00\u79cd\u4e0d\u540c\u7684\u65b9\u6cd5\u662f\uff1a</p>\n<pre class=\"programlisting\">CREATE FUNCTION new_emp() RETURNS emp AS $$\n    SELECT ROW('None', 1000.0, 25, '(2,2)')::emp;\n$$ LANGUAGE SQL;\n</pre>\n<p lang=\"zh\">\u8fd9\u91cc\u6211\u4eec\u5199\u4e86\u4e00\u4e2a\u53ea\u8fd4\u56de\u5355\u5217\u3001\u4e14\u8be5\u5217\u5177\u6709\u6b63\u786e\u590d\u5408\u7c7b\u578b\u7684 <code class=\"command\">SELECT</code>\u3002\u5728\u8fd9\u79cd\u573a\u666f\u4e0b\uff0c\u8fd9\u6837\u5199\u5e76\u4e0d\u89c1\u5f97\u66f4\u597d\uff0c\u4f46\u5728\u67d0\u4e9b\u60c5\u51b5\u4e0b\u4f1a\u5f88\u65b9\u4fbf \u2014 \u4f8b\u5982\uff0c\u9700\u8981\u901a\u8fc7\u8c03\u7528\u53e6\u4e00\u4e2a\u8fd4\u56de\u76ee\u6807\u590d\u5408\u503c\u7684\u51fd\u6570\u6765\u8ba1\u7b97\u7ed3\u679c\u65f6\u3002\u8fd8\u6709\u4e00\u79cd\u60c5\u51b5\u662f\uff0c\u5982\u679c\u6211\u4eec\u8981\u7f16\u5199\u7684\u51fd\u6570\u8fd4\u56de\u7684\u662f\u57fa\u4e8e\u590d\u5408\u7c7b\u578b\u7684\u57df\uff0c\u800c\u4e0d\u662f\u666e\u901a\u590d\u5408\u7c7b\u578b\uff0c\u90a3\u4e48\u5c31\u5fc5\u987b\u5199\u6210\u8fd4\u56de\u5355\u5217\u7684\u5f62\u5f0f\uff0c\u56e0\u4e3a\u6ca1\u6709\u529e\u6cd5\u8ba9\u6574\u884c\u7ed3\u679c\u53d1\u751f\u6240\u9700\u7684\u5f3a\u5236\u8f6c\u6362\u3002</p>\n<p lang=\"zh\">\u6211\u4eec\u65e2\u53ef\u4ee5\u628a\u8fd9\u4e2a\u51fd\u6570\u76f4\u63a5\u5f53\u4f5c\u503c\u8868\u8fbe\u5f0f\u8c03\u7528\uff1a</p>\n<pre class=\"screen\">SELECT new_emp();\n\n         new_emp\n--------------------------\n (None,1000.0,25,\"(2,2)\")\n</pre>\n<p lang=\"zh\">\u4e5f\u53ef\u4ee5\u628a\u5b83\u5f53\u4f5c\u8868\u51fd\u6570\u6765\u8c03\u7528\uff1a</p>\n<pre class=\"screen\">SELECT * FROM new_emp();\n\n name | salary | age | cubicle\n------+--------+-----+---------\n None | 1000.0 |  25 | (2,2)\n</pre>\n<p lang=\"zh\">\u7b2c\u4e8c\u79cd\u65b9\u5f0f\u4f1a\u5728<a class=\"xref\" href=\"/docs/14/xfunc-sql.html#XFUNC-SQL-TABLE-FUNCTIONS\" title=\"38.5.8.\u00a0SQL \u51fd\u6570\u4f5c\u4e3a\u8868\u6765\u6e90\">\u7b2c\u00a038.5.8\u00a0\u8282</a>\u4e2d\u8fdb\u4e00\u6b65\u8bf4\u660e\u3002</p>\n<p lang=\"zh\">\u5f53\u4f60\u4f7f\u7528\u8fd4\u56de\u590d\u5408\u7c7b\u578b\u7684\u51fd\u6570\u65f6\uff0c\u53ef\u80fd\u53ea\u9700\u8981\u53d6\u5176\u7ed3\u679c\u4e2d\u7684\u4e00\u4e2a\u5b57\u6bb5\uff08\u5c5e\u6027\uff09\u3002\u53ef\u4ee5\u4f7f\u7528\u4e0b\u9762\u8fd9\u6837\u7684\u8bed\u6cd5\uff1a</p>\n<pre class=\"screen\">SELECT (new_emp()).name;\n\n name\n------\n None\n</pre>\n<p lang=\"zh\">\u8fd9\u91cc\u9700\u8981\u989d\u5916\u7684\u62ec\u53f7\uff0c\u4ee5\u514d\u89e3\u6790\u5668\u4ea7\u751f\u6b67\u4e49\u3002\u5982\u679c\u4e0d\u52a0\u62ec\u53f7\uff0c\u7ed3\u679c\u4f1a\u662f\u8fd9\u6837\uff1a</p>\n<pre class=\"screen\">SELECT new_emp().name;\nERROR:  syntax error at or near \".\"\nLINE 1: SELECT new_emp().name;\n                        ^\n</pre>\n<p lang=\"zh\">\u53e6\u4e00\u79cd\u9009\u62e9\u662f\u4f7f\u7528\u51fd\u6570\u8bb0\u6cd5\u6765\u63d0\u53d6\u5c5e\u6027\uff1a</p>\n<pre class=\"screen\">SELECT name(new_emp());\n\n name\n------\n None\n</pre>\n<p lang=\"zh\">\u5982<a class=\"xref\" href=\"/docs/14/rowtypes.html#ROWTYPES-USAGE\" title=\"8.16.5.\u00a0\u5728\u67e5\u8be2\u4e2d\u4f7f\u7528\u590d\u5408\u7c7b\u578b\">\u7b2c\u00a08.16.5\u00a0\u8282</a>\u6240\u8ff0\uff0c\u5b57\u6bb5\u8bb0\u6cd5\u548c\u51fd\u6570\u8bb0\u6cd5\u662f\u7b49\u4ef7\u7684\u3002</p>\n<p lang=\"zh\">\u53e6\u4e00\u79cd\u4f7f\u7528\u51fd\u6570\u8fd4\u56de\u590d\u5408\u7c7b\u578b\u7684\u65b9\u6cd5\u662f\u5c06\u7ed3\u679c\u4f20\u9012\u7ed9\u53e6\u4e00\u4e2a\u63a5\u53d7\u6b63\u786e\u884c\u7c7b\u578b\u4f5c\u4e3a\u8f93\u5165\u7684\u51fd\u6570\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION getname(emp) RETURNS text AS $$\n    SELECT $1.name;\n$$ LANGUAGE SQL;\n\nSELECT getname(new_emp());\n getname\n---------\n None\n(1 row)\n</pre>\n</div>\n<div class=\"sect2\" id=\"XFUNC-OUTPUT-PARAMETERS\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/14/xfunc-sql.html#XFUNC-OUTPUT-PARAMETERS\">38.5.4. \u5e26\u6709\u8f93\u51fa\u53c2\u6570\u7684<acronym class=\"acronym\">SQL</acronym>\u51fd\u6570</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\">\u63cf\u8ff0\u51fd\u6570\u7ed3\u679c\u7684\u53e6\u4e00\u79cd\u65b9\u6cd5\u662f\u4f7f\u7528<em class=\"firstterm\">\u8f93\u51fa\u53c2\u6570</em>\uff0c\u4f8b\u5982\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION add_em (IN x int, IN y int, OUT sum int)\nAS 'SELECT x + y'\nLANGUAGE SQL;\n\nSELECT add_em(3,7);\n add_em\n--------\n     10\n(1 row)\n</pre>\n<p lang=\"zh\">\u8fd9\u4e0e<a class=\"xref\" href=\"/docs/14/xfunc-sql.html#XFUNC-SQL-BASE-FUNCTIONS\" title=\"38.5.2.\u00a0\u57fa\u7840\u7c7b\u578b\u4e0a\u7684SQL\u51fd\u6570\">\u7b2c\u00a038.5.2\u00a0\u8282</a>\u4e2d\u5c55\u793a\u7684 <code class=\"literal\">add_em</code> \u7248\u672c\u672c\u8d28\u4e0a\u5e76\u65e0\u4e0d\u540c\u3002\u8f93\u51fa\u53c2\u6570\u7684\u771f\u6b63\u4ef7\u503c\u5728\u4e8e\uff0c\u5b83\u4eec\u4e3a\u5b9a\u4e49\u8fd4\u56de\u591a\u5217\u7684\u51fd\u6570\u63d0\u4f9b\u4e86\u4e00\u79cd\u65b9\u4fbf\u7684\u65b9\u6cd5\u3002\u4f8b\u5982\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION sum_n_product (x int, y int, OUT sum int, OUT product int)\nAS 'SELECT x + y, x * y'\nLANGUAGE SQL;\n\n SELECT * FROM sum_n_product(11,42);\n sum | product\n-----+---------\n  53 |     462\n(1 row)\n</pre>\n<p lang=\"zh\">\u8fd9\u91cc\u672c\u8d28\u4e0a\u53d1\u751f\u7684\u4e8b\u60c5\u662f\uff1a\u6211\u4eec\u4e3a\u8be5\u51fd\u6570\u7684\u7ed3\u679c\u521b\u5efa\u4e86\u4e00\u4e2a\u533f\u540d\u590d\u5408\u7c7b\u578b\u3002\u4e0a\u9762\u7684\u793a\u4f8b\u4e0e\u4e0b\u9762\u8fd9\u79cd\u5199\u6cd5\u7684\u6700\u7ec8\u6548\u679c\u76f8\u540c\uff1a</p>\n<pre class=\"screen\">CREATE TYPE sum_prod AS (sum int, product int);\n\nCREATE FUNCTION sum_n_product (int, int) RETURNS sum_prod\nAS 'SELECT $1 + $2, $1 * $2'\nLANGUAGE SQL;\n</pre>\n<p lang=\"zh\">\u4f46\u901a\u5e38\u4e0d\u5fc5\u989d\u5916\u5b9a\u4e49\u4e00\u4e2a\u72ec\u7acb\u7684\u590d\u5408\u7c7b\u578b\u4f1a\u66f4\u65b9\u4fbf\u3002\u6ce8\u610f\uff0c\u9644\u5728\u8f93\u51fa\u53c2\u6570\u4e0a\u7684\u540d\u79f0\u5e76\u975e\u53ea\u662f\u88c5\u9970\uff0c\u5b83\u4eec\u51b3\u5b9a\u4e86\u8fd9\u4e2a\u533f\u540d\u590d\u5408\u7c7b\u578b\u7684\u5217\u540d\u3002\uff08\u5982\u679c\u7701\u7565\u8f93\u51fa\u53c2\u6570\u540d\u79f0\uff0c\u7cfb\u7edf\u4f1a\u81ea\u884c\u9009\u62e9\u4e00\u4e2a\u540d\u79f0\u3002\uff09</p>\n<p lang=\"zh\">\u5728\u4ece SQL \u8c03\u7528\u8fd9\u6837\u4e00\u4e2a\u51fd\u6570\u65f6\uff0c\u8f93\u51fa\u53c2\u6570\u4e0d\u4f1a\u88ab\u5305\u62ec\u5728\u8c03\u7528\u53c2\u6570\u5217\u8868\u4e2d\u3002\u8fd9\u662f\u56e0\u4e3a<span class=\"productname\">PostgreSQL</span>\u53ea\u8003\u8651\u8f93\u5165\u53c2\u6570\u6765\u5b9a\u4e49\u51fd\u6570\u7684\u8c03\u7528\u7b7e\u540d\u3002\u8fd9\u4e5f\u610f\u5473\u7740\u5728\u4e3a\u8bf8\u5982\u5220\u9664\u51fd\u6570\u7b49\u76ee\u7684\u5f15\u7528\u8be5\u51fd\u6570\u65f6\u53ea\u6709\u8f93\u5165\u53c2\u6570\u6709\u5173\u7cfb\u3002\u6211\u4eec\u53ef\u4ee5\u7528\u4e0b\u9762\u7684\u547d\u4ee4\u4e4b\u4e00\u5220\u9664\u4e0a\u8ff0\u51fd\u6570</p>\n<pre class=\"screen\">DROP FUNCTION sum_n_product (x int, y int, OUT sum int, OUT product int);\nDROP FUNCTION sum_n_product (int, int);\n</pre>\n<p lang=\"zh\">\u53c2\u6570\u53ef\u4ee5\u88ab\u6807\u8bb0\u4e3a<code class=\"literal\">IN</code>\uff08\u9ed8\u8ba4\uff09\u3001<code class=\"literal\">OUT</code>\u3001<code class=\"literal\">INOUT</code>\u6216\u8005<code class=\"literal\">VARIADIC</code>\u3002\u4e00\u4e2a<code class=\"literal\">INOUT</code>\u53c2\u6570\u65e2\u4f5c\u4e3a\u4e00\u4e2a\u8f93\u5165\u53c2\u6570\uff08\u8c03\u7528\u53c2\u6570\u5217\u8868\u7684\u4e00\u90e8\u5206\uff09\u53c8\u4f5c\u4e3a\u4e00\u4e2a\u8f93\u51fa\u53c2\u6570\uff08\u7ed3\u679c\u8bb0\u5f55\u7c7b\u578b\u7684\u4e00\u90e8\u5206\uff09\u3002<code class=\"literal\">VARIADIC</code>\u53c2\u6570\u662f\u8f93\u5165\u53c2\u6570\uff0c\u4f46\u88ab\u6309\u7167\u4e0b\u6587\u6240\u8ff0\u7279\u6b8a\u5bf9\u5f85\u3002</p>\n</div>\n<div class=\"sect2\" id=\"XFUNC-OUTPUT-PARAMETERS-PROC\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/14/xfunc-sql.html#XFUNC-OUTPUT-PARAMETERS-PROC\">38.5.5. \u5e26\u6709\u8f93\u51fa\u53c2\u6570\u7684<acronym class=\"acronym\">SQL</acronym>\u8fc7\u7a0b</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\">\u8fc7\u7a0b\u4e5f\u652f\u6301\u8f93\u51fa\u53c2\u6570\uff0c\u4f46\u662f\u5b83\u4eec\u7684\u5de5\u4f5c\u65b9\u5f0f\u4e0e\u51fd\u6570\u7565\u6709\u4e0d\u540c\u3002\u5728<code class=\"command\">CALL</code>\u547d\u4ee4\u4e2d\uff0c\u8f93\u51fa\u53c2\u6570\u5fc5\u987b\u5305\u62ec\u5728\u53c2\u6570\u5217\u8868\u4e2d\u3002\u4f8b\u5982\uff0c\u524d\u9762\u7684\u94f6\u884c\u8d26\u6237\u501f\u8bb0\u4f8b\u7a0b\u53ef\u4ee5\u50cf\u8fd9\u6837\u5199\uff1a</p>\n<pre class=\"programlisting\">CREATE PROCEDURE tp1 (accountno integer, debit numeric, OUT new_balance numeric) AS $$\n    UPDATE bank\n        SET balance = balance - debit\n        WHERE accountno = tp1.accountno\n    RETURNING balance;\n$$ LANGUAGE SQL;\n</pre>\n<p lang=\"zh\">\u8981\u8c03\u7528\u8fd9\u4e2a\u4f8b\u7a0b\uff0c\u5fc5\u987b\u5305\u62ec\u5339\u914d<code class=\"literal\">OUT</code>\u53c2\u6570\u7684\u53c2\u6570\u3002\u901a\u5e38\u5199\u6210<code class=\"literal\">NULL</code>\uff1a</p>\n<pre class=\"programlisting\">CALL tp1(17, 100.0, NULL);\n</pre>\n<p lang=\"zh\">\u5982\u679c\u4f60\u5199\u7684\u662f\u5176\u4ed6\u5185\u5bb9\uff0c\u5b83\u5fc5\u987b\u662f\u4e00\u4e2a\u80fd\u591f\u50cf\u8f93\u5165\u53c2\u6570\u90a3\u6837\u88ab\u9690\u5f0f\u5f3a\u5236\u8f6c\u6362\u6210\u8be5\u53c2\u6570\u58f0\u660e\u7c7b\u578b\u7684\u8868\u8fbe\u5f0f\u3002\u4e0d\u8fc7\u8981\u6ce8\u610f\uff0c\u8fd9\u6837\u7684\u8868\u8fbe\u5f0f\u4e0d\u4f1a\u88ab\u6c42\u503c\u3002</p>\n<p lang=\"zh\">\u5f53\u4ece<span class=\"application\">PL/pgSQL</span>\u8c03\u7528\u8fc7\u7a0b\u65f6\uff0c\u4f60\u4e0d\u80fd\u5199<code class=\"literal\">NULL</code>\uff0c\u800c\u5fc5\u987b\u5199\u4e00\u4e2a\u7528\u4e8e\u63a5\u6536\u8fc7\u7a0b\u8f93\u51fa\u7684\u53d8\u91cf\u3002\u8be6\u89c1<a class=\"xref\" href=\"/docs/14/plpgsql-control-structures.html#PLPGSQL-STATEMENTS-CALLING-PROCEDURE\" title=\"43.6.3.\u00a0\u8c03\u7528\u8fc7\u7a0b\">\u7b2c\u00a043.6.3\u00a0\u8282</a>\u3002</p>\n</div>\n<div class=\"sect2\" id=\"XFUNC-SQL-VARIADIC-FUNCTIONS\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/14/xfunc-sql.html#XFUNC-SQL-VARIADIC-FUNCTIONS\">38.5.6. \u5e26\u6709\u53ef\u53d8\u6570\u91cf\u53c2\u6570\u7684<acronym class=\"acronym\">SQL</acronym>\u51fd\u6570</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\"><acronym class=\"acronym\">SQL</acronym> \u51fd\u6570\u53ef\u4ee5\u88ab\u58f0\u660e\u4e3a\u63a5\u53d7\u53ef\u53d8\u6570\u91cf\u7684\u53c2\u6570\uff0c\u53ea\u8981\u6240\u6709<span class=\"quote\">\u201c<span class=\"quote\">\u53ef\u9009</span>\u201d</span>\u53c2\u6570\u90fd\u5c5e\u4e8e\u540c\u4e00\u79cd\u6570\u636e\u7c7b\u578b\u3002\u53ef\u9009\u53c2\u6570\u4f1a\u4ee5\u6570\u7ec4\u5f62\u5f0f\u4f20\u9012\u7ed9\u51fd\u6570\u3002\u5b9a\u4e49\u8fd9\u7c7b\u51fd\u6570\u65f6\uff0c\u9700\u8981\u628a\u6700\u540e\u4e00\u4e2a\u53c2\u6570\u6807\u8bb0\u4e3a <code class=\"literal\">VARIADIC</code>\uff1b\u8be5\u53c2\u6570\u5fc5\u987b\u88ab\u58f0\u660e\u4e3a\u6570\u7ec4\u7c7b\u578b\u3002\u4f8b\u5982\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION mleast(VARIADIC arr numeric[]) RETURNS numeric AS $$\n    SELECT min($1[i]) FROM generate_subscripts($1, 1) g(i);\n$$ LANGUAGE SQL;\n\nSELECT mleast(10, -1, 5, 4.4);\n mleast \n--------\n     -1\n(1 row)\n</pre>\n<p lang=\"zh\">\u5b9e\u9645\u4e0a\uff0c\u4f4d\u4e8e <code class=\"literal\">VARIADIC</code> \u4f4d\u7f6e\u53ca\u4e4b\u540e\u7684\u6240\u6709\u5b9e\u53c2\u90fd\u4f1a\u88ab\u6536\u96c6\u6210\u4e00\u4e2a\u4e00\u7ef4\u6570\u7ec4\uff0c\u5c31\u50cf\u4f60\u5199\u6210\u4e86\uff1a</p>\n<pre class=\"screen\">SELECT mleast(ARRAY[10, -1, 5, 4.4]);    -- doesn't work\n</pre>\n<p lang=\"zh\">\u4e0d\u8fc7\u4f60\u5b9e\u9645\u4e0a\u4e0d\u80fd\u8fd9\u6837\u5199\uff0c\u81f3\u5c11\u5b83\u4e0d\u4f1a\u5339\u914d\u8fd9\u4e2a\u51fd\u6570\u5b9a\u4e49\u3002\u88ab\u6807\u8bb0\u4e3a <code class=\"literal\">VARIADIC</code> \u7684\u53c2\u6570\u5339\u914d\u7684\u662f\u5176\u5143\u7d20\u7c7b\u578b\u51fa\u73b0\u4e00\u6b21\u6216\u591a\u6b21\uff0c\u800c\u4e0d\u662f\u5b83\u81ea\u8eab\u7684\u6570\u7ec4\u7c7b\u578b\u3002</p>\n<p lang=\"zh\">\u6709\u65f6\u5019\uff0c\u80fd\u591f\u628a\u4e00\u4e2a\u5df2\u7ecf\u6784\u9020\u597d\u7684\u6570\u7ec4\u4f20\u7ed9\u53ef\u53d8\u53c2\u6570\u51fd\u6570\u4f1a\u5f88\u6709\u7528\uff0c\u5c24\u5176\u662f\u5f53\u4e00\u4e2a\u53ef\u53d8\u53c2\u6570\u51fd\u6570\u60f3\u628a\u5b83\u7684\u6570\u7ec4\u53c2\u6570\u518d\u4f20\u7ed9\u53e6\u4e00\u4e2a\u51fd\u6570\u65f6\u3002\u6b64\u5916\uff0c\u5728\u5141\u8bb8\u4e0d\u53d7\u4fe1\u4efb\u7528\u6237\u521b\u5efa\u5bf9\u8c61\u7684\u6a21\u5f0f\u4e2d\u8c03\u7528\u53ef\u53d8\u53c2\u6570\u51fd\u6570\u65f6\uff0c\u8fd9\u662f\u552f\u4e00\u5b89\u5168\u7684\u65b9\u5f0f\uff0c\u89c1<a class=\"xref\" href=\"/docs/14/typeconv-func.html\" title=\"10.3.\u00a0\u51fd\u6570\">\u7b2c\u00a010.3\u00a0\u8282</a>\u3002\u4f60\u53ef\u4ee5\u5728\u8c03\u7528\u4e2d\u6307\u5b9a<code class=\"literal\">VARIADIC</code>\u6765\u505a\u5230\u8fd9\u4e00\u70b9\uff1a</p>\n<pre class=\"screen\">SELECT mleast(VARIADIC ARRAY[10, -1, 5, 4.4]);\n</pre>\n<p lang=\"zh\">\u8fd9\u6837\u4f1a\u963b\u6b62\u51fd\u6570\u7684\u53ef\u53d8\u53c2\u6570\u6309\u5176\u5143\u7d20\u7c7b\u578b\u5c55\u5f00\uff0c\u4ece\u800c\u8ba9\u6570\u7ec4\u5b9e\u53c2\u80fd\u591f\u6309\u5e38\u89c4\u65b9\u5f0f\u5339\u914d\u3002<code class=\"literal\">VARIADIC</code> \u53ea\u80fd\u9644\u52a0\u5728\u51fd\u6570\u8c03\u7528\u7684\u6700\u540e\u4e00\u4e2a\u5b9e\u53c2\u4e0a\u3002</p>\n<p lang=\"zh\">\u5728\u8c03\u7528\u4e2d\u6307\u5b9a<code class=\"literal\">VARIADIC</code>\u4e5f\u662f\u5411\u53ef\u53d8\u53c2\u6570\u51fd\u6570\u4f20\u9012\u7a7a\u6570\u7ec4\u7684\u552f\u4e00\u65b9\u5f0f\uff0c\u4f8b\u5982\uff1a</p>\n<pre class=\"screen\">SELECT mleast(VARIADIC ARRAY[]::numeric[]);\n</pre>\n<p lang=\"zh\">\u4ec5\u4ec5\u5199\u6210<code class=\"literal\">SELECT mleast()</code>\u662f\u884c\u4e0d\u901a\u7684\uff0c\u56e0\u4e3a\u53ef\u53d8\u53c2\u6570\u5fc5\u987b\u5339\u914d\u81f3\u5c11\u4e00\u4e2a\u5b9e\u53c2\u3002\uff08\u5982\u679c\u4f60\u5e0c\u671b\u5141\u8bb8\u8fd9\u79cd\u8c03\u7528\uff0c\u53ef\u4ee5\u518d\u5b9a\u4e49\u4e00\u4e2a\u540c\u540d\u4e14\u4e0d\u5e26\u53c2\u6570\u7684\u51fd\u6570<code class=\"literal\">mleast</code>\u3002\uff09</p>\n<p lang=\"zh\">\u4ece\u53ef\u53d8\u53c2\u6570\u6d3e\u751f\u51fa\u7684\u6570\u7ec4\u5143\u7d20\u53c2\u6570\u4f1a\u88ab\u89c6\u4e3a\u6ca1\u6709\u81ea\u5df1\u7684\u540d\u5b57\u3002\u8fd9\u610f\u5473\u7740\u9664\u975e\u4f60\u6307\u5b9a\u4e86 <code class=\"literal\">VARIADIC</code>\uff0c\u5426\u5219\u4e0d\u80fd\u4f7f\u7528\u547d\u540d\u53c2\u6570\u6765\u8c03\u7528\u53ef\u53d8\u53c2\u6570\u51fd\u6570\uff08<a class=\"xref\" href=\"/docs/14/sql-syntax-calling-funcs.html\" title=\"4.3.\u00a0\u8c03\u7528\u51fd\u6570\">\u7b2c\u00a04.3\u00a0\u8282</a>\uff09\u3002\u4f8b\u5982\uff0c\u4e0b\u9762\u7684\u8c03\u7528\u662f\u53ef\u884c\u7684\uff1a</p>\n<pre class=\"screen\">SELECT mleast(VARIADIC arr =&gt; ARRAY[10, -1, 5, 4.4]);\n</pre>\n<p lang=\"zh\">\u4f46\u8fd9\u4e9b\u5c31\u4e0d\u884c\uff1a</p>\n<pre class=\"screen\">SELECT mleast(arr =&gt; 10);\nSELECT mleast(arr =&gt; ARRAY[10, -1, 5, 4.4]);\n</pre>\n</div>\n<div class=\"sect2\" id=\"XFUNC-SQL-PARAMETER-DEFAULTS\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/14/xfunc-sql.html#XFUNC-SQL-PARAMETER-DEFAULTS\">38.5.7. \u5e26\u6709\u53c2\u6570\u9ed8\u8ba4\u503c\u7684<acronym class=\"acronym\">SQL</acronym>\u51fd\u6570</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\">\u51fd\u6570\u53ef\u4ee5\u88ab\u58f0\u660e\u4e3a\u5bf9\u4e00\u4e9b\u6216\u8005\u6240\u6709\u8f93\u5165\u53c2\u6570\u5177\u6709\u9ed8\u8ba4\u503c\u3002\u53ea\u8981\u8c03\u7528\u51fd\u6570\u65f6\u6ca1\u6709\u7ed9\u51fa\u8db3\u591f\u591a\u7684\u5b9e\u53c2\uff0c\u5c31\u4f1a\u63d2\u5165\u9ed8\u8ba4\u503c\u6765\u5f25\u8865\u7f3a\u5931\u7684\u5b9e\u53c2\u3002\u7531\u4e8e\u53c2\u6570\u53ea\u80fd\u4ece\u5b9e\u53c2\u5217\u8868\u7684\u5c3e\u90e8\u5f00\u59cb\u88ab\u7701\u7565\uff0c\u5728\u4e00\u4e2a\u6709\u9ed8\u8ba4\u503c\u7684\u53c2\u6570\u4e4b\u540e\u7684\u6240\u6709\u53c2\u6570\u90fd\u4e0d\u5f97\u4e0d\u4e5f\u5177\u6709\u9ed8\u8ba4\u503c\uff08\u5c3d\u7ba1\u4f7f\u7528\u547d\u540d\u53c2\u6570\u8bb0\u6cd5\u53ef\u4ee5\u5141\u8bb8\u653e\u677e\u8fd9\u79cd\u9650\u5236\uff0c\u8fd9\u79cd\u9650\u5236\u4ecd\u7136\u4f1a\u88ab\u5f3a\u5236\u4ee5\u4fbf\u4f4d\u7f6e\u53c2\u6570\u8bb0\u6cd5\u80fd\u5de5\u4f5c\uff09\u3002\u4e0d\u7ba1\u4f60\u662f\u5426\u4f7f\u7528\u5b83\uff0c\u8fd9\u79cd\u80fd\u529b\u90fd\u8981\u6c42\u5728\u67d0\u4e9b\u7528\u6237\u4e0d\u4fe1\u4efb\u5176\u4ed6\u7528\u6237\u7684\u6570\u636e\u5e93\u4e2d\u8c03\u7528\u51fd\u6570\u65f6\u91c7\u53d6\u4e00\u4e9b\u9884\u9632\u63aa\u65bd\uff0c\u89c1<a class=\"xref\" href=\"/docs/14/typeconv-func.html\" title=\"10.3.\u00a0\u51fd\u6570\">\u7b2c\u00a010.3\u00a0\u8282</a>\u3002</p>\n<p lang=\"zh\">\u4f8b\u5982\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION foo(a int, b int DEFAULT 2, c int DEFAULT 3)\nRETURNS int\nLANGUAGE SQL\nAS $$\n    SELECT $1 + $2 + $3;\n$$;\n\nSELECT foo(10, 20, 30);\n foo \n-----\n  60\n(1 row)\n\nSELECT foo(10, 20);\n foo \n-----\n  33\n(1 row)\n\nSELECT foo(10);\n foo \n-----\n  15\n(1 row)\n\nSELECT foo();  -- fails since there is no default for the first argument\nERROR:  function foo() does not exist\n</pre>\n<p lang=\"zh\">\u4e5f\u53ef\u4ee5\u7528 <code class=\"literal\">=</code> \u7b26\u53f7\u4ee3\u66ff\u5173\u952e\u5b57 <code class=\"literal\">DEFAULT</code>\u3002</p>\n</div>\n<div class=\"sect2\" id=\"XFUNC-SQL-TABLE-FUNCTIONS\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/14/xfunc-sql.html#XFUNC-SQL-TABLE-FUNCTIONS\">38.5.8. <acronym class=\"acronym\">SQL</acronym> \u51fd\u6570\u4f5c\u4e3a\u8868\u6765\u6e90</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\">\u6240\u6709\u7684 SQL \u51fd\u6570\u90fd\u53ef\u4ee5\u88ab\u7528\u5728\u67e5\u8be2\u7684<code class=\"literal\">FROM</code>\u5b50\u53e5\u4e2d\uff0c\u4f46\u662f\u5bf9\u4e8e\u8fd4\u56de\u590d\u5408\u7c7b\u578b\u7684\u51fd\u6570\u7279\u522b\u6709\u7528\u3002\u5982\u679c\u51fd\u6570\u88ab\u5b9a\u4e49\u4e3a\u8fd4\u56de\u4e00\u79cd\u57fa\u7840\u7c7b\u578b\uff0c\u8be5\u8868\u51fd\u6570\u4f1a\u4ea7\u751f\u4e00\u4e2a\u5355\u5217\u8868\u3002\u5982\u679c\u8be5\u51fd\u6570\u88ab\u5b9a\u4e49\u4e3a\u8fd4\u56de\u4e00\u79cd\u590d\u5408\u7c7b\u578b\uff0c\u8be5\u8868\u51fd\u6570\u4f1a\u4e3a\u8be5\u590d\u5408\u7c7b\u578b\u7684\u6bcf\u4e00\u4e2a\u5c5e\u6027\u4ea7\u751f\u4e00\u5217\u3002</p>\n<p lang=\"zh\">\u4ee5\u4e0b\u662f\u4e00\u4e2a\u793a\u4f8b\uff1a</p>\n<pre class=\"screen\">CREATE TABLE foo (fooid int, foosubid int, fooname text);\nINSERT INTO foo VALUES (1, 1, 'Joe');\nINSERT INTO foo VALUES (1, 2, 'Ed');\nINSERT INTO foo VALUES (2, 1, 'Mary');\n\nCREATE FUNCTION getfoo(int) RETURNS foo AS $$\n    SELECT * FROM foo WHERE fooid = $1;\n$$ LANGUAGE SQL;\n\nSELECT *, upper(fooname) FROM getfoo(1) AS t1;\n\n fooid | foosubid | fooname | upper\n-------+----------+---------+-------\n     1 |        1 | Joe     | JOE\n(1 row)\n</pre>\n<p lang=\"zh\">\u5982\u793a\u4f8b\u6240\u793a\uff0c\u6211\u4eec\u53ef\u4ee5\u50cf\u64cd\u4f5c\u666e\u901a\u8868\u7684\u5217\u4e00\u6837\u64cd\u4f5c\u51fd\u6570\u7ed3\u679c\u4e2d\u7684\u5217\u3002</p>\n<p lang=\"zh\">\u6ce8\u610f\u6211\u4eec\u53ea\u4ece\u51fd\u6570\u5f97\u5230\u4e86\u4e00\u884c\u3002\u8fd9\u662f\u56e0\u4e3a\u6211\u4eec\u6ca1\u6709\u4f7f\u7528<code class=\"literal\">SETOF</code>\u3002\u8fd9\u4f1a\u5728\u4e0b\u4e00\u8282\u4e2d\u4ecb\u7ecd\u3002</p>\n</div>\n<div class=\"sect2\" id=\"XFUNC-SQL-FUNCTIONS-RETURNING-SET\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/14/xfunc-sql.html#XFUNC-SQL-FUNCTIONS-RETURNING-SET\">38.5.9. \u8fd4\u56de\u96c6\u5408\u7684<acronym class=\"acronym\">SQL</acronym>\u51fd\u6570</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\">\u5f53\u4e00\u4e2a SQL \u51fd\u6570\u88ab\u58f0\u660e\u4e3a\u8fd4\u56de<code class=\"literal\">SETOF <em class=\"replaceable\"><code>sometype</code></em></code>\u65f6\uff0c\u8be5\u51fd\u6570\u7684\u6700\u540e\u4e00\u4e2a\u67e5\u8be2\u4f1a\u88ab\u6267\u884c\u5b8c\uff0c\u5e76\u4e14\u5b83\u8f93\u51fa\u7684\u6bcf\u4e00\u884c\u90fd\u4f1a\u88ab\u4f5c\u4e3a\u7ed3\u679c\u96c6\u7684\u4e00\u4e2a\u5143\u7d20\u8fd4\u56de\u3002</p>\n<p lang=\"zh\">\u8fd9\u4e00\u7279\u6027\u901a\u5e38\u662f\u5728\u67e5\u8be2\u7684 <code class=\"literal\">FROM</code> \u5b50\u53e5\u4e2d\u8c03\u7528\u51fd\u6570\u65f6\u4f7f\u7528\u7684\u3002\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b\uff0c\u51fd\u6570\u8fd4\u56de\u7684\u6bcf\u4e00\u884c\u90fd\u4f1a\u6210\u4e3a\u67e5\u8be2\u6240\u89c1\u8868\u4e2d\u7684\u4e00\u884c\u3002\u4f8b\u5982\uff0c\u5047\u8bbe\u8868 <code class=\"literal\">foo</code> \u4e0e\u4e0a\u6587\u76f8\u540c\uff0c\u6211\u4eec\u5199\uff1a</p>\n<pre class=\"programlisting\">CREATE FUNCTION getfoo(int) RETURNS SETOF foo AS $$\n    SELECT * FROM foo WHERE fooid = $1;\n$$ LANGUAGE SQL;\n\nSELECT * FROM getfoo(1) AS t1;\n</pre>\n<p lang=\"zh\">\u90a3\u4e48\u4f1a\u5f97\u5230\uff1a</p>\n<pre class=\"screen\"> fooid | foosubid | fooname\n-------+----------+---------\n     1 |        1 | Joe\n     1 |        2 | Ed\n(2 rows)\n</pre>\n<p lang=\"zh\">\u4e5f\u53ef\u4ee5\u901a\u8fc7\u8f93\u51fa\u53c2\u6570\u5b9a\u4e49\u7684\u5217\u6765\u8fd4\u56de\u591a\u884c\uff0c\u4f8b\u5982\uff1a</p>\n<pre class=\"programlisting\">CREATE TABLE tab (y int, z int);\nINSERT INTO tab VALUES (1, 2), (3, 4), (5, 6), (7, 8);\n\nCREATE FUNCTION sum_n_product_with_tab (x int, OUT sum int, OUT product int)\nRETURNS SETOF record\nAS $$\n    SELECT $1 + tab.y, $1 * tab.y FROM tab;\n$$ LANGUAGE SQL;\n\nSELECT * FROM sum_n_product_with_tab(10);\n sum | product\n-----+---------\n  11 |      10\n  13 |      30\n  15 |      50\n  17 |      70\n(4 rows)\n</pre>\n<p lang=\"zh\">\u8fd9\u91cc\u7684\u5173\u952e\u70b9\u662f\uff1a\u4f60\u5fc5\u987b\u5199\u6210 <code class=\"literal\">RETURNS SETOF record</code>\uff0c\u4ee5\u8868\u660e\u8be5\u51fd\u6570\u8fd4\u56de\u7684\u662f\u591a\u884c\u800c\u4e0d\u662f\u5355\u884c\u3002\u5982\u679c\u53ea\u6709\u4e00\u4e2a\u8f93\u51fa\u53c2\u6570\uff0c\u5219\u5199\u8be5\u53c2\u6570\u7684\u7c7b\u578b\uff0c\u800c\u4e0d\u662f <code class=\"type\">record</code>\u3002</p>\n<p lang=\"zh\">\u901a\u8fc7\u591a\u6b21\u8c03\u7528\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u6765\u6784\u9020\u67e5\u8be2\u7ed3\u679c\u901a\u5e38\u5f88\u6709\u7528\uff0c\u5176\u4e2d\u6bcf\u6b21\u8c03\u7528\u7684\u53c2\u6570\u90fd\u6765\u81ea\u8868\u6216\u5b50\u67e5\u8be2\u7684\u8fde\u7eed\u884c\u3002\u9996\u9009\u65b9\u5f0f\u662f\u4f7f\u7528 <code class=\"literal\">LATERAL</code> \u5173\u952e\u5b57\uff0c\u8be6\u89c1<a class=\"xref\" href=\"/docs/14/queries-table-expressions.html#QUERIES-LATERAL\" title=\"7.2.1.5.\u00a0LATERAL\u5b50\u67e5\u8be2\">\u7b2c\u00a07.2.1.5\u00a0\u8282</a>\u3002\u4e0b\u9762\u662f\u4e00\u4e2a\u4f7f\u7528\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u679a\u4e3e\u6811\u7ed3\u6784\u5143\u7d20\u7684\u793a\u4f8b\uff1a</p>\n<pre class=\"screen\">SELECT * FROM nodes;\n   name    | parent\n-----------+--------\n Top       |\n Child1    | Top\n Child2    | Top\n Child3    | Top\n SubChild1 | Child1\n SubChild2 | Child1\n(6 rows)\n\nCREATE FUNCTION listchildren(text) RETURNS SETOF text AS $$\n    SELECT name FROM nodes WHERE parent = $1\n$$ LANGUAGE SQL STABLE;\n\nSELECT * FROM listchildren('Top');\n listchildren\n--------------\n Child1\n Child2\n Child3\n(3 rows)\n\nSELECT name, child FROM nodes, LATERAL listchildren(name) AS child;\n  name  |   child\n--------+-----------\n Top    | Child1\n Top    | Child2\n Top    | Child3\n Child1 | SubChild1\n Child1 | SubChild2\n(5 rows)\n</pre>\n<p lang=\"zh\">\u8fd9\u4e2a\u4f8b\u5b50\u5e76\u6ca1\u6709\u505a\u51fa\u4efb\u4f55\u65e0\u6cd5\u7528\u7b80\u5355\u8fde\u63a5\u5b9e\u73b0\u7684\u4e8b\uff0c\u4f46\u5728\u66f4\u590d\u6742\u7684\u8ba1\u7b97\u4e2d\uff0c\u628a\u4e00\u90e8\u5206\u5de5\u4f5c\u653e\u8fdb\u51fd\u6570\u91cc\u901a\u5e38\u4f1a\u975e\u5e38\u65b9\u4fbf\u3002</p>\n<p lang=\"zh\">\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u4e5f\u53ef\u4ee5\u51fa\u73b0\u5728\u67e5\u8be2\u7684\u9009\u62e9\u5217\u8868\u4e2d\u3002\u5bf9\u4e8e\u67e5\u8be2\u672c\u8eab\u751f\u6210\u7684\u6bcf\u4e00\u884c\uff0c\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u90fd\u4f1a\u88ab\u8c03\u7528\uff0c\u5e76\u4e3a\u5176\u7ed3\u679c\u96c6\u4e2d\u7684\u6bcf\u4e00\u4e2a\u5143\u7d20\u751f\u6210\u4e00\u884c\u8f93\u51fa\u3002\u524d\u9762\u7684\u4f8b\u5b50\u4e5f\u53ef\u4ee5\u5199\u6210\u8fd9\u6837\uff1a</p>\n<pre class=\"screen\">SELECT listchildren('Top');\n listchildren\n--------------\n Child1\n Child2\n Child3\n(3 rows)\n\nSELECT name, listchildren(name) FROM nodes;\n  name  | listchildren\n--------+--------------\n Top    | Child1\n Top    | Child2\n Top    | Child3\n Child1 | SubChild1\n Child1 | SubChild2\n(5 rows)\n</pre>\n<p lang=\"zh\">\u5728\u6700\u540e\u4e00\u4e2a <code class=\"command\">SELECT</code> \u4e2d\uff0c\u6ce8\u610f\u6ca1\u6709\u4e3a <code class=\"literal\">Child2</code>\u3001<code class=\"literal\">Child3</code> \u7b49\u663e\u793a\u4efb\u4f55\u8f93\u51fa\u884c\u3002\u8fd9\u662f\u56e0\u4e3a <code class=\"function\">listchildren</code> \u5bf9\u8fd9\u4e9b\u53c2\u6570\u8fd4\u56de\u7684\u662f\u7a7a\u96c6\uff0c\u56e0\u6b64\u4e0d\u4f1a\u751f\u6210\u7ed3\u679c\u884c\u3002\u8fd9\u4e0e\u4f7f\u7528 <code class=\"literal\">LATERAL</code> \u8bed\u6cd5\u628a\u51fd\u6570\u7ed3\u679c\u505a\u5185\u8fde\u63a5\u65f6\u5f97\u5230\u7684\u884c\u4e3a\u76f8\u540c\u3002</p>\n<p lang=\"zh\"><span class=\"productname\">PostgreSQL</span>\u4e2d\uff0c\u5199\u5728\u67e5\u8be2\u7684\u9009\u62e9\u5217\u8868\u4e2d\u7684\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u7684\u884c\u4e3a\u51e0\u4e4e\u548c\u5199\u5728<code class=\"literal\">LATERAL FROM</code>\u5b50\u53e5\u9879\u4e2d\u7684\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u5b8c\u5168\u4e00\u6837\u3002\u4f8b\u5982\uff1a</p>\n<pre class=\"programlisting\">SELECT x, generate_series(1,5) AS g FROM tab;\n</pre>\n<p lang=\"zh\">\u51e0\u4e4e\u7b49\u6548\u4e8e</p>\n<pre class=\"programlisting\">SELECT x, g FROM tab, LATERAL generate_series(1,5) AS g;\n</pre>\n<p lang=\"zh\">\u8fd9\u4f1a\u662f\u5b8c\u5168\u4e00\u6837\u7684\uff0c\u9664\u4e86\u5728\u8fd9\u4e2a\u7279\u522b\u7684\u793a\u4f8b\u4e2d\uff0c\u89c4\u5212\u5668\u53ef\u4ee5\u9009\u62e9\u628a<code class=\"structname\">g</code>\u653e\u5728\u5d4c\u5957\u5faa\u73af\u8fde\u63a5\u7684\u5916\u4fa7\uff0c\u56e0\u4e3a<code class=\"structname\">g</code>\u5bf9<code class=\"structname\">tab</code>\u6ca1\u6709\u5b9e\u9645\u7684\u6a2a\u5411\u4f9d\u8d56\u3002\u90a3\u4f1a\u5bfc\u81f4\u4e00\u79cd\u4e0d\u540c\u7684\u8f93\u51fa\u884c\u987a\u5e8f\u3002\u9009\u62e9\u5217\u8868\u4e2d\u7684\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u603b\u662f\u4f1a\u88ab\u8ba1\u7b97\uff0c\u5c31\u597d\u50cf\u5b83\u4eec\u5728<code class=\"literal\">FROM</code>\u5b50\u53e5\u5269\u4f59\u90e8\u5206\u7684\u5d4c\u5957\u5faa\u73af\u8fde\u63a5\u7684\u5185\u4fa7\u4e00\u6837\uff0c\u56e0\u6b64\u5728\u8003\u8651\u6765\u81ea<code class=\"literal\">FROM</code>\u5b50\u53e5\u7684\u4e0b\u4e00\u884c\u4e4b\u524d\uff0c\u8fd9\u4e9b\u51fd\u6570\u4f1a\u8fd0\u884c\u5230\u5b8c\u6210\u3002</p>\n<p lang=\"zh\">\u5982\u679c\u5728\u67e5\u8be2\u7684\u9009\u62e9\u5217\u8868\u4e2d\u6709\u4e0d\u6b62\u4e00\u4e2a\u96c6\u5408\u8fd4\u56de\u51fd\u6570\uff0c\u5219\u884c\u4e3a\u7c7b\u4f3c\u4e8e\u628a\u90a3\u4e9b\u51fd\u6570\u653e\u5230\u4e00\u4e2a\u5355\u4e00\u7684<code class=\"literal\">LATERAL ROWS FROM( ... )</code> <code class=\"literal\">FROM</code>\u5b50\u53e5\u9879\u4e2d\u7684\u884c\u4e3a\u3002\u5bf9\u4e8e\u6765\u81ea\u5e95\u5c42\u67e5\u8be2\u7684\u6bcf\u4e00\u884c\uff0c\u90fd\u6709\u4e00\u4e2a\u7528\u5230\u6bcf\u4e2a\u51fd\u6570\u9996\u4e2a\u7ed3\u679c\u7684\u8f93\u51fa\u884c\uff0c\u7136\u540e\u662f\u4e00\u4e2a\u4f7f\u7528\u6bcf\u4e2a\u51fd\u6570\u7b2c\u4e8c\u4e2a\u7ed3\u679c\u7684\u8f93\u51fa\u884c\uff0c\u4ee5\u6b64\u7c7b\u63a8\u3002\u5982\u679c\u67d0\u4e9b\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u4ea7\u751f\u7684\u8f93\u51fa\u6bd4\u5176\u4ed6\u51fd\u6570\u5c11\uff0c\u4f1a\u7528\u7a7a\u503c\u4ee3\u66ff\u7f3a\u5931\u7684\u6570\u636e\uff0c\u56e0\u6b64\u4e3a\u4e00\u4e2a\u5e95\u5c42\u884c\u5f62\u6210\u7684\u603b\u884c\u6570\u7b49\u4e8e\u4ea7\u751f\u6700\u591a\u8f93\u51fa\u7684\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u7684\u8f93\u51fa\u884c\u6570\u3002\u56e0\u6b64\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u4f1a<span class=\"quote\">\u201c<span class=\"quote\">\u6b65\u8c03\u4e00\u81f4</span>\u201d</span>\u5730\u8fd0\u884c\u76f4\u5230\u5b83\u4eec\u7684\u8f93\u51fa\u88ab\u8017\u5c3d\uff0c\u7136\u540e\u7528\u4e0b\u4e00\u4e2a\u5e95\u5c42\u884c\u7ee7\u7eed\u6267\u884c\u3002</p>\n<p lang=\"zh\">\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u53ef\u4ee5\u88ab\u5d4c\u5957\u5728\u4e00\u4e2a\u9009\u62e9\u5217\u8868\u4e2d\uff0c\u4e0d\u8fc7\u5728<code class=\"literal\">FROM</code>\u5b50\u53e5\u9879\u4e2d\u4e0d\u5141\u8bb8\u8fd9\u6837\u505a\u3002\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b\uff0c\u5d4c\u5957\u7684\u6bcf\u4e00\u5c42\u4f1a\u88ab\u5355\u72ec\u5bf9\u5f85\uff0c\u5c31\u50cf\u5b83\u662f\u4e00\u4e2a\u5355\u72ec\u7684<code class=\"literal\">LATERAL ROWS FROM( ... )</code>\u9879\u4e00\u6837\u3002\u4f8b\u5982\uff0c\u5728</p>\n<pre class=\"programlisting\">SELECT srf1(srf2(x), srf3(y)), srf4(srf5(z)) FROM tab;\n</pre>\n<p lang=\"zh\">\u4e2d\uff0c\u96c6\u5408\u8fd4\u56de\u51fd\u6570<code class=\"function\">srf2</code>\u3001<code class=\"function\">srf3</code>\u548c<code class=\"function\">srf5</code>\u5c06\u4e3a<code class=\"structname\">tab</code>\u7684\u6bcf\u4e00\u884c\u6b65\u8c03\u4e00\u81f4\u5730\u8fd0\u884c\uff0c\u7136\u540e\u4f1a\u5bf9\u8f83\u4f4e\u5c42\u7684\u51fd\u6570\u4ea7\u751f\u7684\u6bcf\u4e00\u884c\u4ee5\u6b65\u8c03\u4e00\u81f4\u7684\u5f62\u5f0f\u5e94\u7528<code class=\"function\">srf1</code>\u548c<code class=\"function\">srf4</code>\u3002</p>\n<p lang=\"zh\">\u5728<code class=\"literal\">CASE</code>\u6216<code class=\"literal\">COALESCE</code>\u8fd9\u6837\u7684\u6761\u4ef6\u8ba1\u7b97\u7ed3\u6784\u4e2d\uff0c\u4e0d\u80fd\u4f7f\u7528\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u3002\u4f8b\u5982\uff0c\u8003\u8651</p>\n<pre class=\"programlisting\">SELECT x, CASE WHEN x &gt; 0 THEN generate_series(1, 5) ELSE 0 END FROM tab;\n</pre>\n<p lang=\"zh\">\u8868\u9762\u4e0a\u770b\uff0c\u8fd9\u5e94\u5f53\u8ba9 x &gt; 0 \u7684\u8f93\u5165\u884c\u91cd\u590d\u4e94\u6b21\uff0c\u5176\u4f59\u884c\u53ea\u51fa\u73b0\u4e00\u6b21\uff1b\u4f46\u5b9e\u9645\u4e0a\uff0cgenerate_series(1, 5) \u4f1a\u5728 CASE \u8868\u8fbe\u5f0f\u6c42\u503c\u4e4b\u524d\uff0c\u4f5c\u4e3a\u9690\u5f0f LATERAL FROM \u9879\u6267\u884c\uff0c\u56e0\u6b64\u6bcf\u4e2a\u8f93\u5165\u884c\u90fd\u4f1a\u91cd\u590d\u4e94\u6b21\u3002\u4e3a\u907f\u514d\u6df7\u6dc6\uff0c\u6b64\u7c7b\u5199\u6cd5\u4f1a\u5728\u89e3\u6790\u9636\u6bb5\u62a5\u9519\u3002</p>\n<div class=\"note\">\n<h3 class=\"title\" lang=\"zh\">\u6ce8\u610f</h3>\n<p lang=\"zh\">\u5982\u679c\u4e00\u4e2a\u51fd\u6570\u7684\u6700\u540e\u4e00\u6761\u547d\u4ee4\u662f <code class=\"command\">INSERT</code>\u3001<code class=\"command\">UPDATE</code> \u6216 <code class=\"command\">DELETE</code> \u5e76\u5e26\u6709 <code class=\"literal\">RETURNING</code>\uff0c\u90a3\u4e48\u5373\u4f7f\u8be5\u51fd\u6570\u6ca1\u6709\u58f0\u660e\u4e3a <code class=\"literal\">SETOF</code>\uff0c\u6216\u8005\u8c03\u7528\u5b83\u7684\u67e5\u8be2\u5e76\u672a\u53d6\u8d70\u5168\u90e8\u7ed3\u679c\u884c\uff0c\u8be5\u547d\u4ee4\u4e5f\u603b\u4f1a\u6267\u884c\u5230\u5b8c\u6210\u3002<code class=\"literal\">RETURNING</code> \u5b50\u53e5\u4ea7\u751f\u7684\u989d\u5916\u7ed3\u679c\u884c\u4f1a\u88ab\u9759\u9ed8\u4e22\u5f03\uff0c\u4f46\u76f8\u5e94\u7684\u8868\u4fee\u6539\u4ecd\u7136\u4f1a\u53d1\u751f\uff0c\u5e76\u4e14\u4f1a\u5728\u51fd\u6570\u8fd4\u56de\u524d\u5168\u90e8\u5b8c\u6210\u3002</p>\n</div>\n<div class=\"note\">\n<h3 class=\"title\" lang=\"zh\">\u6ce8\u610f</h3>\n<p lang=\"zh\">\u5728 <span class=\"productname\">PostgreSQL</span> 10 \u4e4b\u524d\uff0c\u9664\u975e\u591a\u4e2a\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u59cb\u7ec8\u4ea7\u751f\u76f8\u540c\u6570\u91cf\u7684\u884c\uff0c\u5426\u5219\u628a\u5b83\u4eec\u653e\u5728\u540c\u4e00\u4e2a\u9009\u62e9\u5217\u8868\u4e2d\u7684\u884c\u4e3a\u5e76\u4e0d\u5408\u7406\u3002\u5426\u5219\uff0c\u5f97\u5230\u7684\u8f93\u51fa\u884c\u6570\u4f1a\u662f\u8fd9\u4e9b\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u5404\u81ea\u4ea7\u751f\u884c\u6570\u7684\u6700\u5c0f\u516c\u500d\u6570\u3002\u6b64\u5916\uff0c\u5d4c\u5957\u7684\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u4e5f\u4e0d\u50cf\u4e0a\u6587\u6240\u63cf\u8ff0\u7684\u90a3\u6837\u5de5\u4f5c\uff1b\u76f8\u53cd\uff0c\u4e00\u4e2a\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u81f3\u591a\u53ea\u80fd\u6709\u4e00\u4e2a\u96c6\u5408\u8fd4\u56de\u53c2\u6570\uff0c\u5e76\u4e14\u6bcf\u4e00\u7ec4\u5d4c\u5957\u7684\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u90fd\u4f1a\u72ec\u7acb\u8fd0\u884c\u3002\u518d\u52a0\u4e0a\u8fc7\u53bb\u8fd8\u5141\u8bb8\u6761\u4ef6\u6267\u884c\uff08\u5373\u5728 <code class=\"literal\">CASE</code> \u7b49\u7ed3\u6784\u5185\u90e8\u4f7f\u7528\u96c6\u5408\u8fd4\u56de\u51fd\u6570\uff09\uff0c\u4e8b\u60c5\u5c31\u66f4\u52a0\u590d\u6742\u4e86\u3002\u5982\u679c\u4f60\u8981\u7f16\u5199\u9700\u8981\u5728\u65e7\u7248 <span class=\"productname\">PostgreSQL</span> \u4e0a\u8fd0\u884c\u7684\u67e5\u8be2\uff0c\u5efa\u8bae\u4f7f\u7528 <code class=\"literal\">LATERAL</code> \u8bed\u6cd5\uff0c\u56e0\u4e3a\u8fd9\u6837\u5728\u4e0d\u540c\u7248\u672c\u4e4b\u95f4\u80fd\u591f\u5f97\u5230\u4e00\u81f4\u7684\u7ed3\u679c\u3002\u5982\u679c\u4f60\u7684\u67e5\u8be2\u4f9d\u8d56\u4e8e\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u7684\u6761\u4ef6\u6267\u884c\uff0c\u6216\u8bb8\u53ef\u4ee5\u628a\u6761\u4ef6\u5224\u65ad\u79fb\u52a8\u5230\u81ea\u5b9a\u4e49\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u5185\u90e8\u6765\u4fee\u590d\u3002\u4f8b\u5982\uff0c</p>\n<pre class=\"programlisting\">SELECT x, CASE WHEN y &gt; 0 THEN generate_series(1, z) ELSE 5 END FROM tab;\n</pre>\n<p lang=\"zh\">\u53ef\u4ee5\u53d8\u6210</p>\n<pre class=\"programlisting\">CREATE FUNCTION case_generate_series(cond bool, start int, fin int, els int)\n  RETURNS SETOF int AS $$\nBEGIN\n  IF cond THEN\n    RETURN QUERY SELECT generate_series(start, fin);\n  ELSE\n    RETURN QUERY SELECT els;\n  END IF;\nEND$$ LANGUAGE plpgsql;\n\nSELECT x, case_generate_series(y &gt; 0, 1, z, 5) FROM tab;\n</pre>\n<p lang=\"zh\">\u8fd9\u79cd\u5199\u6cd5\u5728\u6240\u6709\u7248\u672c\u7684 <span class=\"productname\">PostgreSQL</span> \u4e2d\u7684\u884c\u4e3a\u90fd\u76f8\u540c\u3002</p>\n</div>\n</div>\n<div class=\"sect2\" id=\"XFUNC-SQL-FUNCTIONS-RETURNING-TABLE\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/14/xfunc-sql.html#XFUNC-SQL-FUNCTIONS-RETURNING-TABLE\">38.5.10. \u8fd4\u56de<code class=\"literal\">TABLE</code>\u7684<acronym class=\"acronym\">SQL</acronym>\u51fd\u6570</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\">\u8fd8\u6709\u53e6\u4e00\u79cd\u65b9\u6cd5\u53ef\u4ee5\u628a\u51fd\u6570\u58f0\u660e\u4e3a\u8fd4\u56de\u4e00\u4e2a\u96c6\u5408\uff0c\u5373\u4f7f\u7528 <code class=\"literal\">RETURNS TABLE(<em class=\"replaceable\"><code>columns</code></em>)</code>\u8bed\u6cd5\u3002\u8fd9\u7b49\u6548\u4e8e\u4f7f\u7528\u4e00\u4e2a\u6216\u8005\u591a\u4e2a<code class=\"literal\">OUT</code>\u53c2\u6570\u5916\u52a0\u628a\u51fd\u6570\u6807\u8bb0\u4e3a\u8fd4\u56de <code class=\"literal\">SETOF record</code>\uff08\u6216\u8005\u662f<code class=\"literal\">SETOF</code>\u5355\u4e2a\u8f93\u51fa\u53c2\u6570\u7684\u7c7b\u578b\uff09\u3002\u8fd9\u79cd\u5199\u6cd5\u662f\u5728\u6700\u8fd1\u7684 SQL \u6807\u51c6\u4e2d\u6307\u5b9a\u7684\uff0c\u56e0\u6b64\u53ef\u80fd\u6bd4\u4f7f\u7528 <code class=\"literal\">SETOF</code>\u7684\u79fb\u690d\u6027\u66f4\u597d\u3002</p>\n<p lang=\"zh\">\u4f8b\u5982\uff0c\u524d\u9762\u7684\u6c42\u548c\u5e76\u4e14\u76f8\u4e58\u7684\u793a\u4f8b\u4e5f\u53ef\u4ee5\u8fd9\u6837\u6765\u505a\uff1a</p>\n<pre class=\"programlisting\">CREATE FUNCTION sum_n_product_with_tab (x int)\nRETURNS TABLE(sum int, product int) AS $$\n    SELECT $1 + tab.y, $1 * tab.y FROM tab;\n$$ LANGUAGE SQL;\n</pre>\n<p lang=\"zh\">\u4e0d\u5141\u8bb8\u628a\u663e\u5f0f\u7684<code class=\"literal\">OUT</code>\u6216\u8005<code class=\"literal\">INOUT</code>\u53c2\u6570\u7528\u4e8e <code class=\"literal\">RETURNS TABLE</code>\u8bb0\u6cd5 \u2014 \u5fc5\u987b\u628a\u6240\u6709\u8f93\u51fa\u5217\u653e\u5728 <code class=\"literal\">TABLE</code>\u5217\u8868\u4e2d\u3002</p>\n</div>\n<div class=\"sect2\" id=\"XFUNC-SQL-POLYMORPHIC-FUNCTIONS\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/14/xfunc-sql.html#XFUNC-SQL-POLYMORPHIC-FUNCTIONS\">38.5.11. \u591a\u6001<acronym class=\"acronym\">SQL</acronym>\u51fd\u6570</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\"><acronym class=\"acronym\">SQL</acronym> \u51fd\u6570\u53ef\u4ee5\u88ab\u58f0\u660e\u4e3a\u63a5\u53d7\u5e76\u8fd4\u56de<a class=\"xref\" href=\"/docs/14/extend-type-system.html#EXTEND-TYPES-POLYMORPHIC\" title=\"38.2.5.\u00a0\u591a\u6001\u7c7b\u578b\">\u7b2c\u00a038.2.5\u00a0\u8282</a>\u4e2d\u63cf\u8ff0\u7684\u591a\u6001\u7c7b\u578b\u3002\u4e0b\u9762\u8fd9\u4e2a\u591a\u6001\u51fd\u6570 <code class=\"function\">make_array</code> \u4f1a\u6839\u636e\u4e24\u4e2a\u4efb\u610f\u6570\u636e\u7c7b\u578b\u7684\u5143\u7d20\u6784\u9020\u4e00\u4e2a\u6570\u7ec4\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION make_array(anyelement, anyelement) RETURNS anyarray AS $$\n    SELECT ARRAY[$1, $2];\n$$ LANGUAGE SQL;\n\nSELECT make_array(1, 2) AS intarray, make_array('a'::text, 'b') AS textarray;\n intarray | textarray\n----------+-----------\n {1,2}    | {a,b}\n(1 row)\n</pre>\n<p lang=\"zh\">\u6ce8\u610f\u7c7b\u578b\u8f6c\u6362<code class=\"literal\">'a'::text</code>\u7684\u4f7f\u7528\u662f\u4e3a\u4e86\u6307\u5b9a\u8be5\u53c2\u6570\u7684\u7c7b\u578b\u662f<code class=\"type\">text</code>\u3002\u5982\u679c\u8be5\u53c2\u6570\u53ea\u662f\u4e00\u4e2a\u5b57\u7b26\u4e32\u5b57\u9762\u91cf\uff0c\u8fd9\u5c31\u662f\u5fc5\u987b\u7684\uff0c\u56e0\u4e3a\u5426\u5219\u5b83\u4f1a\u88ab\u5f53\u4f5c<code class=\"type\">unknown</code>\u7c7b\u578b\uff0c\u5e76\u4e14 <code class=\"type\">unknown</code>\u7684\u6570\u7ec4\u4e5f\u4e0d\u662f\u4e00\u79cd\u5408\u6cd5\u7684\u7c7b\u578b\u3002\u5982\u679c\u6ca1\u6709\u8be5\u7c7b\u578b\u8f6c\u6362\uff0c\u5c06\u5f97\u5230\u8fd9\u6837\u7684\u9519\u8bef\uff1a</p>\n<pre class=\"screen\">ERROR:  could not determine polymorphic type because input has type unknown\n</pre>\n<p lang=\"zh\">\u6309\u7167\u4e0a\u9762\u7684\u65b9\u5f0f\u58f0\u660e <code class=\"function\">make_array</code> \u65f6\uff0c\u4f60\u5fc5\u987b\u63d0\u4f9b\u4e24\u4e2a\u6570\u636e\u7c7b\u578b\u5b8c\u5168\u76f8\u540c\u7684\u53c2\u6570\uff1b\u7cfb\u7edf\u4e0d\u4f1a\u5c1d\u8bd5\u89e3\u51b3\u5b83\u4eec\u4e4b\u95f4\u7684\u7c7b\u578b\u5dee\u5f02\u3002\u4f8b\u5982\uff0c\u4e0b\u9762\u8fd9\u6837\u662f\u4e0d\u884c\u7684\uff1a</p>\n<pre class=\"screen\">SELECT make_array(1, 2.5) AS numericarray;\nERROR:  function make_array(integer, numeric) does not exist\n</pre>\n<p lang=\"zh\">\u53e6\u4e00\u79cd\u65b9\u6cd5\u662f\u4f7f\u7528<span class=\"quote\">\u201c<span class=\"quote\">common</span>\u201d</span>\u8fd9\u4e00\u65cf\u591a\u6001\u7c7b\u578b\uff0c\u5b83\u5141\u8bb8\u7cfb\u7edf\u5c1d\u8bd5\u8bc6\u522b\u4e00\u4e2a\u5408\u9002\u7684\u516c\u5171\u7c7b\u578b\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION make_array2(anycompatible, anycompatible)\nRETURNS anycompatiblearray AS $$\n    SELECT ARRAY[$1, $2];\n$$ LANGUAGE SQL;\n\nSELECT make_array2(1, 2.5) AS numericarray;\n numericarray\n--------------\n {1,2.5}\n(1 row)\n</pre>\n<p lang=\"zh\">\u7531\u4e8e\u516c\u5171\u7c7b\u578b\u89e3\u6790\u89c4\u5219\u5728\u6240\u6709\u8f93\u5165\u90fd\u662f\u672a\u77e5\u7c7b\u578b\u65f6\u9ed8\u8ba4\u9009\u62e9 <code class=\"type\">text</code>\uff0c\u6240\u4ee5\u4e0b\u9762\u7684\u5199\u6cd5\u4e5f\u80fd\u5de5\u4f5c\uff1a</p>\n<pre class=\"screen\">SELECT make_array2('a', 'b') AS textarray;\n textarray \n-----------\n {a,b}\n(1 row)\n</pre>\n<p lang=\"zh\">\u5141\u8bb8\u5b58\u5728\u5177\u6709\u56fa\u5b9a\u8fd4\u56de\u7c7b\u578b\u7684\u591a\u6001\u53c2\u6570\uff0c\u4f46\u53cd\u8fc7\u6765\u5219\u4e0d\u5141\u8bb8\u3002\u4f8b\u5982\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION is_greater(anyelement, anyelement) RETURNS boolean AS $$\n    SELECT $1 &gt; $2;\n$$ LANGUAGE SQL;\n\nSELECT is_greater(1, 2);\n is_greater\n------------\n f\n(1 row)\n\nCREATE FUNCTION invalid_func() RETURNS anyelement AS $$\n    SELECT 1;\n$$ LANGUAGE SQL;\nERROR:  cannot determine result data type\nDETAIL:  A result of type anyelement requires at least one input of type anyelement, anyarray, anynonarray, anyenum, or anyrange.\n</pre>\n<p lang=\"zh\">\u591a\u6001\u4e5f\u53ef\u4ee5\u548c\u5e26\u8f93\u51fa\u53c2\u6570\u7684\u51fd\u6570\u4e00\u8d77\u4f7f\u7528\u3002\u4f8b\u5982\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION dup (f1 anyelement, OUT f2 anyelement, OUT f3 anyarray)\nAS 'select $1, array[$1,$1]' LANGUAGE SQL;\n\nSELECT * FROM dup(22);\n f2 |   f3\n----+---------\n 22 | {22,22}\n(1 row)\n</pre>\n<p lang=\"zh\">\u591a\u6001\u4e5f\u53ef\u4ee5\u7528\u4e8e\u53ef\u53d8\u53c2\u6570\u51fd\u6570\u3002\u4f8b\u5982\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION anyleast (VARIADIC anyarray) RETURNS anyelement AS $$\n    SELECT min($1[i]) FROM generate_subscripts($1, 1) g(i);\n$$ LANGUAGE SQL;\n\nSELECT anyleast(10, -1, 5, 4);\n anyleast \n----------\n       -1\n(1 row)\n\nSELECT anyleast('abc'::text, 'def');\n anyleast \n----------\n abc\n(1 row)\n\nCREATE FUNCTION concat_values(text, VARIADIC anyarray) RETURNS text AS $$\n    SELECT array_to_string($2, $1);\n$$ LANGUAGE SQL;\n\nSELECT concat_values('|', 1, 4, 2);\n concat_values \n---------------\n 1|4|2\n(1 row)\n</pre>\n</div>\n<div class=\"sect2\" id=\"id-1.8.3.8.21\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/14/xfunc-sql.html#XFUNC-SQL-COLLATIONS\">38.5.12. \u5e26\u6709\u6392\u5e8f\u89c4\u5219\u7684<acronym class=\"acronym\">SQL</acronym>\u51fd\u6570</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\">\u5f53\u4e00\u4e2a SQL \u51fd\u6570\u6709\u4e00\u4e2a\u6216\u591a\u4e2a\u652f\u6301\u6392\u5e8f\u89c4\u5219\u7684\u6570\u636e\u7c7b\u578b\u53c2\u6570\u65f6\uff0c\u4f1a\u6309<a class=\"xref\" href=\"/docs/14/collation.html\" title=\"24.2.\u00a0\u6392\u5e8f\u89c4\u5219\u652f\u6301\">\u7b2c\u00a024.2\u00a0\u8282</a>\u4e2d\u7684\u8bf4\u660e\uff0c\u6839\u636e\u5206\u914d\u7ed9\u5b9e\u53c2\u7684\u6392\u5e8f\u89c4\u5219\uff0c\u4e3a\u6bcf\u6b21\u51fd\u6570\u8c03\u7528\u786e\u5b9a\u4e00\u4e2a\u6392\u5e8f\u89c4\u5219\u3002\u5982\u679c\u80fd\u591f\u6210\u529f\u786e\u5b9a\uff08\u4e5f\u5c31\u662f\u8bf4\uff0c\u53c2\u6570\u4e4b\u95f4\u4e0d\u5b58\u5728\u9690\u5f0f\u6392\u5e8f\u89c4\u5219\u51b2\u7a81\uff09\uff0c\u90a3\u4e48\u6240\u6709\u652f\u6301\u6392\u5e8f\u89c4\u5219\u7684\u53c2\u6570\u90fd\u4f1a\u88ab\u89c6\u4e3a\u9690\u5f0f\u5e26\u6709\u8be5\u6392\u5e8f\u89c4\u5219\u3002\u8fd9\u4f1a\u5f71\u54cd\u51fd\u6570\u4e2d\u5bf9\u6392\u5e8f\u89c4\u5219\u654f\u611f\u7684\u64cd\u4f5c\u7684\u884c\u4e3a\u3002\u4f8b\u5982\uff0c\u4f7f\u7528\u4e0a\u6587\u7684 <code class=\"function\">anyleast</code> \u51fd\u6570\u65f6\uff0c</p>\n<pre class=\"programlisting\">SELECT anyleast('abc'::text, 'ABC');\n</pre>\n<p lang=\"zh\">\u5176\u7ed3\u679c\u5c06\u53d6\u51b3\u4e8e\u6570\u636e\u5e93\u7684\u9ed8\u8ba4\u6392\u5e8f\u89c4\u5219\u3002\u5728 <code class=\"literal\">C</code> \u533a\u57df\u8bbe\u7f6e\u4e0b\uff0c\u7ed3\u679c\u4f1a\u662f <code class=\"literal\">ABC</code>\uff0c\u4f46\u5728\u8bb8\u591a\u5176\u4ed6\u533a\u57df\u8bbe\u7f6e\u4e0b\u5219\u4f1a\u662f <code class=\"literal\">abc</code>\u3002\u53ef\u4ee5\u5728\u4efb\u610f\u53c2\u6570\u4e0a\u6dfb\u52a0 <code class=\"literal\">COLLATE</code> \u5b50\u53e5\u6765\u5f3a\u5236\u6307\u5b9a\u8981\u4f7f\u7528\u7684\u6392\u5e8f\u89c4\u5219\uff0c\u4f8b\u5982\uff1a</p>\n<pre class=\"programlisting\">SELECT anyleast('abc'::text, 'ABC' COLLATE \"C\");\n</pre>\n<p lang=\"zh\">\u53e6\u5916\uff0c\u5982\u679c\u4f60\u5e0c\u671b\u67d0\u4e2a\u51fd\u6570\u65e0\u8bba\u4ee5\u4ec0\u4e48\u6392\u5e8f\u89c4\u5219\u8c03\u7528\uff0c\u90fd\u59cb\u7ec8\u6309\u7279\u5b9a\u6392\u5e8f\u89c4\u5219\u5de5\u4f5c\uff0c\u53ef\u4ee5\u5728\u51fd\u6570\u5b9a\u4e49\u4e2d\u6309\u9700\u63d2\u5165 <code class=\"literal\">COLLATE</code> \u5b50\u53e5\u3002\u4e0b\u9762\u8fd9\u4e2a\u7248\u672c\u7684 <code class=\"function\">anyleast</code> \u5c06\u59cb\u7ec8\u4f7f\u7528 <code class=\"literal\">en_US</code> \u533a\u57df\u8bbe\u7f6e\u6765\u6bd4\u8f83\u5b57\u7b26\u4e32\uff1a</p>\n<pre class=\"programlisting\">CREATE FUNCTION anyleast (VARIADIC anyarray) RETURNS anyelement AS $$\n    SELECT min($1[i] COLLATE \"en_US\") FROM generate_subscripts($1, 1) g(i);\n$$ LANGUAGE SQL;\n</pre>\n<p lang=\"zh\">\u4f46\u8bf7\u6ce8\u610f\uff0c\u5982\u679c\u628a\u5b83\u7528\u4e8e\u4e0d\u652f\u6301\u6392\u5e8f\u89c4\u5219\u7684\u6570\u636e\u7c7b\u578b\uff0c\u5c31\u4f1a\u629b\u51fa\u9519\u8bef\u3002</p>\n<p lang=\"zh\">\u5982\u679c\u65e0\u6cd5\u5728\u5b9e\u53c2\u4e4b\u95f4\u786e\u5b9a\u5171\u540c\u7684\u6392\u5e8f\u89c4\u5219\uff0c\u90a3\u4e48 SQL \u51fd\u6570\u4f1a\u628a\u53c2\u6570\u89c6\u4e3a\u5e26\u6709\u5176\u6570\u636e\u7c7b\u578b\u7684\u9ed8\u8ba4\u6392\u5e8f\u89c4\u5219\uff08\u901a\u5e38\u662f\u6570\u636e\u5e93\u7684\u9ed8\u8ba4\u6392\u5e8f\u89c4\u5219\uff0c\u4f46\u5bf9\u57df\u7c7b\u578b\u53c2\u6570\u6765\u8bf4\u4e5f\u53ef\u80fd\u4e0d\u540c\uff09\u3002</p>\n<p lang=\"zh\">\u8fd9\u79cd\u652f\u6301\u6392\u5e8f\u89c4\u5219\u7684\u53c2\u6570\u7684\u884c\u4e3a\uff0c\u53ef\u4ee5\u770b\u4f5c\u662f\u4ec5\u9002\u7528\u4e8e\u6587\u672c\u6570\u636e\u7c7b\u578b\u7684\u4e00\u79cd\u53d7\u9650\u591a\u6001\u5f62\u5f0f\u3002</p>\n</div>\n</div>", "manual_path": "/docs/14/xfunc-sql.html", "localization": {"status": "complete", "sources": [{"url": "/docs/14/xfunc-sql.html", "method": "same-major semantic node", "sha256": "15ea88fa959acb010fd8a61c6c6fe6b8f1fee0cefa8b4fec8c472fc049bfe880", "language": "zh", "matched_nodes": ["#XFUNC-SQL/div[11]/h3[0]", "#XFUNC-SQL/div[13]/p[2]", "#XFUNC-SQL/div[13]/p[3]", "#XFUNC-SQL/div[13]/p[4]", "#XFUNC-SQL/div[13]/p[5]", "#XFUNC-SQL/div[13]/p[6]", "#XFUNC-SQL/div[13]/p[8]", "#XFUNC-SQL/div[14]/p[10]", "#XFUNC-SQL/div[14]/p[12]", "#XFUNC-SQL/div[14]/p[13]", "#XFUNC-SQL/div[14]/p[15]", "#XFUNC-SQL/div[14]/p[17]", "#XFUNC-SQL/div[14]/p[19]", "#XFUNC-SQL/div[14]/p[1]", "#XFUNC-SQL/div[14]/p[3]", "#XFUNC-SQL/div[14]/p[4]", "#XFUNC-SQL/div[14]/p[6]", "#XFUNC-SQL/div[14]/p[8]", "#XFUNC-SQL/div[15]/div[12]/ul[0]/li[0]", "#XFUNC-SQL/div[15]/div[12]/ul[0]/li[1]", "#XFUNC-SQL/div[15]/p[10]", "#XFUNC-SQL/div[15]/p[11]", "#XFUNC-SQL/div[15]/p[13]", "#XFUNC-SQL/div[15]/p[15]", "#XFUNC-SQL/div[15]/p[16]", "#XFUNC-SQL/div[15]/p[18]", "#XFUNC-SQL/div[15]/p[1]", "#XFUNC-SQL/div[15]/p[20]", "#XFUNC-SQL/div[15]/p[21]", "#XFUNC-SQL/div[15]/p[23]", "#XFUNC-SQL/div[15]/p[25]", "#XFUNC-SQL/div[15]/p[27]", "#XFUNC-SQL/div[15]/p[28]", "#XFUNC-SQL/div[15]/p[3]", "#XFUNC-SQL/div[15]/p[5]", "#XFUNC-SQL/div[15]/p[6]", "#XFUNC-SQL/div[15]/p[8]", "#XFUNC-SQL/div[16]/p[11]", "#XFUNC-SQL/div[16]/p[2]", "#XFUNC-SQL/div[16]/p[4]", "#XFUNC-SQL/div[16]/p[6]", "#XFUNC-SQL/div[16]/p[8]", "#XFUNC-SQL/div[16]/p[9]", "#XFUNC-SQL/div[17]/p[2]", "#XFUNC-SQL/div[17]/p[4]", "#XFUNC-SQL/div[17]/p[6]", "#XFUNC-SQL/div[17]/p[7]", "#XFUNC-SQL/div[18]/p[10]", "#XFUNC-SQL/div[18]/p[11]", "#XFUNC-SQL/div[18]/p[13]", "#XFUNC-SQL/div[18]/p[14]", "#XFUNC-SQL/div[18]/p[16]", "#XFUNC-SQL/div[18]/p[3]", "#XFUNC-SQL/div[18]/p[5]", "#XFUNC-SQL/div[18]/p[7]", "#XFUNC-SQL/div[18]/p[8]", "#XFUNC-SQL/div[19]/p[2]", "#XFUNC-SQL/div[19]/p[3]", "#XFUNC-SQL/div[19]/p[5]", "#XFUNC-SQL/div[1]/dl[0]/dt[0]", "#XFUNC-SQL/div[1]/dl[0]/dt[10]", "#XFUNC-SQL/div[1]/dl[0]/dt[11]", "#XFUNC-SQL/div[1]/dl[0]/dt[1]", "#XFUNC-SQL/div[1]/dl[0]/dt[2]", "#XFUNC-SQL/div[1]/dl[0]/dt[3]", "#XFUNC-SQL/div[1]/dl[0]/dt[4]", "#XFUNC-SQL/div[1]/dl[0]/dt[5]", "#XFUNC-SQL/div[1]/dl[0]/dt[6]", "#XFUNC-SQL/div[1]/dl[0]/dt[7]", "#XFUNC-SQL/div[1]/dl[0]/dt[8]", "#XFUNC-SQL/div[1]/dl[0]/dt[9]", "#XFUNC-SQL/div[20]/p[1]", "#XFUNC-SQL/div[20]/p[2]", "#XFUNC-SQL/div[20]/p[4]", "#XFUNC-SQL/div[20]/p[5]", "#XFUNC-SQL/div[21]/div[28]/p[1]", "#XFUNC-SQL/div[21]/div[29]/p[1]", "#XFUNC-SQL/div[21]/div[29]/p[3]", "#XFUNC-SQL/div[21]/div[29]/p[5]", "#XFUNC-SQL/div[21]/p[10]", "#XFUNC-SQL/div[21]/p[12]", "#XFUNC-SQL/div[21]/p[13]", "#XFUNC-SQL/div[21]/p[15]", "#XFUNC-SQL/div[21]/p[16]", "#XFUNC-SQL/div[21]/p[18]", "#XFUNC-SQL/div[21]/p[20]", "#XFUNC-SQL/div[21]/p[21]", "#XFUNC-SQL/div[21]/p[22]", "#XFUNC-SQL/div[21]/p[24]", "#XFUNC-SQL/div[21]/p[25]", "#XFUNC-SQL/div[21]/p[2]", "#XFUNC-SQL/div[21]/p[3]", "#XFUNC-SQL/div[21]/p[5]", "#XFUNC-SQL/div[21]/p[7]", "#XFUNC-SQL/div[21]/p[9]", "#XFUNC-SQL/div[22]/p[2]", "#XFUNC-SQL/div[22]/p[3]", "#XFUNC-SQL/div[22]/p[5]", "#XFUNC-SQL/div[23]/p[11]", "#XFUNC-SQL/div[23]/p[13]", "#XFUNC-SQL/div[23]/p[15]", "#XFUNC-SQL/div[23]/p[1]", "#XFUNC-SQL/div[23]/p[3]", "#XFUNC-SQL/div[23]/p[5]", "#XFUNC-SQL/div[23]/p[7]", "#XFUNC-SQL/div[23]/p[9]", "#XFUNC-SQL/div[24]/p[10]", "#XFUNC-SQL/div[24]/p[2]", "#XFUNC-SQL/div[24]/p[4]", "#XFUNC-SQL/div[24]/p[6]", "#XFUNC-SQL/div[24]/p[8]", "#XFUNC-SQL/div[24]/p[9]", "#XFUNC-SQL/p[10]", "#XFUNC-SQL/p[12]", "#XFUNC-SQL/p[3]", "#XFUNC-SQL/p[4]", "#XFUNC-SQL/p[5]", "#XFUNC-SQL/p[6]", "#XFUNC-SQL/p[8]"]}], "language": "zh", "original_text": {"/versions/14/description/0": "SQL-language functions", "/versions/14/facts/0/label": "Kind", "/versions/14/facts/0/value": "Native function language", "/versions/14/facts/1/label": "Trusted", "/versions/14/facts/2/label": "Validator"}, "fallback_fields": [], "source_language": "en", "original_snapshot_sha256": "f9fa122e082e0687621a3670dffca59c9a9213c3e4cc1912f54dbd833a2ca697"}, "comparison_data": {"kind": "Native function language", "handler": "", "trusted": "t", "validator": "fmgr_sql_validator"}, "comparison_hash": "a4af9cf453d140d941e865b952c6a41e2b704a4b30cb77b61c1cdda8a77c5035", "manual_language": "zh"}, "15": {"facts": [{"label": "\u79cd\u7c7b", "value": "\u539f\u751f\u51fd\u6570\u8bed\u8a00"}, {"label": "\u53ef\u4fe1", "value": "t"}, {"label": "\u6821\u9a8c\u51fd\u6570", "value": "fmgr_sql_validator"}], "tables": [], "aliases": [], "catalog": {"oid": "14", "descr": "SQL-language functions", "lanacl": "_null_", "lanispl": "f", "lanname": "sql", "lanowner": "POSTGRES", "laninline": "0", "oid_symbol": "SQLlanguageId", "lanpltrusted": "t", "lanvalidator": "fmgr_sql_validator", "lanplcallfoid": "0"}, "related": [], "release": {"ref": "https://ftp.postgresql.org/pub/source/v15.19/postgresql-15.19.tar.bz2", "label": "15.19", "major": "15", "channel": "stable", "revision": "e1a64a87a46b825b88c082e4518161a47aab53c45694964f8ba1df28f7859f89", "source_sha256": "e1a64a87a46b825b88c082e4518161a47aab53c45694964f8ba1df28f7859f89", "catalog_fingerprint": "fefe3c425147a86defada190c9b0663cfe02caa1724f5dede93e46457572252d"}, "sources": [{"url": "https://ftp.postgresql.org/pub/source/v15.19/postgresql-15.19.tar.bz2", "label": "Matching PostgreSQL source archive", "sha256": "e1a64a87a46b825b88c082e4518161a47aab53c45694964f8ba1df28f7859f89"}, {"url": "https://pg.center/docs/15/xfunc-sql.html", "path": "xfunc-sql.html", "label": "PostgreSQL 15 English manual", "sha256": "93738af0cad145c8064564d00533e1c12f1c1562a2d7c26f3f7de60e25231de5", "language": "en", "original_url": "/docs/15/xfunc-sql.html"}], "sections": [], "signature": "", "attributes": {"kind": "Native function language", "handler": "", "trusted": "t", "validator": "fmgr_sql_validator"}, "description": ["SQL \u8bed\u8a00\u51fd\u6570"], "manual_html": "<div class=\"sect1\" id=\"XFUNC-SQL\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h2 class=\"title\" lang=\"zh\">38.5. \u67e5\u8be2\u8bed\u8a00\uff08SQL\uff09\u51fd\u6570</h2>\n</div>\n</div>\n</div>\n<p lang=\"zh\">SQL \u51fd\u6570\u6267\u884c\u7531\u4efb\u610f SQL \u8bed\u53e5\u7ec4\u6210\u7684\u4e00\u4e2a\u5217\u8868\uff0c\u5e76\u8fd4\u56de\u5217\u8868\u4e2d\u6700\u540e\u4e00\u4e2a\u67e5\u8be2\u7684\u7ed3\u679c\u3002\u5728\u7b80\u5355\uff08\u975e\u96c6\u5408\uff09\u60c5\u51b5\u4e0b\uff0c\u5c06\u8fd4\u56de\u6700\u540e\u4e00\u4e2a\u67e5\u8be2\u7ed3\u679c\u7684\u7b2c\u4e00\u884c\u3002\uff08\u8bf7\u8bb0\u4f4f\uff0c\u9664\u975e\u4f7f\u7528 <code class=\"literal\">ORDER BY</code>\uff0c\u5426\u5219\u591a\u884c\u7ed3\u679c\u4e2d\u7684<span class=\"quote\">\u201c<span class=\"quote\">\u7b2c\u4e00\u884c</span>\u201d</span>\u5e76\u6ca1\u6709\u660e\u786e\u5b9a\u4e49\u3002\uff09\u5982\u679c\u6700\u540e\u4e00\u4e2a\u67e5\u8be2\u5b8c\u5168\u6ca1\u6709\u8fd4\u56de\u4efb\u4f55\u884c\uff0c\u5219\u8fd4\u56de\u7a7a\u503c\u3002</p>\n<p lang=\"zh\">\u6216\u8005\uff0c\u4e00\u4e2a SQL \u51fd\u6570\u53ef\u4ee5\u901a\u8fc7\u6307\u5b9a\u51fd\u6570\u7684\u8fd4\u56de\u7c7b\u578b\u4e3a<code class=\"literal\">SETOF <em class=\"replaceable\"><code>sometype</code></em></code>\u88ab\u58f0\u660e\u4e3a\u8fd4\u56de\u4e00\u4e2a\u96c6\u5408\uff08\u4e5f\u5c31\u662f\u591a\u4e2a\u884c\uff09\uff0c\u6216\u8005\u7b49\u6548\u5730\u58f0\u660e\u5b83\u4e3a<code class=\"literal\">RETURNS TABLE(<em class=\"replaceable\"><code>columns</code></em>)</code>\u3002\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b\uff0c\u6700\u540e\u4e00\u4e2a\u67e5\u8be2\u7684\u7ed3\u679c\u7684\u6240\u6709\u884c\u4f1a\u88ab\u8fd4\u56de\u3002\u4e0b\u6587\u5c06\u7ed9\u51fa\u8fdb\u4e00\u6b65\u7684\u7ec6\u8282\u3002</p>\n<p lang=\"zh\">SQL \u51fd\u6570\u7684\u51fd\u6570\u4f53\u5fc5\u987b\u662f\u4e00\u4e2a\u7531\u5206\u53f7\u5206\u9694\u7684 SQL \u8bed\u53e5\u5217\u8868\u3002\u6700\u540e\u4e00\u6761\u8bed\u53e5\u540e\u7684\u5206\u53f7\u662f\u53ef\u9009\u7684\u3002\u9664\u975e\u8be5\u51fd\u6570\u88ab\u58f0\u660e\u4e3a\u8fd4\u56de <code class=\"type\">void</code>\uff0c\u5426\u5219\u6700\u540e\u4e00\u6761\u8bed\u53e5\u5fc5\u987b\u662f <code class=\"command\">SELECT</code>\uff0c\u6216\u8005\u662f <code class=\"command\">INSERT</code>\u3001<code class=\"command\">UPDATE</code> \u6216 <code class=\"command\">DELETE</code> \u5e76\u5e26\u6709 <code class=\"literal\">RETURNING</code> \u5b50\u53e5\u3002</p>\n<p lang=\"zh\">\u4efb\u610f\u4e00\u7ec4 <acronym class=\"acronym\">SQL</acronym> \u8bed\u8a00\u547d\u4ee4\u90fd\u53ef\u4ee5\u6253\u5305\u5e76\u5b9a\u4e49\u6210\u51fd\u6570\u3002\u9664 <code class=\"command\">SELECT</code> \u67e5\u8be2\u5916\uff0c\u8fd9\u4e9b\u547d\u4ee4\u8fd8\u53ef\u4ee5\u5305\u542b\u6570\u636e\u4fee\u6539\u67e5\u8be2\uff08<code class=\"command\">INSERT</code>\u3001<code class=\"command\">UPDATE</code>\u3001<code class=\"command\">DELETE</code> \u548c <code class=\"command\">MERGE</code>\uff09\uff0c\u4ee5\u53ca\u5176\u4ed6 SQL \u547d\u4ee4\u3002\uff08\u5728 <acronym class=\"acronym\">SQL</acronym> \u51fd\u6570\u4e2d\u4e0d\u80fd\u4f7f\u7528\u4e8b\u52a1\u63a7\u5236\u547d\u4ee4\uff0c\u4f8b\u5982 <code class=\"command\">COMMIT</code>\u3001<code class=\"command\">SAVEPOINT</code>\uff0c\u4e5f\u4e0d\u80fd\u4f7f\u7528\u67d0\u4e9b\u5de5\u5177\u547d\u4ee4\uff0c\u4f8b\u5982 <code class=\"literal\">VACUUM</code>\u3002\uff09\u4e0d\u8fc7\uff0c\u6700\u540e\u4e00\u6761\u547d\u4ee4\u5fc5\u987b\u662f <code class=\"command\">SELECT</code>\uff0c\u6216\u8005\u5e26\u6709 <code class=\"literal\">RETURNING</code> \u5b50\u53e5\uff0c\u5e76\u8fd4\u56de\u4e0e\u51fd\u6570\u58f0\u660e\u8fd4\u56de\u7c7b\u578b\u76f8\u7b26\u7684\u7ed3\u679c\u3002\u6216\u8005\uff0c\u5982\u679c\u4f60\u60f3\u5b9a\u4e49\u4e00\u4e2a\u6267\u884c\u52a8\u4f5c\u4f46\u6ca1\u6709\u6709\u7528\u8fd4\u56de\u503c\u7684 SQL \u51fd\u6570\uff0c\u4e5f\u53ef\u4ee5\u628a\u5b83\u5b9a\u4e49\u4e3a\u8fd4\u56de <code class=\"type\">void</code>\u3002\u4f8b\u5982\uff0c\u4e0b\u9762\u8fd9\u4e2a\u51fd\u6570\u4f1a\u4ece <code class=\"literal\">emp</code> \u8868\u4e2d\u5220\u9664\u85aa\u8d44\u4e3a\u8d1f\u7684\u884c\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION clean_emp() RETURNS void AS '\n    DELETE FROM emp\n        WHERE salary &lt; 0;\n' LANGUAGE SQL;\n\nSELECT clean_emp();\n\n clean_emp\n-----------\n\n(1 row)\n</pre>\n<p lang=\"zh\">\u4f60\u4e5f\u53ef\u4ee5\u628a\u8fd9\u4e2a\u5199\u4e3a\u4e00\u4e2a\u8fc7\u7a0b\uff0c\u90a3\u6837\u907f\u514d\u8fd4\u56de\u7c7b\u578b\u7684\u95ee\u9898\u3002\u4f8b\u5982\uff1a</p>\n<pre class=\"screen\">CREATE PROCEDURE clean_emp() AS '\n    DELETE FROM emp\n        WHERE salary &lt; 0;\n' LANGUAGE SQL;\n\nCALL clean_emp();\n</pre>\n<p lang=\"zh\">\u5728\u50cf\u8fd9\u6837\u7684\u7b80\u5355\u60c5\u51b5\u4e2d\uff0c\u8fd4\u56de<code class=\"type\">void</code>\u7684\u51fd\u6570\u4e0e\u8fc7\u7a0b\u4e4b\u95f4\u7684\u5dee\u5f02\u4e3b\u8981\u662f\u98ce\u683c\u4e0a\u9762\u7684\u3002\u4e0d\u8fc7\uff0c\u8fc7\u7a0b\u8fd8\u63d0\u4f9b\u4e86\u51fd\u6570\u6240\u6ca1\u6709\u7684\u989d\u5916\u80fd\u529b\uff0c\u4f8b\u5982\u4e8b\u52a1\u63a7\u5236\u3002\u6b64\u5916\uff0c\u8fc7\u7a0b\u662f SQL \u6807\u51c6\u7684\u4e00\u90e8\u5206\uff0c\u800c\u8fd4\u56de<code class=\"type\">void</code>\u5219\u662f PostgreSQL \u6269\u5c55\u3002</p>\n<div class=\"note\">\n<h3 class=\"title\" lang=\"zh\">\u6ce8\u610f</h3>\n<p lang=\"zh\">SQL \u51fd\u6570\u7684\u6574\u4e2a\u51fd\u6570\u4f53\u4f1a\u5728\u4efb\u4f55\u8bed\u53e5\u6267\u884c\u4e4b\u524d\u5b8c\u6210\u89e3\u6790\u3002\u867d\u7136 SQL \u51fd\u6570\u53ef\u4ee5\u5305\u542b\u4fee\u6539\u7cfb\u7edf\u76ee\u5f55\u7684\u547d\u4ee4\uff0c\u4f8b\u5982 CREATE TABLE\uff0c\u4f46\u5728\u5206\u6790\u51fd\u6570\u4e2d\u540e\u7eed\u547d\u4ee4\u65f6\uff0c\u8fd9\u4e9b\u4fee\u6539\u5c1a\u4e0d\u53ef\u89c1\u3002\u56e0\u6b64\uff0c\u5c06 CREATE TABLE foo (...); INSERT INTO foo VALUES(...); \u653e\u5728\u540c\u4e00\u4e2a SQL \u51fd\u6570\u4e2d\u4e0d\u4f1a\u6309\u9884\u671f\u5de5\u4f5c\uff0c\u56e0\u4e3a\u89e3\u6790 INSERT \u65f6 foo \u5c1a\u4e0d\u5b58\u5728\u3002\u6b64\u7c7b\u60c5\u51b5\u5efa\u8bae\u6539\u7528 PL/pgSQL\u3002</p>\n</div>\n<p lang=\"zh\"><code class=\"command\">CREATE FUNCTION</code> \u547d\u4ee4\u7684\u8bed\u6cd5\u8981\u6c42\u628a\u51fd\u6570\u4f53\u5199\u6210\u4e00\u4e2a\u5b57\u7b26\u4e32\u5e38\u91cf\u3002\u5bf9\u4e8e\u5b57\u7b26\u4e32\u5e38\u91cf\uff0c\u901a\u5e38\u4f7f\u7528\u7f8e\u5143\u5f15\u7528\u6700\u65b9\u4fbf\uff08\u89c1<a class=\"xref\" href=\"/docs/15/sql-syntax.html#SQL-SYNTAX-DOLLAR-QUOTING\" title=\"4.1.2.4.\u00a0\u7f8e\u5143\u5f15\u7528\u7684\u5b57\u7b26\u4e32\u5e38\u91cf\">\u7b2c\u00a04.1.2.4\u00a0\u8282</a>\uff09\u3002\u5982\u679c\u4f60\u9009\u62e9\u4f7f\u7528\u5e38\u89c4\u7684\u5355\u5f15\u53f7\u5b57\u7b26\u4e32\u5e38\u91cf\u8bed\u6cd5\uff0c\u90a3\u4e48\u5fc5\u987b\u5728\u51fd\u6570\u4f53\u4e2d\u5c06\u5355\u5f15\u53f7\uff08<code class=\"literal\">'</code>\uff09\u548c\u53cd\u659c\u7ebf\uff08<code class=\"literal\">\\</code>\uff09\u5199\u6210\u53cc\u4efd\uff08\u5047\u5b9a\u4f7f\u7528\u8f6c\u4e49\u5b57\u7b26\u4e32\u8bed\u6cd5\uff0c\u89c1<a class=\"xref\" href=\"/docs/15/sql-syntax.html#SQL-SYNTAX-STRINGS\" title=\"4.1.2.1.\u00a0\u5b57\u7b26\u4e32\u5e38\u91cf\">\u7b2c\u00a04.1.2.1\u00a0\u8282</a>\uff09\u3002</p>\n<div class=\"sect2\" id=\"XFUNC-SQL-FUNCTION-ARGUMENTS\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/15/xfunc-sql.html#XFUNC-SQL-FUNCTION-ARGUMENTS\">38.5.1. <acronym class=\"acronym\">SQL</acronym>\u51fd\u6570\u7684\u53c2\u6570</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\">\u4e00\u4e2a SQL \u51fd\u6570\u7684\u53c2\u6570\u53ef\u4ee5\u5728\u51fd\u6570\u4f53\u4e2d\u7528\u540d\u79f0\u6216\u7f16\u53f7\u5f15\u7528\u3002\u4e0b\u9762\u4f1a\u6709\u4e24\u79cd\u65b9\u6cd5\u7684\u793a\u4f8b\u3002</p>\n<p lang=\"zh\">\u8981\u4f7f\u7528\u4e00\u4e2a\u540d\u79f0\uff0c\u5c06\u51fd\u6570\u53c2\u6570\u58f0\u660e\u4e3a\u5e26\u6709\u4e00\u4e2a\u540d\u79f0\uff0c\u7136\u540e\u5728\u51fd\u6570\u4f53\u4e2d\u53ea\u5199\u8be5\u540d\u79f0\u3002\u5982\u679c\u53c2\u6570\u540d\u79f0\u4e0e\u51fd\u6570\u5185\u5f53\u524d SQL \u547d\u4ee4\u4e2d\u7684\u4efb\u610f\u5217\u540d\u76f8\u540c\uff0c\u5217\u540d\u5c06\u4f18\u5148\u3002\u5982\u679c\u4e0d\u60f3\u8fd9\u6837\uff0c\u53ef\u4ee5\u7528\u51fd\u6570\u672c\u8eab\u7684\u540d\u79f0\u6765\u9650\u5b9a\u53c2\u6570\u540d\uff0c\u4e5f\u5c31\u662f<code class=\"literal\"><em class=\"replaceable\"><code>function_name</code></em>.<em class=\"replaceable\"><code>argument_name</code></em></code>\uff08\u5982\u679c\u8fd9\u4f1a\u4e0e\u4e00\u4e2a\u88ab\u9650\u5b9a\u7684\u5217\u540d\u51b2\u7a81\uff0c\u7167\u4f8b\u8fd8\u662f\u5217\u540d\u8d62\u5f97\u4f18\u5148\u3002\u4f60\u53ef\u4ee5\u901a\u8fc7\u4e3a SQL \u547d\u4ee4\u4e2d\u7684\u8868\u9009\u62e9\u4e00\u4e2a\u4e0d\u540c\u7684\u522b\u540d\u6765\u907f\u514d\u8fd9\u79cd\u6df7\u6dc6\uff09\u3002</p>\n<p lang=\"zh\">\u5728\u66f4\u65e7\u7684\u6570\u5b57\u65b9\u6cd5\u4e2d\uff0c\u53c2\u6570\u53ef\u4ee5\u7528\u8bed\u6cd5<code class=\"literal\">$<em class=\"replaceable\"><code>n</code></em></code>\u5f15\u7528\uff1a<code class=\"literal\">$1</code>\u6307\u7684\u662f\u7b2c\u4e00\u4e2a\u8f93\u5165\u53c2\u6570\uff0c<code class=\"literal\">$2</code>\u6307\u7684\u662f\u7b2c\u4e8c\u4e2a\uff0c\u4ee5\u6b64\u7c7b\u63a8\u3002\u4e0d\u7ba1\u7279\u5b9a\u7684\u53c2\u6570\u662f\u5426\u4f7f\u7528\u540d\u79f0\u58f0\u660e\uff0c\u8fd9\u79cd\u65b9\u6cd5\u90fd\u6709\u6548\u3002</p>\n<p lang=\"zh\">\u5982\u679c\u4e00\u4e2a\u53c2\u6570\u662f\u4e00\u79cd\u590d\u5408\u7c7b\u578b\uff0c\u90a3\u4e48\u70b9\u53f7\u8bb0\u6cd5\uff08\u5982 <code class=\"literal\"><em class=\"replaceable\"><code>argname</code></em>.<em class=\"replaceable\"><code>fieldname</code></em></code> \u6216<code class=\"literal\">$1.<em class=\"replaceable\"><code>fieldname</code></em></code>\uff09\u4e5f\u53ef\u4ee5\u88ab\u7528\u6765\u8bbf\u95ee\u8be5\u53c2\u6570\u7684\u5c5e\u6027\u3002\u540c\u6837\uff0c\u4f60\u53ef\u80fd\u9700\u8981\u7528\u51fd\u6570\u7684\u540d\u79f0\u6765\u9650\u5b9a\u53c2\u6570\u7684\u540d\u79f0\u4ee5\u907f\u514d\u6b67\u4e49\u3002</p>\n<p lang=\"zh\">SQL \u51fd\u6570\u53c2\u6570\u53ea\u80fd\u88ab\u7528\u4f5c\u6570\u636e\u503c\u800c\u4e0d\u80fd\u4f5c\u4e3a\u6807\u8bc6\u7b26\u3002\u4f8b\u5982\u8fd9\u662f\u5408\u7406\u7684\uff1a</p>\n<pre class=\"programlisting\">INSERT INTO mytable VALUES ($1);\n</pre>\n<p lang=\"zh\">\u4f46\u8fd9\u6837\u5c31\u4e0d\u884c\uff1a</p>\n<pre class=\"programlisting\">INSERT INTO $1 VALUES (42);\n</pre>\n<div class=\"note\">\n<h3 class=\"title\" lang=\"zh\">\u6ce8\u610f</h3>\n<p lang=\"zh\">PostgreSQL 9.2 \u5f00\u59cb\u652f\u6301\u901a\u8fc7\u540d\u79f0\u5f15\u7528 SQL \u51fd\u6570\u53c2\u6570\u3002\u9700\u8981\u7528\u4e8e\u66f4\u65e9\u7248\u672c\u670d\u52a1\u5668\u7684\u51fd\u6570\u5fc5\u987b\u4f7f\u7528 $n \u8bb0\u6cd5\u3002</p>\n</div>\n</div>\n<div class=\"sect2\" id=\"XFUNC-SQL-BASE-FUNCTIONS\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/15/xfunc-sql.html#XFUNC-SQL-BASE-FUNCTIONS\">38.5.2. \u57fa\u7840\u7c7b\u578b\u4e0a\u7684<acronym class=\"acronym\">SQL</acronym>\u51fd\u6570</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\">\u6700\u7b80\u5355\u7684 <acronym class=\"acronym\">SQL</acronym> \u51fd\u6570\u6ca1\u6709\u53c2\u6570\uff0c\u53ea\u662f\u8fd4\u56de\u4e00\u4e2a\u57fa\u7840\u7c7b\u578b\uff0c\u4f8b\u5982 <code class=\"type\">integer</code>\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION one() RETURNS integer AS $$\n    SELECT 1 AS result;\n$$ LANGUAGE SQL;\n\n-- Alternative syntax for string literal:\nCREATE FUNCTION one() RETURNS integer AS '\n    SELECT 1 AS result;\n' LANGUAGE SQL;\n\nSELECT one();\n\n one\n-----\n   1\n</pre>\n<p lang=\"zh\">\u6ce8\u610f\u6211\u4eec\u4e3a\u8be5\u51fd\u6570\u7684\u7ed3\u679c\u5728\u51fd\u6570\u4f53\u5185\u5b9a\u4e49\u4e86\u4e00\u4e2a\u5217\u522b\u540d\uff08\u540d\u4e3a<code class=\"literal\">result</code>\uff09\uff0c\u4f46\u662f\u8fd9\u4e2a\u5217\u522b\u540d\u5728\u51fd\u6570\u4ee5\u5916\u662f\u4e0d\u53ef\u89c1\u7684\u3002\u56e0\u6b64\uff0c\u7ed3\u679c\u88ab\u6807\u8bb0\u4e3a<code class=\"literal\">one</code>\u800c\u4e0d\u662f<code class=\"literal\">result</code>\u3002</p>\n<p lang=\"zh\">\u5b9a\u4e49\u63a5\u53d7\u57fa\u7840\u7c7b\u578b\u53c2\u6570\u7684 <acronym class=\"acronym\">SQL</acronym> \u51fd\u6570\u4e5f\u51e0\u4e4e\u540c\u6837\u5bb9\u6613\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION add_em(x integer, y integer) RETURNS integer AS $$\n    SELECT x + y;\n$$ LANGUAGE SQL;\n\nSELECT add_em(1, 2) AS answer;\n\n answer\n--------\n      3\n</pre>\n<p lang=\"zh\">\u6216\u8005\uff0c\u6211\u4eec\u4e5f\u53ef\u4ee5\u4e0d\u7528\u53c2\u6570\u540d\uff0c\u800c\u6539\u7528\u6570\u5b57\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION add_em(integer, integer) RETURNS integer AS $$\n    SELECT $1 + $2;\n$$ LANGUAGE SQL;\n\nSELECT add_em(1, 2) AS answer;\n\n answer\n--------\n      3\n</pre>\n<p lang=\"zh\">\u4e0b\u9762\u662f\u4e00\u4e2a\u66f4\u6709\u7528\u7684\u51fd\u6570\uff0c\u5b83\u53ef\u4ee5\u7528\u6765\u4ece\u94f6\u884c\u8d26\u6237\u4e2d\u6263\u6b3e\uff1a</p>\n<pre class=\"programlisting\">CREATE FUNCTION tf1 (accountno integer, debit numeric) RETURNS numeric AS $$\n    UPDATE bank\n        SET balance = balance - debit\n        WHERE accountno = tf1.accountno;\n    SELECT 1;\n$$ LANGUAGE SQL;\n</pre>\n<p lang=\"zh\">\u7528\u6237\u53ef\u4ee5\u8fd9\u6837\u6267\u884c\u8be5\u51fd\u6570\uff0c\u4ece 17 \u53f7\u8d26\u6237\u4e2d\u6263\u9664 $100.00\uff1a</p>\n<pre class=\"programlisting\">SELECT tf1(17, 100.0);\n</pre>\n<p lang=\"zh\">\u5728\u8fd9\u4e2a\u793a\u4f8b\u4e2d\uff0c\u6211\u4eec\u4e3a\u7b2c\u4e00\u4e2a\u53c2\u6570\u9009\u62e9\u4e86\u540d\u79f0<code class=\"literal\">accountno</code>\uff0c\u4f46\u662f\u8fd9\u548c\u8868<code class=\"literal\">bank</code>\u4e2d\u7684\u4e00\u4e2a\u5217\u540d\u76f8\u540c\u3002\u5728<code class=\"command\">UPDATE</code>\u547d\u4ee4\u4e2d\uff0c<code class=\"literal\">accountno</code>\u5f15\u7528\u5217<code class=\"literal\">bank.accountno</code>\uff0c\u56e0\u6b64 <code class=\"literal\">tf1.accountno</code>\u5fc5\u987b\u88ab\u7528\u6765\u5f15\u7528\u8be5\u53c2\u6570\u3002\u6211\u4eec\u5f53\u7136\u53ef\u4ee5\u901a\u8fc7\u4e3a\u8be5\u53c2\u6570\u4f7f\u7528\u4e00\u4e2a\u4e0d\u540c\u7684\u540d\u79f0\u6765\u907f\u514d\u8fd9\u6837\u7684\u95ee\u9898\u3002</p>\n<p lang=\"zh\">\u5b9e\u9645\u4e0a\u6211\u4eec\u53ef\u80fd\u559c\u6b22\u4ece\u8be5\u51fd\u6570\u5f97\u5230\u4e00\u4e2a\u66f4\u6709\u7528\u7684\u7ed3\u679c\u800c\u4e0d\u662f\u4e00\u4e2a\u5e38\u6570 1\uff0c\u56e0\u6b64\u4e00\u4e2a\u66f4\u53ef\u80fd\u7684\u5b9a\u4e49\u662f\uff1a</p>\n<pre class=\"programlisting\">CREATE FUNCTION tf1 (accountno integer, debit numeric) RETURNS numeric AS $$\n    UPDATE bank\n        SET balance = balance - debit\n        WHERE accountno = tf1.accountno;\n    SELECT balance FROM bank WHERE accountno = tf1.accountno;\n$$ LANGUAGE SQL;\n</pre>\n<p lang=\"zh\">\u5b83\u4f1a\u8c03\u6574\u4f59\u989d\u5e76\u4e14\u8fd4\u56de\u65b0\u7684\u4f59\u989d\u3002\u540c\u6837\u7684\u4e8b\u60c5\u4e5f\u53ef\u4ee5\u7528\u4e00\u4e2a\u4f7f\u7528<code class=\"literal\">RETURNING</code>\u7684\u547d\u4ee4\u5b9e\u73b0\uff1a</p>\n<pre class=\"programlisting\">CREATE FUNCTION tf1 (accountno integer, debit numeric) RETURNS numeric AS $$\n    UPDATE bank\n        SET balance = balance - debit\n        WHERE accountno = tf1.accountno\n    RETURNING balance;\n$$ LANGUAGE SQL;\n</pre>\n<p lang=\"zh\">\u5982\u679c\u5728<code class=\"literal\">SELECT</code>\u6216<code class=\"literal\">RETURNING</code>\u5b50\u53e5\u4e2d\uff0c<acronym class=\"acronym\">SQL</acronym>\u51fd\u6570\u7684\u6700\u7ec8\u8fd4\u56de\u503c\u7c7b\u578b\u4e0e\u51fd\u6570\u58f0\u660e\u7684\u7ed3\u679c\u7c7b\u578b\u4e0d\u5b8c\u5168\u5339\u914d\uff0c\u5982\u679c\u53ef\u4ee5\u4f7f\u7528\u9690\u5f0f\u6216\u8d4b\u503c\u8f6c\u6362\uff0c<span class=\"productname\">PostgreSQL</span>\u5c06\u81ea\u52a8\u5c06\u8be5\u503c\u8f6c\u6362\u4e3a\u6240\u9700\u7c7b\u578b\u3002\u5426\u5219\uff0c\u4f60\u5fc5\u987b\u5199\u51fa\u663e\u5f0f\u7c7b\u578b\u8f6c\u6362\u3002\u4f8b\u5982\uff0c\u5047\u8bbe\u6211\u4eec\u5e0c\u671b\u524d\u9762\u7684<code class=\"function\">add_em</code>\u51fd\u6570\u8fd4\u56de<code class=\"type\">float8</code>\u7c7b\u578b\u3002\u53ea\u9700\u7f16\u5199</p>\n<pre class=\"programlisting\">CREATE FUNCTION add_em(integer, integer) RETURNS float8 AS $$\n    SELECT $1 + $2;\n$$ LANGUAGE SQL;\n</pre>\n<p lang=\"zh\">\u56e0\u4e3a<code class=\"type\">integer</code>\u7684\u548c\u53ef\u4ee5\u9690\u5f0f\u8f6c\u6362\u4e3a<code class=\"type\">float8</code>\u3002\uff08\u6709\u5173\u8f6c\u6362\u7684\u66f4\u591a\u4fe1\u606f\uff0c\u8bf7\u53c2\u89c1<a class=\"xref\" href=\"/docs/15/typeconv.html\" title=\"\u7b2c\u00a010\u00a0\u7ae0\u00a0\u7c7b\u578b\u8f6c\u6362\">\u7b2c\u00a010\u00a0\u7ae0</a>\u6216<a class=\"xref\" href=\"/docs/15/sql-createcast.html\" title=\"CREATE CAST\"><span class=\"refentrytitle\">CREATE CAST</span></a>\u3002\uff09</p>\n</div>\n<div class=\"sect2\" id=\"XFUNC-SQL-COMPOSITE-FUNCTIONS\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/15/xfunc-sql.html#XFUNC-SQL-COMPOSITE-FUNCTIONS\">38.5.3. \u590d\u5408\u7c7b\u578b\u4e0a\u7684<acronym class=\"acronym\">SQL</acronym>\u51fd\u6570</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\">\u7f16\u5199\u63a5\u53d7\u590d\u5408\u7c7b\u578b\u53c2\u6570\u7684\u51fd\u6570\u65f6\uff0c\u6211\u4eec\u4e0d\u4ec5\u5fc5\u987b\u6307\u5b9a\u8981\u7528\u54ea\u4e2a\u53c2\u6570\uff0c\u8fd8\u5fc5\u987b\u6307\u5b9a\u8be5\u53c2\u6570\u7684\u54ea\u4e2a\u5c5e\u6027\uff08\u5b57\u6bb5\uff09\u3002\u4f8b\u5982\uff0c\u5047\u8bbe <code class=\"type\">emp</code> \u662f\u4e00\u4e2a\u5305\u542b\u96c7\u5458\u6570\u636e\u7684\u8868\uff0c\u56e0\u6b64\u5b83\u4e5f\u662f\u8be5\u8868\u6bcf\u4e00\u884c\u5bf9\u5e94\u7684\u590d\u5408\u7c7b\u578b\u540d\u79f0\u3002\u4e0b\u9762\u7684\u51fd\u6570 <code class=\"function\">double_salary</code> \u7528\u6765\u8ba1\u7b97\u67d0\u4eba\u7684\u5de5\u8d44\u7ffb\u500d\u540e\u4f1a\u662f\u591a\u5c11\uff1a</p>\n<pre class=\"screen\">CREATE TABLE emp (\n    name        text,\n    salary      numeric,\n    age         integer,\n    cubicle     point\n);\n\nINSERT INTO emp VALUES ('Bill', 4200, 45, '(2,1)');\n\nCREATE FUNCTION double_salary(emp) RETURNS numeric AS $$\n    SELECT $1.salary * 2 AS salary;\n$$ LANGUAGE SQL;\n\nSELECT name, double_salary(emp.*) AS dream\n    FROM emp\n    WHERE emp.cubicle ~= point '(2,1)';\n\n name | dream\n------+-------\n Bill |  8400\n</pre>\n<p lang=\"zh\">\u6ce8\u610f\u8fd9\u91cc\u7528 <code class=\"literal\">$1.salary</code> \u8bed\u6cd5\u6765\u9009\u53d6\u53c2\u6570\u884c\u503c\u4e2d\u7684\u4e00\u4e2a\u5b57\u6bb5\u3002\u8fd8\u8981\u6ce8\u610f\uff0c\u8c03\u7528\u65f6\u7684 <code class=\"command\">SELECT</code> \u547d\u4ee4\u4f7f\u7528 <em class=\"replaceable\"><code>table_name</code></em><code class=\"literal\">.*</code> \u5c06\u8868\u7684\u5f53\u524d\u6574\u884c\u53d6\u4f5c\u4e00\u4e2a\u590d\u5408\u503c\u3002\u8be5\u8868\u884c\u4e5f\u53ef\u4ee5\u4ec5\u7528\u8868\u540d\u6765\u5f15\u7528\uff1a</p>\n<pre class=\"screen\">SELECT name, double_salary(emp) AS dream\n    FROM emp\n    WHERE emp.cubicle ~= point '(2,1)';\n</pre>\n<p lang=\"zh\">\u4f46\u8fd9\u79cd\u7528\u6cd5\u5df2\u88ab\u5f03\u7528\uff0c\u56e0\u4e3a\u5b83\u5f88\u5bb9\u6613\u8ba9\u4eba\u6df7\u6dc6\uff08\u5173\u4e8e\u8868\u884c\u590d\u5408\u503c\u8fd9\u4e24\u79cd\u8bb0\u6cd5\u7684\u66f4\u591a\u7ec6\u8282\uff0c\u89c1<a class=\"xref\" href=\"/docs/15/rowtypes.html#ROWTYPES-USAGE\" title=\"8.16.5.\u00a0\u5728\u67e5\u8be2\u4e2d\u4f7f\u7528\u590d\u5408\u7c7b\u578b\">\u7b2c\u00a08.16.5\u00a0\u8282</a>\uff09\u3002</p>\n<p lang=\"zh\">\u6709\u65f6\u5019\u5373\u65f6\u6784\u9020\u4e00\u4e2a\u590d\u5408\u53c2\u6570\u503c\u4f1a\u5f88\u65b9\u4fbf\u3002\u8fd9\u53ef\u4ee5\u7528<code class=\"literal\">ROW</code>\u6784\u9020\u5668\u5b8c\u6210\u3002\u4f8b\u5982\uff0c\u6211\u4eec\u53ef\u4ee5\u8c03\u6574\u88ab\u4f20\u9012\u7ed9\u51fd\u6570\u7684\u6570\u636e\uff1a</p>\n<pre class=\"screen\">SELECT name, double_salary(ROW(name, salary*1.1, age, cubicle)) AS dream\n    FROM emp;\n</pre>\n<p lang=\"zh\">\u4e5f\u53ef\u4ee5\u6784\u5efa\u4e00\u4e2a\u8fd4\u56de\u590d\u5408\u7c7b\u578b\u7684\u51fd\u6570\u3002\u8fd9\u662f\u4e00\u4e2a\u8fd4\u56de\u5355\u4e00<code class=\"type\">emp</code>\u884c\u7684\u51fd\u6570\u793a\u4f8b\uff1a</p>\n<pre class=\"programlisting\">CREATE FUNCTION new_emp() RETURNS emp AS $$\n    SELECT text 'None' AS name,\n        1000.0 AS salary,\n        25 AS age,\n        point '(2,2)' AS cubicle;\n$$ LANGUAGE SQL;\n</pre>\n<p lang=\"zh\">\u5728\u8fd9\u4e2a\u793a\u4f8b\u4e2d\uff0c\u6211\u4eec\u4e3a\u6bcf\u4e00\u4e2a\u5c5e\u6027\u6307\u5b9a\u4e86\u4e00\u4e2a\u5e38\u91cf\u503c\uff0c\u4f46\u662f\u53ef\u4ee5\u7528\u4efb\u4f55\u8ba1\u7b97\u6765\u66ff\u6362\u8fd9\u4e9b\u5e38\u91cf\u3002</p>\n<p lang=\"zh\">\u5b9a\u4e49\u8be5\u51fd\u6570\u65f6\u6709\u4e24\u70b9\u91cd\u8981\u6ce8\u610f\u4e8b\u9879\uff1a</p>\n<div class=\"itemizedlist\">\n<ul class=\"itemizedlist\">\n<li class=\"listitem\" lang=\"zh\">\n<p>\u67e5\u8be2\u4e2d\u7684\u9009\u62e9\u5217\u8868\u987a\u5e8f\u5fc5\u987b\u4e0e\u5217\u5728\u590d\u5408\u7c7b\u578b\u4e2d\u51fa\u73b0\u7684\u987a\u5e8f\u5b8c\u5168\u76f8\u540c\u3002\uff08\u7cfb\u7edf\u4e0d\u8003\u8651\u50cf\u4e0a\u9762\u8fd9\u6837\u6307\u5b9a\u7684\u5217\u540d\u3002\uff09</p>\n</li>\n<li class=\"listitem\" lang=\"zh\">\n<p>\u6211\u4eec\u5fc5\u987b\u786e\u4fdd\u6bcf\u4e2a\u8868\u8fbe\u5f0f\u7684\u7c7b\u578b\u90fd\u53ef\u4ee5\u8f6c\u6362\u4e3a\u590d\u5408\u7c7b\u578b\u7684\u76f8\u5e94\u5217\u7684\u7c7b\u578b\u3002\u5426\u5219\u6211\u4eec\u4f1a\u5f97\u5230\u8fd9\u6837\u7684\u9519\u8bef\uff1a</p>\n<pre class=\"screen\">\n<code class=\"computeroutput\">\nERROR:  return type mismatch in function declared to return emp\nDETAIL:  Final statement returns text instead of point at column 4.\n</code>\n</pre>\n<p>\u4e0e\u57fa\u7840\u7c7b\u578b\u7684\u60c5\u51b5\u4e00\u6837\uff0c\u7cfb\u7edf\u4e0d\u4f1a\u81ea\u52a8\u63d2\u5165\u663e\u5f0f\u8f6c\u6362\uff0c\u53ea\u4f1a\u63d2\u5165\u9690\u5f0f\u6216\u8d4b\u503c\u8f6c\u6362\u3002</p>\n</li>\n</ul>\n</div>\n<p lang=\"zh\">\u5b9a\u4e49\u540c\u6837\u7684\u51fd\u6570\u7684\u4e00\u79cd\u4e0d\u540c\u7684\u65b9\u6cd5\u662f\uff1a</p>\n<pre class=\"programlisting\">CREATE FUNCTION new_emp() RETURNS emp AS $$\n    SELECT ROW('None', 1000.0, 25, '(2,2)')::emp;\n$$ LANGUAGE SQL;\n</pre>\n<p lang=\"zh\">\u8fd9\u91cc\u6211\u4eec\u5199\u4e86\u4e00\u4e2a\u53ea\u8fd4\u56de\u5355\u5217\u3001\u4e14\u8be5\u5217\u5177\u6709\u6b63\u786e\u590d\u5408\u7c7b\u578b\u7684 <code class=\"command\">SELECT</code>\u3002\u5728\u8fd9\u79cd\u573a\u666f\u4e0b\uff0c\u8fd9\u6837\u5199\u5e76\u4e0d\u89c1\u5f97\u66f4\u597d\uff0c\u4f46\u5728\u67d0\u4e9b\u60c5\u51b5\u4e0b\u4f1a\u5f88\u65b9\u4fbf \u2014 \u4f8b\u5982\uff0c\u9700\u8981\u901a\u8fc7\u8c03\u7528\u53e6\u4e00\u4e2a\u8fd4\u56de\u76ee\u6807\u590d\u5408\u503c\u7684\u51fd\u6570\u6765\u8ba1\u7b97\u7ed3\u679c\u65f6\u3002\u8fd8\u6709\u4e00\u79cd\u60c5\u51b5\u662f\uff0c\u5982\u679c\u6211\u4eec\u8981\u7f16\u5199\u7684\u51fd\u6570\u8fd4\u56de\u7684\u662f\u57fa\u4e8e\u590d\u5408\u7c7b\u578b\u7684\u57df\uff0c\u800c\u4e0d\u662f\u666e\u901a\u590d\u5408\u7c7b\u578b\uff0c\u90a3\u4e48\u5c31\u5fc5\u987b\u5199\u6210\u8fd4\u56de\u5355\u5217\u7684\u5f62\u5f0f\uff0c\u56e0\u4e3a\u6ca1\u6709\u529e\u6cd5\u8ba9\u6574\u884c\u7ed3\u679c\u53d1\u751f\u6240\u9700\u7684\u5f3a\u5236\u8f6c\u6362\u3002</p>\n<p lang=\"zh\">\u6211\u4eec\u65e2\u53ef\u4ee5\u628a\u8fd9\u4e2a\u51fd\u6570\u76f4\u63a5\u5f53\u4f5c\u503c\u8868\u8fbe\u5f0f\u8c03\u7528\uff1a</p>\n<pre class=\"screen\">SELECT new_emp();\n\n         new_emp\n--------------------------\n (None,1000.0,25,\"(2,2)\")\n</pre>\n<p lang=\"zh\">\u4e5f\u53ef\u4ee5\u628a\u5b83\u5f53\u4f5c\u8868\u51fd\u6570\u6765\u8c03\u7528\uff1a</p>\n<pre class=\"screen\">SELECT * FROM new_emp();\n\n name | salary | age | cubicle\n------+--------+-----+---------\n None | 1000.0 |  25 | (2,2)\n</pre>\n<p lang=\"zh\">\u7b2c\u4e8c\u79cd\u65b9\u5f0f\u4f1a\u5728<a class=\"xref\" href=\"/docs/15/xfunc-sql.html#XFUNC-SQL-TABLE-FUNCTIONS\" title=\"38.5.8.\u00a0SQL \u51fd\u6570\u4f5c\u4e3a\u8868\u6765\u6e90\">\u7b2c\u00a038.5.8\u00a0\u8282</a>\u4e2d\u8fdb\u4e00\u6b65\u8bf4\u660e\u3002</p>\n<p lang=\"zh\">\u5f53\u4f60\u4f7f\u7528\u8fd4\u56de\u590d\u5408\u7c7b\u578b\u7684\u51fd\u6570\u65f6\uff0c\u53ef\u80fd\u53ea\u9700\u8981\u53d6\u5176\u7ed3\u679c\u4e2d\u7684\u4e00\u4e2a\u5b57\u6bb5\uff08\u5c5e\u6027\uff09\u3002\u53ef\u4ee5\u4f7f\u7528\u4e0b\u9762\u8fd9\u6837\u7684\u8bed\u6cd5\uff1a</p>\n<pre class=\"screen\">SELECT (new_emp()).name;\n\n name\n------\n None\n</pre>\n<p lang=\"zh\">\u8fd9\u91cc\u9700\u8981\u989d\u5916\u7684\u62ec\u53f7\uff0c\u4ee5\u514d\u89e3\u6790\u5668\u4ea7\u751f\u6b67\u4e49\u3002\u5982\u679c\u4e0d\u52a0\u62ec\u53f7\uff0c\u7ed3\u679c\u4f1a\u662f\u8fd9\u6837\uff1a</p>\n<pre class=\"screen\">SELECT new_emp().name;\nERROR:  syntax error at or near \".\"\nLINE 1: SELECT new_emp().name;\n                        ^\n</pre>\n<p lang=\"zh\">\u53e6\u4e00\u79cd\u9009\u62e9\u662f\u4f7f\u7528\u51fd\u6570\u8bb0\u6cd5\u6765\u63d0\u53d6\u5c5e\u6027\uff1a</p>\n<pre class=\"screen\">SELECT name(new_emp());\n\n name\n------\n None\n</pre>\n<p lang=\"zh\">\u5982<a class=\"xref\" href=\"/docs/15/rowtypes.html#ROWTYPES-USAGE\" title=\"8.16.5.\u00a0\u5728\u67e5\u8be2\u4e2d\u4f7f\u7528\u590d\u5408\u7c7b\u578b\">\u7b2c\u00a08.16.5\u00a0\u8282</a>\u6240\u8ff0\uff0c\u5b57\u6bb5\u8bb0\u6cd5\u548c\u51fd\u6570\u8bb0\u6cd5\u662f\u7b49\u4ef7\u7684\u3002</p>\n<p lang=\"zh\">\u53e6\u4e00\u79cd\u4f7f\u7528\u51fd\u6570\u8fd4\u56de\u590d\u5408\u7c7b\u578b\u7684\u65b9\u6cd5\u662f\u5c06\u7ed3\u679c\u4f20\u9012\u7ed9\u53e6\u4e00\u4e2a\u63a5\u53d7\u6b63\u786e\u884c\u7c7b\u578b\u4f5c\u4e3a\u8f93\u5165\u7684\u51fd\u6570\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION getname(emp) RETURNS text AS $$\n    SELECT $1.name;\n$$ LANGUAGE SQL;\n\nSELECT getname(new_emp());\n getname\n---------\n None\n(1 row)\n</pre>\n</div>\n<div class=\"sect2\" id=\"XFUNC-OUTPUT-PARAMETERS\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/15/xfunc-sql.html#XFUNC-OUTPUT-PARAMETERS\">38.5.4. \u5e26\u6709\u8f93\u51fa\u53c2\u6570\u7684<acronym class=\"acronym\">SQL</acronym>\u51fd\u6570</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\">\u63cf\u8ff0\u51fd\u6570\u7ed3\u679c\u7684\u53e6\u4e00\u79cd\u65b9\u6cd5\u662f\u4f7f\u7528<em class=\"firstterm\">\u8f93\u51fa\u53c2\u6570</em>\uff0c\u4f8b\u5982\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION add_em (IN x int, IN y int, OUT sum int)\nAS 'SELECT x + y'\nLANGUAGE SQL;\n\nSELECT add_em(3,7);\n add_em\n--------\n     10\n(1 row)\n</pre>\n<p lang=\"zh\">\u8fd9\u4e0e<a class=\"xref\" href=\"/docs/15/xfunc-sql.html#XFUNC-SQL-BASE-FUNCTIONS\" title=\"38.5.2.\u00a0\u57fa\u7840\u7c7b\u578b\u4e0a\u7684SQL\u51fd\u6570\">\u7b2c\u00a038.5.2\u00a0\u8282</a>\u4e2d\u5c55\u793a\u7684 <code class=\"literal\">add_em</code> \u7248\u672c\u672c\u8d28\u4e0a\u5e76\u65e0\u4e0d\u540c\u3002\u8f93\u51fa\u53c2\u6570\u7684\u771f\u6b63\u4ef7\u503c\u5728\u4e8e\uff0c\u5b83\u4eec\u4e3a\u5b9a\u4e49\u8fd4\u56de\u591a\u5217\u7684\u51fd\u6570\u63d0\u4f9b\u4e86\u4e00\u79cd\u65b9\u4fbf\u7684\u65b9\u6cd5\u3002\u4f8b\u5982\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION sum_n_product (x int, y int, OUT sum int, OUT product int)\nAS 'SELECT x + y, x * y'\nLANGUAGE SQL;\n\n SELECT * FROM sum_n_product(11,42);\n sum | product\n-----+---------\n  53 |     462\n(1 row)\n</pre>\n<p lang=\"zh\">\u8fd9\u91cc\u672c\u8d28\u4e0a\u53d1\u751f\u7684\u4e8b\u60c5\u662f\uff1a\u6211\u4eec\u4e3a\u8be5\u51fd\u6570\u7684\u7ed3\u679c\u521b\u5efa\u4e86\u4e00\u4e2a\u533f\u540d\u590d\u5408\u7c7b\u578b\u3002\u4e0a\u9762\u7684\u793a\u4f8b\u4e0e\u4e0b\u9762\u8fd9\u79cd\u5199\u6cd5\u7684\u6700\u7ec8\u6548\u679c\u76f8\u540c\uff1a</p>\n<pre class=\"screen\">CREATE TYPE sum_prod AS (sum int, product int);\n\nCREATE FUNCTION sum_n_product (int, int) RETURNS sum_prod\nAS 'SELECT $1 + $2, $1 * $2'\nLANGUAGE SQL;\n</pre>\n<p lang=\"zh\">\u4f46\u901a\u5e38\u4e0d\u5fc5\u989d\u5916\u5b9a\u4e49\u4e00\u4e2a\u72ec\u7acb\u7684\u590d\u5408\u7c7b\u578b\u4f1a\u66f4\u65b9\u4fbf\u3002\u6ce8\u610f\uff0c\u9644\u5728\u8f93\u51fa\u53c2\u6570\u4e0a\u7684\u540d\u79f0\u5e76\u975e\u53ea\u662f\u88c5\u9970\uff0c\u5b83\u4eec\u51b3\u5b9a\u4e86\u8fd9\u4e2a\u533f\u540d\u590d\u5408\u7c7b\u578b\u7684\u5217\u540d\u3002\uff08\u5982\u679c\u7701\u7565\u8f93\u51fa\u53c2\u6570\u540d\u79f0\uff0c\u7cfb\u7edf\u4f1a\u81ea\u884c\u9009\u62e9\u4e00\u4e2a\u540d\u79f0\u3002\uff09</p>\n<p lang=\"zh\">\u5728\u4ece SQL \u8c03\u7528\u8fd9\u6837\u4e00\u4e2a\u51fd\u6570\u65f6\uff0c\u8f93\u51fa\u53c2\u6570\u4e0d\u4f1a\u88ab\u5305\u62ec\u5728\u8c03\u7528\u53c2\u6570\u5217\u8868\u4e2d\u3002\u8fd9\u662f\u56e0\u4e3a<span class=\"productname\">PostgreSQL</span>\u53ea\u8003\u8651\u8f93\u5165\u53c2\u6570\u6765\u5b9a\u4e49\u51fd\u6570\u7684\u8c03\u7528\u7b7e\u540d\u3002\u8fd9\u4e5f\u610f\u5473\u7740\u5728\u4e3a\u8bf8\u5982\u5220\u9664\u51fd\u6570\u7b49\u76ee\u7684\u5f15\u7528\u8be5\u51fd\u6570\u65f6\u53ea\u6709\u8f93\u5165\u53c2\u6570\u6709\u5173\u7cfb\u3002\u6211\u4eec\u53ef\u4ee5\u7528\u4e0b\u9762\u7684\u547d\u4ee4\u4e4b\u4e00\u5220\u9664\u4e0a\u8ff0\u51fd\u6570</p>\n<pre class=\"screen\">DROP FUNCTION sum_n_product (x int, y int, OUT sum int, OUT product int);\nDROP FUNCTION sum_n_product (int, int);\n</pre>\n<p lang=\"zh\">\u53c2\u6570\u53ef\u4ee5\u88ab\u6807\u8bb0\u4e3a<code class=\"literal\">IN</code>\uff08\u9ed8\u8ba4\uff09\u3001<code class=\"literal\">OUT</code>\u3001<code class=\"literal\">INOUT</code>\u6216\u8005<code class=\"literal\">VARIADIC</code>\u3002\u4e00\u4e2a<code class=\"literal\">INOUT</code>\u53c2\u6570\u65e2\u4f5c\u4e3a\u4e00\u4e2a\u8f93\u5165\u53c2\u6570\uff08\u8c03\u7528\u53c2\u6570\u5217\u8868\u7684\u4e00\u90e8\u5206\uff09\u53c8\u4f5c\u4e3a\u4e00\u4e2a\u8f93\u51fa\u53c2\u6570\uff08\u7ed3\u679c\u8bb0\u5f55\u7c7b\u578b\u7684\u4e00\u90e8\u5206\uff09\u3002<code class=\"literal\">VARIADIC</code>\u53c2\u6570\u662f\u8f93\u5165\u53c2\u6570\uff0c\u4f46\u88ab\u6309\u7167\u4e0b\u6587\u6240\u8ff0\u7279\u6b8a\u5bf9\u5f85\u3002</p>\n</div>\n<div class=\"sect2\" id=\"XFUNC-OUTPUT-PARAMETERS-PROC\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/15/xfunc-sql.html#XFUNC-OUTPUT-PARAMETERS-PROC\">38.5.5. \u5e26\u6709\u8f93\u51fa\u53c2\u6570\u7684<acronym class=\"acronym\">SQL</acronym>\u8fc7\u7a0b</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\">\u8fc7\u7a0b\u4e5f\u652f\u6301\u8f93\u51fa\u53c2\u6570\uff0c\u4f46\u662f\u5b83\u4eec\u7684\u5de5\u4f5c\u65b9\u5f0f\u4e0e\u51fd\u6570\u7565\u6709\u4e0d\u540c\u3002\u5728<code class=\"command\">CALL</code>\u547d\u4ee4\u4e2d\uff0c\u8f93\u51fa\u53c2\u6570\u5fc5\u987b\u5305\u62ec\u5728\u53c2\u6570\u5217\u8868\u4e2d\u3002\u4f8b\u5982\uff0c\u524d\u9762\u7684\u94f6\u884c\u8d26\u6237\u501f\u8bb0\u4f8b\u7a0b\u53ef\u4ee5\u50cf\u8fd9\u6837\u5199\uff1a</p>\n<pre class=\"programlisting\">CREATE PROCEDURE tp1 (accountno integer, debit numeric, OUT new_balance numeric) AS $$\n    UPDATE bank\n        SET balance = balance - debit\n        WHERE accountno = tp1.accountno\n    RETURNING balance;\n$$ LANGUAGE SQL;\n</pre>\n<p lang=\"zh\">\u8981\u8c03\u7528\u8fd9\u4e2a\u4f8b\u7a0b\uff0c\u5fc5\u987b\u5305\u62ec\u5339\u914d<code class=\"literal\">OUT</code>\u53c2\u6570\u7684\u53c2\u6570\u3002\u901a\u5e38\u5199\u6210<code class=\"literal\">NULL</code>\uff1a</p>\n<pre class=\"programlisting\">CALL tp1(17, 100.0, NULL);\n</pre>\n<p lang=\"zh\">\u5982\u679c\u4f60\u5199\u7684\u662f\u5176\u4ed6\u5185\u5bb9\uff0c\u5b83\u5fc5\u987b\u662f\u4e00\u4e2a\u80fd\u591f\u50cf\u8f93\u5165\u53c2\u6570\u90a3\u6837\u88ab\u9690\u5f0f\u5f3a\u5236\u8f6c\u6362\u6210\u8be5\u53c2\u6570\u58f0\u660e\u7c7b\u578b\u7684\u8868\u8fbe\u5f0f\u3002\u4e0d\u8fc7\u8981\u6ce8\u610f\uff0c\u8fd9\u6837\u7684\u8868\u8fbe\u5f0f\u4e0d\u4f1a\u88ab\u6c42\u503c\u3002</p>\n<p lang=\"zh\">\u5f53\u4ece<span class=\"application\">PL/pgSQL</span>\u8c03\u7528\u8fc7\u7a0b\u65f6\uff0c\u4f60\u4e0d\u80fd\u5199<code class=\"literal\">NULL</code>\uff0c\u800c\u5fc5\u987b\u5199\u4e00\u4e2a\u7528\u4e8e\u63a5\u6536\u8fc7\u7a0b\u8f93\u51fa\u7684\u53d8\u91cf\u3002\u8be6\u89c1<a class=\"xref\" href=\"/docs/15/plpgsql-control-structures.html#PLPGSQL-STATEMENTS-CALLING-PROCEDURE\" title=\"43.6.3.\u00a0\u8c03\u7528\u8fc7\u7a0b\">\u7b2c\u00a043.6.3\u00a0\u8282</a>\u3002</p>\n</div>\n<div class=\"sect2\" id=\"XFUNC-SQL-VARIADIC-FUNCTIONS\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/15/xfunc-sql.html#XFUNC-SQL-VARIADIC-FUNCTIONS\">38.5.6. \u5e26\u6709\u53ef\u53d8\u6570\u91cf\u53c2\u6570\u7684<acronym class=\"acronym\">SQL</acronym>\u51fd\u6570</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\"><acronym class=\"acronym\">SQL</acronym> \u51fd\u6570\u53ef\u4ee5\u88ab\u58f0\u660e\u4e3a\u63a5\u53d7\u53ef\u53d8\u6570\u91cf\u7684\u53c2\u6570\uff0c\u53ea\u8981\u6240\u6709<span class=\"quote\">\u201c<span class=\"quote\">\u53ef\u9009</span>\u201d</span>\u53c2\u6570\u90fd\u5c5e\u4e8e\u540c\u4e00\u79cd\u6570\u636e\u7c7b\u578b\u3002\u53ef\u9009\u53c2\u6570\u4f1a\u4ee5\u6570\u7ec4\u5f62\u5f0f\u4f20\u9012\u7ed9\u51fd\u6570\u3002\u5b9a\u4e49\u8fd9\u7c7b\u51fd\u6570\u65f6\uff0c\u9700\u8981\u628a\u6700\u540e\u4e00\u4e2a\u53c2\u6570\u6807\u8bb0\u4e3a <code class=\"literal\">VARIADIC</code>\uff1b\u8be5\u53c2\u6570\u5fc5\u987b\u88ab\u58f0\u660e\u4e3a\u6570\u7ec4\u7c7b\u578b\u3002\u4f8b\u5982\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION mleast(VARIADIC arr numeric[]) RETURNS numeric AS $$\n    SELECT min($1[i]) FROM generate_subscripts($1, 1) g(i);\n$$ LANGUAGE SQL;\n\nSELECT mleast(10, -1, 5, 4.4);\n mleast\n--------\n     -1\n(1 row)\n</pre>\n<p lang=\"zh\">\u5b9e\u9645\u4e0a\uff0c\u4f4d\u4e8e <code class=\"literal\">VARIADIC</code> \u4f4d\u7f6e\u53ca\u4e4b\u540e\u7684\u6240\u6709\u5b9e\u53c2\u90fd\u4f1a\u88ab\u6536\u96c6\u6210\u4e00\u4e2a\u4e00\u7ef4\u6570\u7ec4\uff0c\u5c31\u50cf\u4f60\u5199\u6210\u4e86\uff1a</p>\n<pre class=\"screen\">SELECT mleast(ARRAY[10, -1, 5, 4.4]);    -- doesn't work\n</pre>\n<p lang=\"zh\">\u4e0d\u8fc7\u4f60\u5b9e\u9645\u4e0a\u4e0d\u80fd\u8fd9\u6837\u5199\uff0c\u81f3\u5c11\u5b83\u4e0d\u4f1a\u5339\u914d\u8fd9\u4e2a\u51fd\u6570\u5b9a\u4e49\u3002\u88ab\u6807\u8bb0\u4e3a <code class=\"literal\">VARIADIC</code> \u7684\u53c2\u6570\u5339\u914d\u7684\u662f\u5176\u5143\u7d20\u7c7b\u578b\u51fa\u73b0\u4e00\u6b21\u6216\u591a\u6b21\uff0c\u800c\u4e0d\u662f\u5b83\u81ea\u8eab\u7684\u6570\u7ec4\u7c7b\u578b\u3002</p>\n<p lang=\"zh\">\u6709\u65f6\u5019\uff0c\u80fd\u591f\u628a\u4e00\u4e2a\u5df2\u7ecf\u6784\u9020\u597d\u7684\u6570\u7ec4\u4f20\u7ed9\u53ef\u53d8\u53c2\u6570\u51fd\u6570\u4f1a\u5f88\u6709\u7528\uff0c\u5c24\u5176\u662f\u5f53\u4e00\u4e2a\u53ef\u53d8\u53c2\u6570\u51fd\u6570\u60f3\u628a\u5b83\u7684\u6570\u7ec4\u53c2\u6570\u518d\u4f20\u7ed9\u53e6\u4e00\u4e2a\u51fd\u6570\u65f6\u3002\u6b64\u5916\uff0c\u5728\u5141\u8bb8\u4e0d\u53d7\u4fe1\u4efb\u7528\u6237\u521b\u5efa\u5bf9\u8c61\u7684\u6a21\u5f0f\u4e2d\u8c03\u7528\u53ef\u53d8\u53c2\u6570\u51fd\u6570\u65f6\uff0c\u8fd9\u662f\u552f\u4e00\u5b89\u5168\u7684\u65b9\u5f0f\uff0c\u89c1<a class=\"xref\" href=\"/docs/15/typeconv-func.html\" title=\"10.3.\u00a0\u51fd\u6570\">\u7b2c\u00a010.3\u00a0\u8282</a>\u3002\u4f60\u53ef\u4ee5\u5728\u8c03\u7528\u4e2d\u6307\u5b9a<code class=\"literal\">VARIADIC</code>\u6765\u505a\u5230\u8fd9\u4e00\u70b9\uff1a</p>\n<pre class=\"screen\">SELECT mleast(VARIADIC ARRAY[10, -1, 5, 4.4]);\n</pre>\n<p lang=\"zh\">\u8fd9\u6837\u4f1a\u963b\u6b62\u51fd\u6570\u7684\u53ef\u53d8\u53c2\u6570\u6309\u5176\u5143\u7d20\u7c7b\u578b\u5c55\u5f00\uff0c\u4ece\u800c\u8ba9\u6570\u7ec4\u5b9e\u53c2\u80fd\u591f\u6309\u5e38\u89c4\u65b9\u5f0f\u5339\u914d\u3002<code class=\"literal\">VARIADIC</code> \u53ea\u80fd\u9644\u52a0\u5728\u51fd\u6570\u8c03\u7528\u7684\u6700\u540e\u4e00\u4e2a\u5b9e\u53c2\u4e0a\u3002</p>\n<p lang=\"zh\">\u5728\u8c03\u7528\u4e2d\u6307\u5b9a<code class=\"literal\">VARIADIC</code>\u4e5f\u662f\u5411\u53ef\u53d8\u53c2\u6570\u51fd\u6570\u4f20\u9012\u7a7a\u6570\u7ec4\u7684\u552f\u4e00\u65b9\u5f0f\uff0c\u4f8b\u5982\uff1a</p>\n<pre class=\"screen\">SELECT mleast(VARIADIC ARRAY[]::numeric[]);\n</pre>\n<p lang=\"zh\">\u4ec5\u4ec5\u5199\u6210<code class=\"literal\">SELECT mleast()</code>\u662f\u884c\u4e0d\u901a\u7684\uff0c\u56e0\u4e3a\u53ef\u53d8\u53c2\u6570\u5fc5\u987b\u5339\u914d\u81f3\u5c11\u4e00\u4e2a\u5b9e\u53c2\u3002\uff08\u5982\u679c\u4f60\u5e0c\u671b\u5141\u8bb8\u8fd9\u79cd\u8c03\u7528\uff0c\u53ef\u4ee5\u518d\u5b9a\u4e49\u4e00\u4e2a\u540c\u540d\u4e14\u4e0d\u5e26\u53c2\u6570\u7684\u51fd\u6570<code class=\"literal\">mleast</code>\u3002\uff09</p>\n<p lang=\"zh\">\u4ece\u53ef\u53d8\u53c2\u6570\u6d3e\u751f\u51fa\u7684\u6570\u7ec4\u5143\u7d20\u53c2\u6570\u4f1a\u88ab\u89c6\u4e3a\u6ca1\u6709\u81ea\u5df1\u7684\u540d\u5b57\u3002\u8fd9\u610f\u5473\u7740\u9664\u975e\u4f60\u6307\u5b9a\u4e86 <code class=\"literal\">VARIADIC</code>\uff0c\u5426\u5219\u4e0d\u80fd\u4f7f\u7528\u547d\u540d\u53c2\u6570\u6765\u8c03\u7528\u53ef\u53d8\u53c2\u6570\u51fd\u6570\uff08<a class=\"xref\" href=\"/docs/15/sql-syntax-calling-funcs.html\" title=\"4.3.\u00a0\u8c03\u7528\u51fd\u6570\">\u7b2c\u00a04.3\u00a0\u8282</a>\uff09\u3002\u4f8b\u5982\uff0c\u4e0b\u9762\u7684\u8c03\u7528\u662f\u53ef\u884c\u7684\uff1a</p>\n<pre class=\"screen\">SELECT mleast(VARIADIC arr =&gt; ARRAY[10, -1, 5, 4.4]);\n</pre>\n<p lang=\"zh\">\u4f46\u8fd9\u4e9b\u5c31\u4e0d\u884c\uff1a</p>\n<pre class=\"screen\">SELECT mleast(arr =&gt; 10);\nSELECT mleast(arr =&gt; ARRAY[10, -1, 5, 4.4]);\n</pre>\n</div>\n<div class=\"sect2\" id=\"XFUNC-SQL-PARAMETER-DEFAULTS\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/15/xfunc-sql.html#XFUNC-SQL-PARAMETER-DEFAULTS\">38.5.7. \u5e26\u6709\u53c2\u6570\u9ed8\u8ba4\u503c\u7684<acronym class=\"acronym\">SQL</acronym>\u51fd\u6570</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\">\u51fd\u6570\u53ef\u4ee5\u88ab\u58f0\u660e\u4e3a\u5bf9\u4e00\u4e9b\u6216\u8005\u6240\u6709\u8f93\u5165\u53c2\u6570\u5177\u6709\u9ed8\u8ba4\u503c\u3002\u53ea\u8981\u8c03\u7528\u51fd\u6570\u65f6\u6ca1\u6709\u7ed9\u51fa\u8db3\u591f\u591a\u7684\u5b9e\u53c2\uff0c\u5c31\u4f1a\u63d2\u5165\u9ed8\u8ba4\u503c\u6765\u5f25\u8865\u7f3a\u5931\u7684\u5b9e\u53c2\u3002\u7531\u4e8e\u53c2\u6570\u53ea\u80fd\u4ece\u5b9e\u53c2\u5217\u8868\u7684\u5c3e\u90e8\u5f00\u59cb\u88ab\u7701\u7565\uff0c\u5728\u4e00\u4e2a\u6709\u9ed8\u8ba4\u503c\u7684\u53c2\u6570\u4e4b\u540e\u7684\u6240\u6709\u53c2\u6570\u90fd\u4e0d\u5f97\u4e0d\u4e5f\u5177\u6709\u9ed8\u8ba4\u503c\uff08\u5c3d\u7ba1\u4f7f\u7528\u547d\u540d\u53c2\u6570\u8bb0\u6cd5\u53ef\u4ee5\u5141\u8bb8\u653e\u677e\u8fd9\u79cd\u9650\u5236\uff0c\u8fd9\u79cd\u9650\u5236\u4ecd\u7136\u4f1a\u88ab\u5f3a\u5236\u4ee5\u4fbf\u4f4d\u7f6e\u53c2\u6570\u8bb0\u6cd5\u80fd\u5de5\u4f5c\uff09\u3002\u4e0d\u7ba1\u4f60\u662f\u5426\u4f7f\u7528\u5b83\uff0c\u8fd9\u79cd\u80fd\u529b\u90fd\u8981\u6c42\u5728\u67d0\u4e9b\u7528\u6237\u4e0d\u4fe1\u4efb\u5176\u4ed6\u7528\u6237\u7684\u6570\u636e\u5e93\u4e2d\u8c03\u7528\u51fd\u6570\u65f6\u91c7\u53d6\u4e00\u4e9b\u9884\u9632\u63aa\u65bd\uff0c\u89c1<a class=\"xref\" href=\"/docs/15/typeconv-func.html\" title=\"10.3.\u00a0\u51fd\u6570\">\u7b2c\u00a010.3\u00a0\u8282</a>\u3002</p>\n<p lang=\"zh\">\u4f8b\u5982\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION foo(a int, b int DEFAULT 2, c int DEFAULT 3)\nRETURNS int\nLANGUAGE SQL\nAS $$\n    SELECT $1 + $2 + $3;\n$$;\n\nSELECT foo(10, 20, 30);\n foo\n-----\n  60\n(1 row)\n\nSELECT foo(10, 20);\n foo\n-----\n  33\n(1 row)\n\nSELECT foo(10);\n foo\n-----\n  15\n(1 row)\n\nSELECT foo();  -- fails since there is no default for the first argument\nERROR:  function foo() does not exist\n</pre>\n<p lang=\"zh\">\u4e5f\u53ef\u4ee5\u7528 <code class=\"literal\">=</code> \u7b26\u53f7\u4ee3\u66ff\u5173\u952e\u5b57 <code class=\"literal\">DEFAULT</code>\u3002</p>\n</div>\n<div class=\"sect2\" id=\"XFUNC-SQL-TABLE-FUNCTIONS\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/15/xfunc-sql.html#XFUNC-SQL-TABLE-FUNCTIONS\">38.5.8. <acronym class=\"acronym\">SQL</acronym> \u51fd\u6570\u4f5c\u4e3a\u8868\u6765\u6e90</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\">\u6240\u6709\u7684 SQL \u51fd\u6570\u90fd\u53ef\u4ee5\u88ab\u7528\u5728\u67e5\u8be2\u7684<code class=\"literal\">FROM</code>\u5b50\u53e5\u4e2d\uff0c\u4f46\u662f\u5bf9\u4e8e\u8fd4\u56de\u590d\u5408\u7c7b\u578b\u7684\u51fd\u6570\u7279\u522b\u6709\u7528\u3002\u5982\u679c\u51fd\u6570\u88ab\u5b9a\u4e49\u4e3a\u8fd4\u56de\u4e00\u79cd\u57fa\u7840\u7c7b\u578b\uff0c\u8be5\u8868\u51fd\u6570\u4f1a\u4ea7\u751f\u4e00\u4e2a\u5355\u5217\u8868\u3002\u5982\u679c\u8be5\u51fd\u6570\u88ab\u5b9a\u4e49\u4e3a\u8fd4\u56de\u4e00\u79cd\u590d\u5408\u7c7b\u578b\uff0c\u8be5\u8868\u51fd\u6570\u4f1a\u4e3a\u8be5\u590d\u5408\u7c7b\u578b\u7684\u6bcf\u4e00\u4e2a\u5c5e\u6027\u4ea7\u751f\u4e00\u5217\u3002</p>\n<p lang=\"zh\">\u4ee5\u4e0b\u662f\u4e00\u4e2a\u793a\u4f8b\uff1a</p>\n<pre class=\"screen\">CREATE TABLE foo (fooid int, foosubid int, fooname text);\nINSERT INTO foo VALUES (1, 1, 'Joe');\nINSERT INTO foo VALUES (1, 2, 'Ed');\nINSERT INTO foo VALUES (2, 1, 'Mary');\n\nCREATE FUNCTION getfoo(int) RETURNS foo AS $$\n    SELECT * FROM foo WHERE fooid = $1;\n$$ LANGUAGE SQL;\n\nSELECT *, upper(fooname) FROM getfoo(1) AS t1;\n\n fooid | foosubid | fooname | upper\n-------+----------+---------+-------\n     1 |        1 | Joe     | JOE\n(1 row)\n</pre>\n<p lang=\"zh\">\u5982\u793a\u4f8b\u6240\u793a\uff0c\u6211\u4eec\u53ef\u4ee5\u50cf\u64cd\u4f5c\u666e\u901a\u8868\u7684\u5217\u4e00\u6837\u64cd\u4f5c\u51fd\u6570\u7ed3\u679c\u4e2d\u7684\u5217\u3002</p>\n<p lang=\"zh\">\u6ce8\u610f\u6211\u4eec\u53ea\u4ece\u51fd\u6570\u5f97\u5230\u4e86\u4e00\u884c\u3002\u8fd9\u662f\u56e0\u4e3a\u6211\u4eec\u6ca1\u6709\u4f7f\u7528<code class=\"literal\">SETOF</code>\u3002\u8fd9\u4f1a\u5728\u4e0b\u4e00\u8282\u4e2d\u4ecb\u7ecd\u3002</p>\n</div>\n<div class=\"sect2\" id=\"XFUNC-SQL-FUNCTIONS-RETURNING-SET\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/15/xfunc-sql.html#XFUNC-SQL-FUNCTIONS-RETURNING-SET\">38.5.9. \u8fd4\u56de\u96c6\u5408\u7684<acronym class=\"acronym\">SQL</acronym>\u51fd\u6570</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\">\u5f53\u4e00\u4e2a SQL \u51fd\u6570\u88ab\u58f0\u660e\u4e3a\u8fd4\u56de<code class=\"literal\">SETOF <em class=\"replaceable\"><code>sometype</code></em></code>\u65f6\uff0c\u8be5\u51fd\u6570\u7684\u6700\u540e\u4e00\u4e2a\u67e5\u8be2\u4f1a\u88ab\u6267\u884c\u5b8c\uff0c\u5e76\u4e14\u5b83\u8f93\u51fa\u7684\u6bcf\u4e00\u884c\u90fd\u4f1a\u88ab\u4f5c\u4e3a\u7ed3\u679c\u96c6\u7684\u4e00\u4e2a\u5143\u7d20\u8fd4\u56de\u3002</p>\n<p lang=\"zh\">\u8fd9\u4e00\u7279\u6027\u901a\u5e38\u662f\u5728\u67e5\u8be2\u7684 <code class=\"literal\">FROM</code> \u5b50\u53e5\u4e2d\u8c03\u7528\u51fd\u6570\u65f6\u4f7f\u7528\u7684\u3002\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b\uff0c\u51fd\u6570\u8fd4\u56de\u7684\u6bcf\u4e00\u884c\u90fd\u4f1a\u6210\u4e3a\u67e5\u8be2\u6240\u89c1\u8868\u4e2d\u7684\u4e00\u884c\u3002\u4f8b\u5982\uff0c\u5047\u8bbe\u8868 <code class=\"literal\">foo</code> \u4e0e\u4e0a\u6587\u76f8\u540c\uff0c\u6211\u4eec\u5199\uff1a</p>\n<pre class=\"programlisting\">CREATE FUNCTION getfoo(int) RETURNS SETOF foo AS $$\n    SELECT * FROM foo WHERE fooid = $1;\n$$ LANGUAGE SQL;\n\nSELECT * FROM getfoo(1) AS t1;\n</pre>\n<p lang=\"zh\">\u90a3\u4e48\u4f1a\u5f97\u5230\uff1a</p>\n<pre class=\"screen\"> fooid | foosubid | fooname\n-------+----------+---------\n     1 |        1 | Joe\n     1 |        2 | Ed\n(2 rows)\n</pre>\n<p lang=\"zh\">\u4e5f\u53ef\u4ee5\u901a\u8fc7\u8f93\u51fa\u53c2\u6570\u5b9a\u4e49\u7684\u5217\u6765\u8fd4\u56de\u591a\u884c\uff0c\u4f8b\u5982\uff1a</p>\n<pre class=\"programlisting\">CREATE TABLE tab (y int, z int);\nINSERT INTO tab VALUES (1, 2), (3, 4), (5, 6), (7, 8);\n\nCREATE FUNCTION sum_n_product_with_tab (x int, OUT sum int, OUT product int)\nRETURNS SETOF record\nAS $$\n    SELECT $1 + tab.y, $1 * tab.y FROM tab;\n$$ LANGUAGE SQL;\n\nSELECT * FROM sum_n_product_with_tab(10);\n sum | product\n-----+---------\n  11 |      10\n  13 |      30\n  15 |      50\n  17 |      70\n(4 rows)\n</pre>\n<p lang=\"zh\">\u8fd9\u91cc\u7684\u5173\u952e\u70b9\u662f\uff1a\u4f60\u5fc5\u987b\u5199\u6210 <code class=\"literal\">RETURNS SETOF record</code>\uff0c\u4ee5\u8868\u660e\u8be5\u51fd\u6570\u8fd4\u56de\u7684\u662f\u591a\u884c\u800c\u4e0d\u662f\u5355\u884c\u3002\u5982\u679c\u53ea\u6709\u4e00\u4e2a\u8f93\u51fa\u53c2\u6570\uff0c\u5219\u5199\u8be5\u53c2\u6570\u7684\u7c7b\u578b\uff0c\u800c\u4e0d\u662f <code class=\"type\">record</code>\u3002</p>\n<p lang=\"zh\">\u901a\u8fc7\u591a\u6b21\u8c03\u7528\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u6765\u6784\u9020\u67e5\u8be2\u7ed3\u679c\u901a\u5e38\u5f88\u6709\u7528\uff0c\u5176\u4e2d\u6bcf\u6b21\u8c03\u7528\u7684\u53c2\u6570\u90fd\u6765\u81ea\u8868\u6216\u5b50\u67e5\u8be2\u7684\u8fde\u7eed\u884c\u3002\u9996\u9009\u65b9\u5f0f\u662f\u4f7f\u7528 <code class=\"literal\">LATERAL</code> \u5173\u952e\u5b57\uff0c\u8be6\u89c1<a class=\"xref\" href=\"/docs/15/queries-table-expressions.html#QUERIES-LATERAL\" title=\"7.2.1.5.\u00a0LATERAL\u5b50\u67e5\u8be2\">\u7b2c\u00a07.2.1.5\u00a0\u8282</a>\u3002\u4e0b\u9762\u662f\u4e00\u4e2a\u4f7f\u7528\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u679a\u4e3e\u6811\u7ed3\u6784\u5143\u7d20\u7684\u793a\u4f8b\uff1a</p>\n<pre class=\"screen\">SELECT * FROM nodes;\n   name    | parent\n-----------+--------\n Top       |\n Child1    | Top\n Child2    | Top\n Child3    | Top\n SubChild1 | Child1\n SubChild2 | Child1\n(6 rows)\n\nCREATE FUNCTION listchildren(text) RETURNS SETOF text AS $$\n    SELECT name FROM nodes WHERE parent = $1\n$$ LANGUAGE SQL STABLE;\n\nSELECT * FROM listchildren('Top');\n listchildren\n--------------\n Child1\n Child2\n Child3\n(3 rows)\n\nSELECT name, child FROM nodes, LATERAL listchildren(name) AS child;\n  name  |   child\n--------+-----------\n Top    | Child1\n Top    | Child2\n Top    | Child3\n Child1 | SubChild1\n Child1 | SubChild2\n(5 rows)\n</pre>\n<p lang=\"zh\">\u8fd9\u4e2a\u4f8b\u5b50\u5e76\u6ca1\u6709\u505a\u51fa\u4efb\u4f55\u65e0\u6cd5\u7528\u7b80\u5355\u8fde\u63a5\u5b9e\u73b0\u7684\u4e8b\uff0c\u4f46\u5728\u66f4\u590d\u6742\u7684\u8ba1\u7b97\u4e2d\uff0c\u628a\u4e00\u90e8\u5206\u5de5\u4f5c\u653e\u8fdb\u51fd\u6570\u91cc\u901a\u5e38\u4f1a\u975e\u5e38\u65b9\u4fbf\u3002</p>\n<p lang=\"zh\">\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u4e5f\u53ef\u4ee5\u51fa\u73b0\u5728\u67e5\u8be2\u7684\u9009\u62e9\u5217\u8868\u4e2d\u3002\u5bf9\u4e8e\u67e5\u8be2\u672c\u8eab\u751f\u6210\u7684\u6bcf\u4e00\u884c\uff0c\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u90fd\u4f1a\u88ab\u8c03\u7528\uff0c\u5e76\u4e3a\u5176\u7ed3\u679c\u96c6\u4e2d\u7684\u6bcf\u4e00\u4e2a\u5143\u7d20\u751f\u6210\u4e00\u884c\u8f93\u51fa\u3002\u524d\u9762\u7684\u4f8b\u5b50\u4e5f\u53ef\u4ee5\u5199\u6210\u8fd9\u6837\uff1a</p>\n<pre class=\"screen\">SELECT listchildren('Top');\n listchildren\n--------------\n Child1\n Child2\n Child3\n(3 rows)\n\nSELECT name, listchildren(name) FROM nodes;\n  name  | listchildren\n--------+--------------\n Top    | Child1\n Top    | Child2\n Top    | Child3\n Child1 | SubChild1\n Child1 | SubChild2\n(5 rows)\n</pre>\n<p lang=\"zh\">\u5728\u6700\u540e\u4e00\u4e2a <code class=\"command\">SELECT</code> \u4e2d\uff0c\u6ce8\u610f\u6ca1\u6709\u4e3a <code class=\"literal\">Child2</code>\u3001<code class=\"literal\">Child3</code> \u7b49\u663e\u793a\u4efb\u4f55\u8f93\u51fa\u884c\u3002\u8fd9\u662f\u56e0\u4e3a <code class=\"function\">listchildren</code> \u5bf9\u8fd9\u4e9b\u53c2\u6570\u8fd4\u56de\u7684\u662f\u7a7a\u96c6\uff0c\u56e0\u6b64\u4e0d\u4f1a\u751f\u6210\u7ed3\u679c\u884c\u3002\u8fd9\u4e0e\u4f7f\u7528 <code class=\"literal\">LATERAL</code> \u8bed\u6cd5\u628a\u51fd\u6570\u7ed3\u679c\u505a\u5185\u8fde\u63a5\u65f6\u5f97\u5230\u7684\u884c\u4e3a\u76f8\u540c\u3002</p>\n<p lang=\"zh\"><span class=\"productname\">PostgreSQL</span>\u4e2d\uff0c\u5199\u5728\u67e5\u8be2\u7684\u9009\u62e9\u5217\u8868\u4e2d\u7684\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u7684\u884c\u4e3a\u51e0\u4e4e\u548c\u5199\u5728<code class=\"literal\">LATERAL FROM</code>\u5b50\u53e5\u9879\u4e2d\u7684\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u5b8c\u5168\u4e00\u6837\u3002\u4f8b\u5982\uff1a</p>\n<pre class=\"programlisting\">SELECT x, generate_series(1,5) AS g FROM tab;\n</pre>\n<p lang=\"zh\">\u51e0\u4e4e\u7b49\u6548\u4e8e</p>\n<pre class=\"programlisting\">SELECT x, g FROM tab, LATERAL generate_series(1,5) AS g;\n</pre>\n<p lang=\"zh\">\u8fd9\u4f1a\u662f\u5b8c\u5168\u4e00\u6837\u7684\uff0c\u9664\u4e86\u5728\u8fd9\u4e2a\u7279\u522b\u7684\u793a\u4f8b\u4e2d\uff0c\u89c4\u5212\u5668\u53ef\u4ee5\u9009\u62e9\u628a<code class=\"structname\">g</code>\u653e\u5728\u5d4c\u5957\u5faa\u73af\u8fde\u63a5\u7684\u5916\u4fa7\uff0c\u56e0\u4e3a<code class=\"structname\">g</code>\u5bf9<code class=\"structname\">tab</code>\u6ca1\u6709\u5b9e\u9645\u7684\u6a2a\u5411\u4f9d\u8d56\u3002\u90a3\u4f1a\u5bfc\u81f4\u4e00\u79cd\u4e0d\u540c\u7684\u8f93\u51fa\u884c\u987a\u5e8f\u3002\u9009\u62e9\u5217\u8868\u4e2d\u7684\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u603b\u662f\u4f1a\u88ab\u8ba1\u7b97\uff0c\u5c31\u597d\u50cf\u5b83\u4eec\u5728<code class=\"literal\">FROM</code>\u5b50\u53e5\u5269\u4f59\u90e8\u5206\u7684\u5d4c\u5957\u5faa\u73af\u8fde\u63a5\u7684\u5185\u4fa7\u4e00\u6837\uff0c\u56e0\u6b64\u5728\u8003\u8651\u6765\u81ea<code class=\"literal\">FROM</code>\u5b50\u53e5\u7684\u4e0b\u4e00\u884c\u4e4b\u524d\uff0c\u8fd9\u4e9b\u51fd\u6570\u4f1a\u8fd0\u884c\u5230\u5b8c\u6210\u3002</p>\n<p lang=\"zh\">\u5982\u679c\u5728\u67e5\u8be2\u7684\u9009\u62e9\u5217\u8868\u4e2d\u6709\u4e0d\u6b62\u4e00\u4e2a\u96c6\u5408\u8fd4\u56de\u51fd\u6570\uff0c\u5219\u884c\u4e3a\u7c7b\u4f3c\u4e8e\u628a\u90a3\u4e9b\u51fd\u6570\u653e\u5230\u4e00\u4e2a\u5355\u4e00\u7684<code class=\"literal\">LATERAL ROWS FROM( ... )</code> <code class=\"literal\">FROM</code>\u5b50\u53e5\u9879\u4e2d\u7684\u884c\u4e3a\u3002\u5bf9\u4e8e\u6765\u81ea\u5e95\u5c42\u67e5\u8be2\u7684\u6bcf\u4e00\u884c\uff0c\u90fd\u6709\u4e00\u4e2a\u7528\u5230\u6bcf\u4e2a\u51fd\u6570\u9996\u4e2a\u7ed3\u679c\u7684\u8f93\u51fa\u884c\uff0c\u7136\u540e\u662f\u4e00\u4e2a\u4f7f\u7528\u6bcf\u4e2a\u51fd\u6570\u7b2c\u4e8c\u4e2a\u7ed3\u679c\u7684\u8f93\u51fa\u884c\uff0c\u4ee5\u6b64\u7c7b\u63a8\u3002\u5982\u679c\u67d0\u4e9b\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u4ea7\u751f\u7684\u8f93\u51fa\u6bd4\u5176\u4ed6\u51fd\u6570\u5c11\uff0c\u4f1a\u7528\u7a7a\u503c\u4ee3\u66ff\u7f3a\u5931\u7684\u6570\u636e\uff0c\u56e0\u6b64\u4e3a\u4e00\u4e2a\u5e95\u5c42\u884c\u5f62\u6210\u7684\u603b\u884c\u6570\u7b49\u4e8e\u4ea7\u751f\u6700\u591a\u8f93\u51fa\u7684\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u7684\u8f93\u51fa\u884c\u6570\u3002\u56e0\u6b64\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u4f1a<span class=\"quote\">\u201c<span class=\"quote\">\u6b65\u8c03\u4e00\u81f4</span>\u201d</span>\u5730\u8fd0\u884c\u76f4\u5230\u5b83\u4eec\u7684\u8f93\u51fa\u88ab\u8017\u5c3d\uff0c\u7136\u540e\u7528\u4e0b\u4e00\u4e2a\u5e95\u5c42\u884c\u7ee7\u7eed\u6267\u884c\u3002</p>\n<p lang=\"zh\">\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u53ef\u4ee5\u88ab\u5d4c\u5957\u5728\u4e00\u4e2a\u9009\u62e9\u5217\u8868\u4e2d\uff0c\u4e0d\u8fc7\u5728<code class=\"literal\">FROM</code>\u5b50\u53e5\u9879\u4e2d\u4e0d\u5141\u8bb8\u8fd9\u6837\u505a\u3002\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b\uff0c\u5d4c\u5957\u7684\u6bcf\u4e00\u5c42\u4f1a\u88ab\u5355\u72ec\u5bf9\u5f85\uff0c\u5c31\u50cf\u5b83\u662f\u4e00\u4e2a\u5355\u72ec\u7684<code class=\"literal\">LATERAL ROWS FROM( ... )</code>\u9879\u4e00\u6837\u3002\u4f8b\u5982\uff0c\u5728</p>\n<pre class=\"programlisting\">SELECT srf1(srf2(x), srf3(y)), srf4(srf5(z)) FROM tab;\n</pre>\n<p lang=\"zh\">\u4e2d\uff0c\u96c6\u5408\u8fd4\u56de\u51fd\u6570<code class=\"function\">srf2</code>\u3001<code class=\"function\">srf3</code>\u548c<code class=\"function\">srf5</code>\u5c06\u4e3a<code class=\"structname\">tab</code>\u7684\u6bcf\u4e00\u884c\u6b65\u8c03\u4e00\u81f4\u5730\u8fd0\u884c\uff0c\u7136\u540e\u4f1a\u5bf9\u8f83\u4f4e\u5c42\u7684\u51fd\u6570\u4ea7\u751f\u7684\u6bcf\u4e00\u884c\u4ee5\u6b65\u8c03\u4e00\u81f4\u7684\u5f62\u5f0f\u5e94\u7528<code class=\"function\">srf1</code>\u548c<code class=\"function\">srf4</code>\u3002</p>\n<p lang=\"zh\">\u5728<code class=\"literal\">CASE</code>\u6216<code class=\"literal\">COALESCE</code>\u8fd9\u6837\u7684\u6761\u4ef6\u8ba1\u7b97\u7ed3\u6784\u4e2d\uff0c\u4e0d\u80fd\u4f7f\u7528\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u3002\u4f8b\u5982\uff0c\u8003\u8651</p>\n<pre class=\"programlisting\">SELECT x, CASE WHEN x &gt; 0 THEN generate_series(1, 5) ELSE 0 END FROM tab;\n</pre>\n<p lang=\"zh\">\u8868\u9762\u4e0a\u770b\uff0c\u8fd9\u5e94\u5f53\u8ba9 x &gt; 0 \u7684\u8f93\u5165\u884c\u91cd\u590d\u4e94\u6b21\uff0c\u5176\u4f59\u884c\u53ea\u51fa\u73b0\u4e00\u6b21\uff1b\u4f46\u5b9e\u9645\u4e0a\uff0cgenerate_series(1, 5) \u4f1a\u5728 CASE \u8868\u8fbe\u5f0f\u6c42\u503c\u4e4b\u524d\uff0c\u4f5c\u4e3a\u9690\u5f0f LATERAL FROM \u9879\u6267\u884c\uff0c\u56e0\u6b64\u6bcf\u4e2a\u8f93\u5165\u884c\u90fd\u4f1a\u91cd\u590d\u4e94\u6b21\u3002\u4e3a\u907f\u514d\u6df7\u6dc6\uff0c\u6b64\u7c7b\u5199\u6cd5\u4f1a\u5728\u89e3\u6790\u9636\u6bb5\u62a5\u9519\u3002</p>\n<div class=\"note\">\n<h3 class=\"title\" lang=\"zh\">\u6ce8\u610f</h3>\n<p lang=\"zh\">\u5982\u679c\u4e00\u4e2a\u51fd\u6570\u7684\u6700\u540e\u4e00\u6761\u547d\u4ee4\u662f <code class=\"command\">INSERT</code>\u3001<code class=\"command\">UPDATE</code> \u6216 <code class=\"command\">DELETE</code> \u5e76\u5e26\u6709 <code class=\"literal\">RETURNING</code>\uff0c\u90a3\u4e48\u5373\u4f7f\u8be5\u51fd\u6570\u6ca1\u6709\u58f0\u660e\u4e3a <code class=\"literal\">SETOF</code>\uff0c\u6216\u8005\u8c03\u7528\u5b83\u7684\u67e5\u8be2\u5e76\u672a\u53d6\u8d70\u5168\u90e8\u7ed3\u679c\u884c\uff0c\u8be5\u547d\u4ee4\u4e5f\u603b\u4f1a\u6267\u884c\u5230\u5b8c\u6210\u3002<code class=\"literal\">RETURNING</code> \u5b50\u53e5\u4ea7\u751f\u7684\u989d\u5916\u7ed3\u679c\u884c\u4f1a\u88ab\u9759\u9ed8\u4e22\u5f03\uff0c\u4f46\u76f8\u5e94\u7684\u8868\u4fee\u6539\u4ecd\u7136\u4f1a\u53d1\u751f\uff0c\u5e76\u4e14\u4f1a\u5728\u51fd\u6570\u8fd4\u56de\u524d\u5168\u90e8\u5b8c\u6210\u3002</p>\n</div>\n<div class=\"note\">\n<h3 class=\"title\" lang=\"zh\">\u6ce8\u610f</h3>\n<p lang=\"zh\">\u5728 <span class=\"productname\">PostgreSQL</span> 10 \u4e4b\u524d\uff0c\u9664\u975e\u591a\u4e2a\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u59cb\u7ec8\u4ea7\u751f\u76f8\u540c\u6570\u91cf\u7684\u884c\uff0c\u5426\u5219\u628a\u5b83\u4eec\u653e\u5728\u540c\u4e00\u4e2a\u9009\u62e9\u5217\u8868\u4e2d\u7684\u884c\u4e3a\u5e76\u4e0d\u5408\u7406\u3002\u5426\u5219\uff0c\u5f97\u5230\u7684\u8f93\u51fa\u884c\u6570\u4f1a\u662f\u8fd9\u4e9b\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u5404\u81ea\u4ea7\u751f\u884c\u6570\u7684\u6700\u5c0f\u516c\u500d\u6570\u3002\u6b64\u5916\uff0c\u5d4c\u5957\u7684\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u4e5f\u4e0d\u50cf\u4e0a\u6587\u6240\u63cf\u8ff0\u7684\u90a3\u6837\u5de5\u4f5c\uff1b\u76f8\u53cd\uff0c\u4e00\u4e2a\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u81f3\u591a\u53ea\u80fd\u6709\u4e00\u4e2a\u96c6\u5408\u8fd4\u56de\u53c2\u6570\uff0c\u5e76\u4e14\u6bcf\u4e00\u7ec4\u5d4c\u5957\u7684\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u90fd\u4f1a\u72ec\u7acb\u8fd0\u884c\u3002\u518d\u52a0\u4e0a\u8fc7\u53bb\u8fd8\u5141\u8bb8\u6761\u4ef6\u6267\u884c\uff08\u5373\u5728 <code class=\"literal\">CASE</code> \u7b49\u7ed3\u6784\u5185\u90e8\u4f7f\u7528\u96c6\u5408\u8fd4\u56de\u51fd\u6570\uff09\uff0c\u4e8b\u60c5\u5c31\u66f4\u52a0\u590d\u6742\u4e86\u3002\u5982\u679c\u4f60\u8981\u7f16\u5199\u9700\u8981\u5728\u65e7\u7248 <span class=\"productname\">PostgreSQL</span> \u4e0a\u8fd0\u884c\u7684\u67e5\u8be2\uff0c\u5efa\u8bae\u4f7f\u7528 <code class=\"literal\">LATERAL</code> \u8bed\u6cd5\uff0c\u56e0\u4e3a\u8fd9\u6837\u5728\u4e0d\u540c\u7248\u672c\u4e4b\u95f4\u80fd\u591f\u5f97\u5230\u4e00\u81f4\u7684\u7ed3\u679c\u3002\u5982\u679c\u4f60\u7684\u67e5\u8be2\u4f9d\u8d56\u4e8e\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u7684\u6761\u4ef6\u6267\u884c\uff0c\u6216\u8bb8\u53ef\u4ee5\u628a\u6761\u4ef6\u5224\u65ad\u79fb\u52a8\u5230\u81ea\u5b9a\u4e49\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u5185\u90e8\u6765\u4fee\u590d\u3002\u4f8b\u5982\uff0c</p>\n<pre class=\"programlisting\">SELECT x, CASE WHEN y &gt; 0 THEN generate_series(1, z) ELSE 5 END FROM tab;\n</pre>\n<p lang=\"zh\">\u53ef\u4ee5\u53d8\u6210</p>\n<pre class=\"programlisting\">CREATE FUNCTION case_generate_series(cond bool, start int, fin int, els int)\n  RETURNS SETOF int AS $$\nBEGIN\n  IF cond THEN\n    RETURN QUERY SELECT generate_series(start, fin);\n  ELSE\n    RETURN QUERY SELECT els;\n  END IF;\nEND$$ LANGUAGE plpgsql;\n\nSELECT x, case_generate_series(y &gt; 0, 1, z, 5) FROM tab;\n</pre>\n<p lang=\"zh\">\u8fd9\u79cd\u5199\u6cd5\u5728\u6240\u6709\u7248\u672c\u7684 <span class=\"productname\">PostgreSQL</span> \u4e2d\u7684\u884c\u4e3a\u90fd\u76f8\u540c\u3002</p>\n</div>\n</div>\n<div class=\"sect2\" id=\"XFUNC-SQL-FUNCTIONS-RETURNING-TABLE\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/15/xfunc-sql.html#XFUNC-SQL-FUNCTIONS-RETURNING-TABLE\">38.5.10. \u8fd4\u56de<code class=\"literal\">TABLE</code>\u7684<acronym class=\"acronym\">SQL</acronym>\u51fd\u6570</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\">\u8fd8\u6709\u53e6\u4e00\u79cd\u65b9\u6cd5\u53ef\u4ee5\u628a\u51fd\u6570\u58f0\u660e\u4e3a\u8fd4\u56de\u4e00\u4e2a\u96c6\u5408\uff0c\u5373\u4f7f\u7528 <code class=\"literal\">RETURNS TABLE(<em class=\"replaceable\"><code>columns</code></em>)</code>\u8bed\u6cd5\u3002\u8fd9\u7b49\u6548\u4e8e\u4f7f\u7528\u4e00\u4e2a\u6216\u8005\u591a\u4e2a<code class=\"literal\">OUT</code>\u53c2\u6570\u5916\u52a0\u628a\u51fd\u6570\u6807\u8bb0\u4e3a\u8fd4\u56de <code class=\"literal\">SETOF record</code>\uff08\u6216\u8005\u662f<code class=\"literal\">SETOF</code>\u5355\u4e2a\u8f93\u51fa\u53c2\u6570\u7684\u7c7b\u578b\uff09\u3002\u8fd9\u79cd\u5199\u6cd5\u662f\u5728\u6700\u8fd1\u7684 SQL \u6807\u51c6\u4e2d\u6307\u5b9a\u7684\uff0c\u56e0\u6b64\u53ef\u80fd\u6bd4\u4f7f\u7528 <code class=\"literal\">SETOF</code>\u7684\u79fb\u690d\u6027\u66f4\u597d\u3002</p>\n<p lang=\"zh\">\u4f8b\u5982\uff0c\u524d\u9762\u7684\u6c42\u548c\u5e76\u4e14\u76f8\u4e58\u7684\u793a\u4f8b\u4e5f\u53ef\u4ee5\u8fd9\u6837\u6765\u505a\uff1a</p>\n<pre class=\"programlisting\">CREATE FUNCTION sum_n_product_with_tab (x int)\nRETURNS TABLE(sum int, product int) AS $$\n    SELECT $1 + tab.y, $1 * tab.y FROM tab;\n$$ LANGUAGE SQL;\n</pre>\n<p lang=\"zh\">\u4e0d\u5141\u8bb8\u628a\u663e\u5f0f\u7684<code class=\"literal\">OUT</code>\u6216\u8005<code class=\"literal\">INOUT</code>\u53c2\u6570\u7528\u4e8e <code class=\"literal\">RETURNS TABLE</code>\u8bb0\u6cd5 \u2014 \u5fc5\u987b\u628a\u6240\u6709\u8f93\u51fa\u5217\u653e\u5728 <code class=\"literal\">TABLE</code>\u5217\u8868\u4e2d\u3002</p>\n</div>\n<div class=\"sect2\" id=\"XFUNC-SQL-POLYMORPHIC-FUNCTIONS\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/15/xfunc-sql.html#XFUNC-SQL-POLYMORPHIC-FUNCTIONS\">38.5.11. \u591a\u6001<acronym class=\"acronym\">SQL</acronym>\u51fd\u6570</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\"><acronym class=\"acronym\">SQL</acronym> \u51fd\u6570\u53ef\u4ee5\u88ab\u58f0\u660e\u4e3a\u63a5\u53d7\u5e76\u8fd4\u56de<a class=\"xref\" href=\"/docs/15/extend-type-system.html#EXTEND-TYPES-POLYMORPHIC\" title=\"38.2.5.\u00a0\u591a\u6001\u7c7b\u578b\">\u7b2c\u00a038.2.5\u00a0\u8282</a>\u4e2d\u63cf\u8ff0\u7684\u591a\u6001\u7c7b\u578b\u3002\u4e0b\u9762\u8fd9\u4e2a\u591a\u6001\u51fd\u6570 <code class=\"function\">make_array</code> \u4f1a\u6839\u636e\u4e24\u4e2a\u4efb\u610f\u6570\u636e\u7c7b\u578b\u7684\u5143\u7d20\u6784\u9020\u4e00\u4e2a\u6570\u7ec4\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION make_array(anyelement, anyelement) RETURNS anyarray AS $$\n    SELECT ARRAY[$1, $2];\n$$ LANGUAGE SQL;\n\nSELECT make_array(1, 2) AS intarray, make_array('a'::text, 'b') AS textarray;\n intarray | textarray\n----------+-----------\n {1,2}    | {a,b}\n(1 row)\n</pre>\n<p lang=\"zh\">\u6ce8\u610f\u7c7b\u578b\u8f6c\u6362<code class=\"literal\">'a'::text</code>\u7684\u4f7f\u7528\u662f\u4e3a\u4e86\u6307\u5b9a\u8be5\u53c2\u6570\u7684\u7c7b\u578b\u662f<code class=\"type\">text</code>\u3002\u5982\u679c\u8be5\u53c2\u6570\u53ea\u662f\u4e00\u4e2a\u5b57\u7b26\u4e32\u5b57\u9762\u91cf\uff0c\u8fd9\u5c31\u662f\u5fc5\u987b\u7684\uff0c\u56e0\u4e3a\u5426\u5219\u5b83\u4f1a\u88ab\u5f53\u4f5c<code class=\"type\">unknown</code>\u7c7b\u578b\uff0c\u5e76\u4e14 <code class=\"type\">unknown</code>\u7684\u6570\u7ec4\u4e5f\u4e0d\u662f\u4e00\u79cd\u5408\u6cd5\u7684\u7c7b\u578b\u3002\u5982\u679c\u6ca1\u6709\u8be5\u7c7b\u578b\u8f6c\u6362\uff0c\u5c06\u5f97\u5230\u8fd9\u6837\u7684\u9519\u8bef\uff1a</p>\n<pre class=\"screen\">ERROR:  could not determine polymorphic type because input has type unknown\n</pre>\n<p lang=\"zh\">\u6309\u7167\u4e0a\u9762\u7684\u65b9\u5f0f\u58f0\u660e <code class=\"function\">make_array</code> \u65f6\uff0c\u4f60\u5fc5\u987b\u63d0\u4f9b\u4e24\u4e2a\u6570\u636e\u7c7b\u578b\u5b8c\u5168\u76f8\u540c\u7684\u53c2\u6570\uff1b\u7cfb\u7edf\u4e0d\u4f1a\u5c1d\u8bd5\u89e3\u51b3\u5b83\u4eec\u4e4b\u95f4\u7684\u7c7b\u578b\u5dee\u5f02\u3002\u4f8b\u5982\uff0c\u4e0b\u9762\u8fd9\u6837\u662f\u4e0d\u884c\u7684\uff1a</p>\n<pre class=\"screen\">SELECT make_array(1, 2.5) AS numericarray;\nERROR:  function make_array(integer, numeric) does not exist\n</pre>\n<p lang=\"zh\">\u53e6\u4e00\u79cd\u65b9\u6cd5\u662f\u4f7f\u7528<span class=\"quote\">\u201c<span class=\"quote\">common</span>\u201d</span>\u8fd9\u4e00\u65cf\u591a\u6001\u7c7b\u578b\uff0c\u5b83\u5141\u8bb8\u7cfb\u7edf\u5c1d\u8bd5\u8bc6\u522b\u4e00\u4e2a\u5408\u9002\u7684\u516c\u5171\u7c7b\u578b\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION make_array2(anycompatible, anycompatible)\nRETURNS anycompatiblearray AS $$\n    SELECT ARRAY[$1, $2];\n$$ LANGUAGE SQL;\n\nSELECT make_array2(1, 2.5) AS numericarray;\n numericarray\n--------------\n {1,2.5}\n(1 row)\n</pre>\n<p lang=\"zh\">\u7531\u4e8e\u516c\u5171\u7c7b\u578b\u89e3\u6790\u89c4\u5219\u5728\u6240\u6709\u8f93\u5165\u90fd\u662f\u672a\u77e5\u7c7b\u578b\u65f6\u9ed8\u8ba4\u9009\u62e9 <code class=\"type\">text</code>\uff0c\u6240\u4ee5\u4e0b\u9762\u7684\u5199\u6cd5\u4e5f\u80fd\u5de5\u4f5c\uff1a</p>\n<pre class=\"screen\">SELECT make_array2('a', 'b') AS textarray;\n textarray\n-----------\n {a,b}\n(1 row)\n</pre>\n<p lang=\"zh\">\u5141\u8bb8\u5b58\u5728\u5177\u6709\u56fa\u5b9a\u8fd4\u56de\u7c7b\u578b\u7684\u591a\u6001\u53c2\u6570\uff0c\u4f46\u53cd\u8fc7\u6765\u5219\u4e0d\u5141\u8bb8\u3002\u4f8b\u5982\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION is_greater(anyelement, anyelement) RETURNS boolean AS $$\n    SELECT $1 &gt; $2;\n$$ LANGUAGE SQL;\n\nSELECT is_greater(1, 2);\n is_greater\n------------\n f\n(1 row)\n\nCREATE FUNCTION invalid_func() RETURNS anyelement AS $$\n    SELECT 1;\n$$ LANGUAGE SQL;\nERROR:  cannot determine result data type\nDETAIL:  A result of type anyelement requires at least one input of type anyelement, anyarray, anynonarray, anyenum, or anyrange.\n</pre>\n<p lang=\"zh\">\u591a\u6001\u4e5f\u53ef\u4ee5\u548c\u5e26\u8f93\u51fa\u53c2\u6570\u7684\u51fd\u6570\u4e00\u8d77\u4f7f\u7528\u3002\u4f8b\u5982\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION dup (f1 anyelement, OUT f2 anyelement, OUT f3 anyarray)\nAS 'select $1, array[$1,$1]' LANGUAGE SQL;\n\nSELECT * FROM dup(22);\n f2 |   f3\n----+---------\n 22 | {22,22}\n(1 row)\n</pre>\n<p lang=\"zh\">\u591a\u6001\u4e5f\u53ef\u4ee5\u7528\u4e8e\u53ef\u53d8\u53c2\u6570\u51fd\u6570\u3002\u4f8b\u5982\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION anyleast (VARIADIC anyarray) RETURNS anyelement AS $$\n    SELECT min($1[i]) FROM generate_subscripts($1, 1) g(i);\n$$ LANGUAGE SQL;\n\nSELECT anyleast(10, -1, 5, 4);\n anyleast\n----------\n       -1\n(1 row)\n\nSELECT anyleast('abc'::text, 'def');\n anyleast\n----------\n abc\n(1 row)\n\nCREATE FUNCTION concat_values(text, VARIADIC anyarray) RETURNS text AS $$\n    SELECT array_to_string($2, $1);\n$$ LANGUAGE SQL;\n\nSELECT concat_values('|', 1, 4, 2);\n concat_values\n---------------\n 1|4|2\n(1 row)\n</pre>\n</div>\n<div class=\"sect2\" id=\"id-1.8.3.8.21\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/15/xfunc-sql.html#XFUNC-SQL-COLLATIONS\">38.5.12. \u5e26\u6709\u6392\u5e8f\u89c4\u5219\u7684<acronym class=\"acronym\">SQL</acronym>\u51fd\u6570</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\">\u5f53\u4e00\u4e2a SQL \u51fd\u6570\u6709\u4e00\u4e2a\u6216\u591a\u4e2a\u652f\u6301\u6392\u5e8f\u89c4\u5219\u7684\u6570\u636e\u7c7b\u578b\u53c2\u6570\u65f6\uff0c\u4f1a\u6309<a class=\"xref\" href=\"/docs/15/collation.html\" title=\"24.2.\u00a0\u6392\u5e8f\u89c4\u5219\u652f\u6301\">\u7b2c\u00a024.2\u00a0\u8282</a>\u4e2d\u7684\u8bf4\u660e\uff0c\u6839\u636e\u5206\u914d\u7ed9\u5b9e\u53c2\u7684\u6392\u5e8f\u89c4\u5219\uff0c\u4e3a\u6bcf\u6b21\u51fd\u6570\u8c03\u7528\u786e\u5b9a\u4e00\u4e2a\u6392\u5e8f\u89c4\u5219\u3002\u5982\u679c\u80fd\u591f\u6210\u529f\u786e\u5b9a\uff08\u4e5f\u5c31\u662f\u8bf4\uff0c\u53c2\u6570\u4e4b\u95f4\u4e0d\u5b58\u5728\u9690\u5f0f\u6392\u5e8f\u89c4\u5219\u51b2\u7a81\uff09\uff0c\u90a3\u4e48\u6240\u6709\u652f\u6301\u6392\u5e8f\u89c4\u5219\u7684\u53c2\u6570\u90fd\u4f1a\u88ab\u89c6\u4e3a\u9690\u5f0f\u5e26\u6709\u8be5\u6392\u5e8f\u89c4\u5219\u3002\u8fd9\u4f1a\u5f71\u54cd\u51fd\u6570\u4e2d\u5bf9\u6392\u5e8f\u89c4\u5219\u654f\u611f\u7684\u64cd\u4f5c\u7684\u884c\u4e3a\u3002\u4f8b\u5982\uff0c\u4f7f\u7528\u4e0a\u6587\u7684 <code class=\"function\">anyleast</code> \u51fd\u6570\u65f6\uff0c</p>\n<pre class=\"programlisting\">SELECT anyleast('abc'::text, 'ABC');\n</pre>\n<p lang=\"zh\">\u5176\u7ed3\u679c\u5c06\u53d6\u51b3\u4e8e\u6570\u636e\u5e93\u7684\u9ed8\u8ba4\u6392\u5e8f\u89c4\u5219\u3002\u5728 <code class=\"literal\">C</code> \u533a\u57df\u8bbe\u7f6e\u4e0b\uff0c\u7ed3\u679c\u4f1a\u662f <code class=\"literal\">ABC</code>\uff0c\u4f46\u5728\u8bb8\u591a\u5176\u4ed6\u533a\u57df\u8bbe\u7f6e\u4e0b\u5219\u4f1a\u662f <code class=\"literal\">abc</code>\u3002\u53ef\u4ee5\u5728\u4efb\u610f\u53c2\u6570\u4e0a\u6dfb\u52a0 <code class=\"literal\">COLLATE</code> \u5b50\u53e5\u6765\u5f3a\u5236\u6307\u5b9a\u8981\u4f7f\u7528\u7684\u6392\u5e8f\u89c4\u5219\uff0c\u4f8b\u5982\uff1a</p>\n<pre class=\"programlisting\">SELECT anyleast('abc'::text, 'ABC' COLLATE \"C\");\n</pre>\n<p lang=\"zh\">\u53e6\u5916\uff0c\u5982\u679c\u4f60\u5e0c\u671b\u67d0\u4e2a\u51fd\u6570\u65e0\u8bba\u4ee5\u4ec0\u4e48\u6392\u5e8f\u89c4\u5219\u8c03\u7528\uff0c\u90fd\u59cb\u7ec8\u6309\u7279\u5b9a\u6392\u5e8f\u89c4\u5219\u5de5\u4f5c\uff0c\u53ef\u4ee5\u5728\u51fd\u6570\u5b9a\u4e49\u4e2d\u6309\u9700\u63d2\u5165 <code class=\"literal\">COLLATE</code> \u5b50\u53e5\u3002\u4e0b\u9762\u8fd9\u4e2a\u7248\u672c\u7684 <code class=\"function\">anyleast</code> \u5c06\u59cb\u7ec8\u4f7f\u7528 <code class=\"literal\">en_US</code> \u533a\u57df\u8bbe\u7f6e\u6765\u6bd4\u8f83\u5b57\u7b26\u4e32\uff1a</p>\n<pre class=\"programlisting\">CREATE FUNCTION anyleast (VARIADIC anyarray) RETURNS anyelement AS $$\n    SELECT min($1[i] COLLATE \"en_US\") FROM generate_subscripts($1, 1) g(i);\n$$ LANGUAGE SQL;\n</pre>\n<p lang=\"zh\">\u4f46\u8bf7\u6ce8\u610f\uff0c\u5982\u679c\u628a\u5b83\u7528\u4e8e\u4e0d\u652f\u6301\u6392\u5e8f\u89c4\u5219\u7684\u6570\u636e\u7c7b\u578b\uff0c\u5c31\u4f1a\u629b\u51fa\u9519\u8bef\u3002</p>\n<p lang=\"zh\">\u5982\u679c\u65e0\u6cd5\u5728\u5b9e\u53c2\u4e4b\u95f4\u786e\u5b9a\u5171\u540c\u7684\u6392\u5e8f\u89c4\u5219\uff0c\u90a3\u4e48 SQL \u51fd\u6570\u4f1a\u628a\u53c2\u6570\u89c6\u4e3a\u5e26\u6709\u5176\u6570\u636e\u7c7b\u578b\u7684\u9ed8\u8ba4\u6392\u5e8f\u89c4\u5219\uff08\u901a\u5e38\u662f\u6570\u636e\u5e93\u7684\u9ed8\u8ba4\u6392\u5e8f\u89c4\u5219\uff0c\u4f46\u5bf9\u57df\u7c7b\u578b\u53c2\u6570\u6765\u8bf4\u4e5f\u53ef\u80fd\u4e0d\u540c\uff09\u3002</p>\n<p lang=\"zh\">\u8fd9\u79cd\u652f\u6301\u6392\u5e8f\u89c4\u5219\u7684\u53c2\u6570\u7684\u884c\u4e3a\uff0c\u53ef\u4ee5\u770b\u4f5c\u662f\u4ec5\u9002\u7528\u4e8e\u6587\u672c\u6570\u636e\u7c7b\u578b\u7684\u4e00\u79cd\u53d7\u9650\u591a\u6001\u5f62\u5f0f\u3002</p>\n</div>\n</div>", "manual_path": "/docs/15/xfunc-sql.html", "localization": {"status": "complete", "sources": [{"url": "/docs/15/xfunc-sql.html", "method": "same-major semantic node", "sha256": "32cec77f672865f1cd6ad6cd9ca5a01f18165aef79e5a8e912bf1ad1c34aa8ea", "language": "zh", "matched_nodes": ["#XFUNC-SQL/div[11]/h3[0]", "#XFUNC-SQL/div[13]/p[2]", "#XFUNC-SQL/div[13]/p[3]", "#XFUNC-SQL/div[13]/p[4]", "#XFUNC-SQL/div[13]/p[5]", "#XFUNC-SQL/div[13]/p[6]", "#XFUNC-SQL/div[13]/p[8]", "#XFUNC-SQL/div[14]/p[10]", "#XFUNC-SQL/div[14]/p[12]", "#XFUNC-SQL/div[14]/p[13]", "#XFUNC-SQL/div[14]/p[15]", "#XFUNC-SQL/div[14]/p[17]", "#XFUNC-SQL/div[14]/p[19]", "#XFUNC-SQL/div[14]/p[1]", "#XFUNC-SQL/div[14]/p[3]", "#XFUNC-SQL/div[14]/p[4]", "#XFUNC-SQL/div[14]/p[6]", "#XFUNC-SQL/div[14]/p[8]", "#XFUNC-SQL/div[15]/div[12]/ul[0]/li[0]", "#XFUNC-SQL/div[15]/div[12]/ul[0]/li[1]", "#XFUNC-SQL/div[15]/p[10]", "#XFUNC-SQL/div[15]/p[11]", "#XFUNC-SQL/div[15]/p[13]", "#XFUNC-SQL/div[15]/p[15]", "#XFUNC-SQL/div[15]/p[16]", "#XFUNC-SQL/div[15]/p[18]", "#XFUNC-SQL/div[15]/p[1]", "#XFUNC-SQL/div[15]/p[20]", "#XFUNC-SQL/div[15]/p[21]", "#XFUNC-SQL/div[15]/p[23]", "#XFUNC-SQL/div[15]/p[25]", "#XFUNC-SQL/div[15]/p[27]", "#XFUNC-SQL/div[15]/p[28]", "#XFUNC-SQL/div[15]/p[3]", "#XFUNC-SQL/div[15]/p[5]", "#XFUNC-SQL/div[15]/p[6]", "#XFUNC-SQL/div[15]/p[8]", "#XFUNC-SQL/div[16]/p[11]", "#XFUNC-SQL/div[16]/p[2]", "#XFUNC-SQL/div[16]/p[4]", "#XFUNC-SQL/div[16]/p[6]", "#XFUNC-SQL/div[16]/p[8]", "#XFUNC-SQL/div[16]/p[9]", "#XFUNC-SQL/div[17]/p[2]", "#XFUNC-SQL/div[17]/p[4]", "#XFUNC-SQL/div[17]/p[6]", "#XFUNC-SQL/div[17]/p[7]", "#XFUNC-SQL/div[18]/p[10]", "#XFUNC-SQL/div[18]/p[11]", "#XFUNC-SQL/div[18]/p[13]", "#XFUNC-SQL/div[18]/p[14]", "#XFUNC-SQL/div[18]/p[16]", "#XFUNC-SQL/div[18]/p[3]", "#XFUNC-SQL/div[18]/p[5]", "#XFUNC-SQL/div[18]/p[7]", "#XFUNC-SQL/div[18]/p[8]", "#XFUNC-SQL/div[19]/p[2]", "#XFUNC-SQL/div[19]/p[3]", "#XFUNC-SQL/div[19]/p[5]", "#XFUNC-SQL/div[1]/dl[0]/dt[0]", "#XFUNC-SQL/div[1]/dl[0]/dt[10]", "#XFUNC-SQL/div[1]/dl[0]/dt[11]", "#XFUNC-SQL/div[1]/dl[0]/dt[1]", "#XFUNC-SQL/div[1]/dl[0]/dt[2]", "#XFUNC-SQL/div[1]/dl[0]/dt[3]", "#XFUNC-SQL/div[1]/dl[0]/dt[4]", "#XFUNC-SQL/div[1]/dl[0]/dt[5]", "#XFUNC-SQL/div[1]/dl[0]/dt[6]", "#XFUNC-SQL/div[1]/dl[0]/dt[7]", "#XFUNC-SQL/div[1]/dl[0]/dt[8]", "#XFUNC-SQL/div[1]/dl[0]/dt[9]", "#XFUNC-SQL/div[20]/p[1]", "#XFUNC-SQL/div[20]/p[2]", "#XFUNC-SQL/div[20]/p[4]", "#XFUNC-SQL/div[20]/p[5]", "#XFUNC-SQL/div[21]/div[28]/p[1]", "#XFUNC-SQL/div[21]/div[29]/p[1]", "#XFUNC-SQL/div[21]/div[29]/p[3]", "#XFUNC-SQL/div[21]/div[29]/p[5]", "#XFUNC-SQL/div[21]/p[10]", "#XFUNC-SQL/div[21]/p[12]", "#XFUNC-SQL/div[21]/p[13]", "#XFUNC-SQL/div[21]/p[15]", "#XFUNC-SQL/div[21]/p[16]", "#XFUNC-SQL/div[21]/p[18]", "#XFUNC-SQL/div[21]/p[20]", "#XFUNC-SQL/div[21]/p[21]", "#XFUNC-SQL/div[21]/p[22]", "#XFUNC-SQL/div[21]/p[24]", "#XFUNC-SQL/div[21]/p[25]", "#XFUNC-SQL/div[21]/p[2]", "#XFUNC-SQL/div[21]/p[3]", "#XFUNC-SQL/div[21]/p[5]", "#XFUNC-SQL/div[21]/p[7]", "#XFUNC-SQL/div[21]/p[9]", "#XFUNC-SQL/div[22]/p[2]", "#XFUNC-SQL/div[22]/p[3]", "#XFUNC-SQL/div[22]/p[5]", "#XFUNC-SQL/div[23]/p[11]", "#XFUNC-SQL/div[23]/p[13]", "#XFUNC-SQL/div[23]/p[15]", "#XFUNC-SQL/div[23]/p[1]", "#XFUNC-SQL/div[23]/p[3]", "#XFUNC-SQL/div[23]/p[5]", "#XFUNC-SQL/div[23]/p[7]", "#XFUNC-SQL/div[23]/p[9]", "#XFUNC-SQL/div[24]/p[10]", "#XFUNC-SQL/div[24]/p[2]", "#XFUNC-SQL/div[24]/p[4]", "#XFUNC-SQL/div[24]/p[6]", "#XFUNC-SQL/div[24]/p[8]", "#XFUNC-SQL/div[24]/p[9]", "#XFUNC-SQL/p[10]", "#XFUNC-SQL/p[12]", "#XFUNC-SQL/p[3]", "#XFUNC-SQL/p[4]", "#XFUNC-SQL/p[5]", "#XFUNC-SQL/p[6]", "#XFUNC-SQL/p[8]"]}], "language": "zh", "original_text": {"/versions/15/description/0": "SQL-language functions", "/versions/15/facts/0/label": "Kind", "/versions/15/facts/0/value": "Native function language", "/versions/15/facts/1/label": "Trusted", "/versions/15/facts/2/label": "Validator"}, "fallback_fields": [], "source_language": "en", "original_snapshot_sha256": "a626a42bf01ff2b782efbc260acc8b788319b07bc65675f2a9b6c11003c221af"}, "comparison_data": {"kind": "Native function language", "handler": "", "trusted": "t", "validator": "fmgr_sql_validator"}, "comparison_hash": "a4af9cf453d140d941e865b952c6a41e2b704a4b30cb77b61c1cdda8a77c5035", "manual_language": "zh"}, "16": {"facts": [{"label": "\u79cd\u7c7b", "value": "\u539f\u751f\u51fd\u6570\u8bed\u8a00"}, {"label": "\u53ef\u4fe1", "value": "t"}, {"label": "\u6821\u9a8c\u51fd\u6570", "value": "fmgr_sql_validator"}], "tables": [], "aliases": [], "catalog": {"oid": "14", "descr": "SQL-language functions", "lanacl": "_null_", "lanispl": "f", "lanname": "sql", "lanowner": "POSTGRES", "laninline": "0", "oid_symbol": "SQLlanguageId", "lanpltrusted": "t", "lanvalidator": "fmgr_sql_validator", "lanplcallfoid": "0"}, "related": [], "release": {"ref": "https://ftp.postgresql.org/pub/source/v16.15/postgresql-16.15.tar.bz2", "label": "16.15", "major": "16", "channel": "stable", "revision": "c1575341fa7bd40f5274ea465b34390f4dc64cdd0770af327005caaeb9f6b7ed", "source_sha256": "c1575341fa7bd40f5274ea465b34390f4dc64cdd0770af327005caaeb9f6b7ed", "catalog_fingerprint": "fa133458dc8f52e15083b4f59b7a582e2e378b608d3ac5c53054df458a374e23"}, "sources": [{"url": "https://ftp.postgresql.org/pub/source/v16.15/postgresql-16.15.tar.bz2", "label": "Matching PostgreSQL source archive", "sha256": "c1575341fa7bd40f5274ea465b34390f4dc64cdd0770af327005caaeb9f6b7ed"}, {"url": "https://pg.center/docs/16/xfunc-sql.html", "path": "xfunc-sql.html", "label": "PostgreSQL 16 English manual", "sha256": "6399640010cc3c3b8e9cda233266ad2ea5a71cf68db71250cb9513ac83941612", "language": "en", "original_url": "/docs/16/xfunc-sql.html"}], "sections": [], "signature": "", "attributes": {"kind": "Native function language", "handler": "", "trusted": "t", "validator": "fmgr_sql_validator"}, "description": ["SQL \u8bed\u8a00\u51fd\u6570"], "manual_html": "<div class=\"sect1\" id=\"XFUNC-SQL\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h2 class=\"title\" lang=\"zh\">38.5. \u67e5\u8be2\u8bed\u8a00\uff08SQL\uff09\u51fd\u6570</h2>\n</div>\n</div>\n</div>\n<p lang=\"zh\">SQL \u51fd\u6570\u6267\u884c\u7531\u4efb\u610f SQL \u8bed\u53e5\u7ec4\u6210\u7684\u4e00\u4e2a\u5217\u8868\uff0c\u5e76\u8fd4\u56de\u5217\u8868\u4e2d\u6700\u540e\u4e00\u4e2a\u67e5\u8be2\u7684\u7ed3\u679c\u3002\u5728\u7b80\u5355\uff08\u975e\u96c6\u5408\uff09\u60c5\u51b5\u4e0b\uff0c\u5c06\u8fd4\u56de\u6700\u540e\u4e00\u4e2a\u67e5\u8be2\u7ed3\u679c\u7684\u7b2c\u4e00\u884c\u3002\uff08\u8bf7\u8bb0\u4f4f\uff0c\u9664\u975e\u4f7f\u7528 <code class=\"literal\">ORDER BY</code>\uff0c\u5426\u5219\u591a\u884c\u7ed3\u679c\u4e2d\u7684<span class=\"quote\">\u201c<span class=\"quote\">\u7b2c\u4e00\u884c</span>\u201d</span>\u5e76\u6ca1\u6709\u660e\u786e\u5b9a\u4e49\u3002\uff09\u5982\u679c\u6700\u540e\u4e00\u4e2a\u67e5\u8be2\u5b8c\u5168\u6ca1\u6709\u8fd4\u56de\u4efb\u4f55\u884c\uff0c\u5219\u8fd4\u56de\u7a7a\u503c\u3002</p>\n<p lang=\"zh\">\u6216\u8005\uff0c\u4e00\u4e2a SQL \u51fd\u6570\u53ef\u4ee5\u901a\u8fc7\u6307\u5b9a\u51fd\u6570\u7684\u8fd4\u56de\u7c7b\u578b\u4e3a<code class=\"literal\">SETOF <em class=\"replaceable\"><code>sometype</code></em></code>\u88ab\u58f0\u660e\u4e3a\u8fd4\u56de\u4e00\u4e2a\u96c6\u5408\uff08\u4e5f\u5c31\u662f\u591a\u4e2a\u884c\uff09\uff0c\u6216\u8005\u7b49\u6548\u5730\u58f0\u660e\u5b83\u4e3a<code class=\"literal\">RETURNS TABLE(<em class=\"replaceable\"><code>columns</code></em>)</code>\u3002\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b\uff0c\u6700\u540e\u4e00\u4e2a\u67e5\u8be2\u7684\u7ed3\u679c\u7684\u6240\u6709\u884c\u4f1a\u88ab\u8fd4\u56de\u3002\u4e0b\u6587\u5c06\u7ed9\u51fa\u8fdb\u4e00\u6b65\u7684\u7ec6\u8282\u3002</p>\n<p lang=\"zh\">SQL \u51fd\u6570\u7684\u51fd\u6570\u4f53\u5fc5\u987b\u662f\u4e00\u4e2a\u7531\u5206\u53f7\u5206\u9694\u7684 SQL \u8bed\u53e5\u5217\u8868\u3002\u6700\u540e\u4e00\u6761\u8bed\u53e5\u540e\u7684\u5206\u53f7\u662f\u53ef\u9009\u7684\u3002\u9664\u975e\u8be5\u51fd\u6570\u88ab\u58f0\u660e\u4e3a\u8fd4\u56de <code class=\"type\">void</code>\uff0c\u5426\u5219\u6700\u540e\u4e00\u6761\u8bed\u53e5\u5fc5\u987b\u662f <code class=\"command\">SELECT</code>\uff0c\u6216\u8005\u662f <code class=\"command\">INSERT</code>\u3001<code class=\"command\">UPDATE</code> \u6216 <code class=\"command\">DELETE</code> \u5e76\u5e26\u6709 <code class=\"literal\">RETURNING</code> \u5b50\u53e5\u3002</p>\n<p lang=\"zh\">\u4efb\u610f\u4e00\u7ec4 <acronym class=\"acronym\">SQL</acronym> \u8bed\u8a00\u547d\u4ee4\u90fd\u53ef\u4ee5\u6253\u5305\u5e76\u5b9a\u4e49\u6210\u51fd\u6570\u3002\u9664 <code class=\"command\">SELECT</code> \u67e5\u8be2\u5916\uff0c\u8fd9\u4e9b\u547d\u4ee4\u8fd8\u53ef\u4ee5\u5305\u542b\u6570\u636e\u4fee\u6539\u67e5\u8be2\uff08<code class=\"command\">INSERT</code>\u3001<code class=\"command\">UPDATE</code>\u3001<code class=\"command\">DELETE</code> \u548c <code class=\"command\">MERGE</code>\uff09\uff0c\u4ee5\u53ca\u5176\u4ed6 SQL \u547d\u4ee4\u3002\uff08\u5728 <acronym class=\"acronym\">SQL</acronym> \u51fd\u6570\u4e2d\u4e0d\u80fd\u4f7f\u7528\u4e8b\u52a1\u63a7\u5236\u547d\u4ee4\uff0c\u4f8b\u5982 <code class=\"command\">COMMIT</code>\u3001<code class=\"command\">SAVEPOINT</code>\uff0c\u4e5f\u4e0d\u80fd\u4f7f\u7528\u67d0\u4e9b\u5de5\u5177\u547d\u4ee4\uff0c\u4f8b\u5982 <code class=\"literal\">VACUUM</code>\u3002\uff09\u4e0d\u8fc7\uff0c\u6700\u540e\u4e00\u6761\u547d\u4ee4\u5fc5\u987b\u662f <code class=\"command\">SELECT</code>\uff0c\u6216\u8005\u5e26\u6709 <code class=\"literal\">RETURNING</code> \u5b50\u53e5\uff0c\u5e76\u8fd4\u56de\u4e0e\u51fd\u6570\u58f0\u660e\u8fd4\u56de\u7c7b\u578b\u76f8\u7b26\u7684\u7ed3\u679c\u3002\u6216\u8005\uff0c\u5982\u679c\u4f60\u60f3\u5b9a\u4e49\u4e00\u4e2a\u6267\u884c\u52a8\u4f5c\u4f46\u6ca1\u6709\u6709\u7528\u8fd4\u56de\u503c\u7684 SQL \u51fd\u6570\uff0c\u4e5f\u53ef\u4ee5\u628a\u5b83\u5b9a\u4e49\u4e3a\u8fd4\u56de <code class=\"type\">void</code>\u3002\u4f8b\u5982\uff0c\u4e0b\u9762\u8fd9\u4e2a\u51fd\u6570\u4f1a\u4ece <code class=\"literal\">emp</code> \u8868\u4e2d\u5220\u9664\u85aa\u8d44\u4e3a\u8d1f\u7684\u884c\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION clean_emp() RETURNS void AS '\n    DELETE FROM emp\n        WHERE salary &lt; 0;\n' LANGUAGE SQL;\n\nSELECT clean_emp();\n\n clean_emp\n-----------\n\n(1 row)\n</pre>\n<p lang=\"zh\">\u4f60\u4e5f\u53ef\u4ee5\u628a\u8fd9\u4e2a\u5199\u4e3a\u4e00\u4e2a\u8fc7\u7a0b\uff0c\u90a3\u6837\u907f\u514d\u8fd4\u56de\u7c7b\u578b\u7684\u95ee\u9898\u3002\u4f8b\u5982\uff1a</p>\n<pre class=\"screen\">CREATE PROCEDURE clean_emp() AS '\n    DELETE FROM emp\n        WHERE salary &lt; 0;\n' LANGUAGE SQL;\n\nCALL clean_emp();\n</pre>\n<p lang=\"zh\">\u5728\u50cf\u8fd9\u6837\u7684\u7b80\u5355\u60c5\u51b5\u4e2d\uff0c\u8fd4\u56de<code class=\"type\">void</code>\u7684\u51fd\u6570\u4e0e\u8fc7\u7a0b\u4e4b\u95f4\u7684\u5dee\u5f02\u4e3b\u8981\u662f\u98ce\u683c\u4e0a\u9762\u7684\u3002\u4e0d\u8fc7\uff0c\u8fc7\u7a0b\u8fd8\u63d0\u4f9b\u4e86\u51fd\u6570\u6240\u6ca1\u6709\u7684\u989d\u5916\u80fd\u529b\uff0c\u4f8b\u5982\u4e8b\u52a1\u63a7\u5236\u3002\u6b64\u5916\uff0c\u8fc7\u7a0b\u662f SQL \u6807\u51c6\u7684\u4e00\u90e8\u5206\uff0c\u800c\u8fd4\u56de<code class=\"type\">void</code>\u5219\u662f PostgreSQL \u6269\u5c55\u3002</p>\n<div class=\"note\">\n<h3 class=\"title\" lang=\"zh\">\u6ce8\u610f</h3>\n<p lang=\"zh\">SQL \u51fd\u6570\u7684\u6574\u4e2a\u51fd\u6570\u4f53\u4f1a\u5728\u4efb\u4f55\u8bed\u53e5\u6267\u884c\u4e4b\u524d\u5b8c\u6210\u89e3\u6790\u3002\u867d\u7136 SQL \u51fd\u6570\u53ef\u4ee5\u5305\u542b\u4fee\u6539\u7cfb\u7edf\u76ee\u5f55\u7684\u547d\u4ee4\uff0c\u4f8b\u5982 CREATE TABLE\uff0c\u4f46\u5728\u5206\u6790\u51fd\u6570\u4e2d\u540e\u7eed\u547d\u4ee4\u65f6\uff0c\u8fd9\u4e9b\u4fee\u6539\u5c1a\u4e0d\u53ef\u89c1\u3002\u56e0\u6b64\uff0c\u5c06 CREATE TABLE foo (...); INSERT INTO foo VALUES(...); \u653e\u5728\u540c\u4e00\u4e2a SQL \u51fd\u6570\u4e2d\u4e0d\u4f1a\u6309\u9884\u671f\u5de5\u4f5c\uff0c\u56e0\u4e3a\u89e3\u6790 INSERT \u65f6 foo \u5c1a\u4e0d\u5b58\u5728\u3002\u6b64\u7c7b\u60c5\u51b5\u5efa\u8bae\u6539\u7528 PL/pgSQL\u3002</p>\n</div>\n<p lang=\"zh\"><code class=\"command\">CREATE FUNCTION</code> \u547d\u4ee4\u7684\u8bed\u6cd5\u8981\u6c42\u628a\u51fd\u6570\u4f53\u5199\u6210\u4e00\u4e2a\u5b57\u7b26\u4e32\u5e38\u91cf\u3002\u5bf9\u4e8e\u5b57\u7b26\u4e32\u5e38\u91cf\uff0c\u901a\u5e38\u4f7f\u7528\u7f8e\u5143\u5f15\u7528\u6700\u65b9\u4fbf\uff08\u89c1<a class=\"xref\" href=\"/docs/16/sql-syntax-lexical.html#SQL-SYNTAX-DOLLAR-QUOTING\" title=\"4.1.2.4.\u00a0\u7f8e\u5143\u5f15\u7528\u7684\u5b57\u7b26\u4e32\u5e38\u91cf\">\u7b2c\u00a04.1.2.4\u00a0\u8282</a>\uff09\u3002\u5982\u679c\u4f60\u9009\u62e9\u4f7f\u7528\u5e38\u89c4\u7684\u5355\u5f15\u53f7\u5b57\u7b26\u4e32\u5e38\u91cf\u8bed\u6cd5\uff0c\u90a3\u4e48\u5fc5\u987b\u5728\u51fd\u6570\u4f53\u4e2d\u5c06\u5355\u5f15\u53f7\uff08<code class=\"literal\">'</code>\uff09\u548c\u53cd\u659c\u7ebf\uff08<code class=\"literal\">\\</code>\uff09\u5199\u6210\u53cc\u4efd\uff08\u5047\u5b9a\u4f7f\u7528\u8f6c\u4e49\u5b57\u7b26\u4e32\u8bed\u6cd5\uff0c\u89c1<a class=\"xref\" href=\"/docs/16/sql-syntax-lexical.html#SQL-SYNTAX-STRINGS\" title=\"4.1.2.1.\u00a0\u5b57\u7b26\u4e32\u5e38\u91cf\">\u7b2c\u00a04.1.2.1\u00a0\u8282</a>\uff09\u3002</p>\n<div class=\"sect2\" id=\"XFUNC-SQL-FUNCTION-ARGUMENTS\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/16/xfunc-sql.html#XFUNC-SQL-FUNCTION-ARGUMENTS\">38.5.1. <acronym class=\"acronym\">SQL</acronym>\u51fd\u6570\u7684\u53c2\u6570</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\">\u4e00\u4e2a SQL \u51fd\u6570\u7684\u53c2\u6570\u53ef\u4ee5\u5728\u51fd\u6570\u4f53\u4e2d\u7528\u540d\u79f0\u6216\u7f16\u53f7\u5f15\u7528\u3002\u4e0b\u9762\u4f1a\u6709\u4e24\u79cd\u65b9\u6cd5\u7684\u793a\u4f8b\u3002</p>\n<p lang=\"zh\">\u8981\u4f7f\u7528\u4e00\u4e2a\u540d\u79f0\uff0c\u5c06\u51fd\u6570\u53c2\u6570\u58f0\u660e\u4e3a\u5e26\u6709\u4e00\u4e2a\u540d\u79f0\uff0c\u7136\u540e\u5728\u51fd\u6570\u4f53\u4e2d\u53ea\u5199\u8be5\u540d\u79f0\u3002\u5982\u679c\u53c2\u6570\u540d\u79f0\u4e0e\u51fd\u6570\u5185\u5f53\u524d SQL \u547d\u4ee4\u4e2d\u7684\u4efb\u610f\u5217\u540d\u76f8\u540c\uff0c\u5217\u540d\u5c06\u4f18\u5148\u3002\u5982\u679c\u4e0d\u60f3\u8fd9\u6837\uff0c\u53ef\u4ee5\u7528\u51fd\u6570\u672c\u8eab\u7684\u540d\u79f0\u6765\u9650\u5b9a\u53c2\u6570\u540d\uff0c\u4e5f\u5c31\u662f<code class=\"literal\"><em class=\"replaceable\"><code>function_name</code></em>.<em class=\"replaceable\"><code>argument_name</code></em></code>\uff08\u5982\u679c\u8fd9\u4f1a\u4e0e\u4e00\u4e2a\u88ab\u9650\u5b9a\u7684\u5217\u540d\u51b2\u7a81\uff0c\u7167\u4f8b\u8fd8\u662f\u5217\u540d\u8d62\u5f97\u4f18\u5148\u3002\u4f60\u53ef\u4ee5\u901a\u8fc7\u4e3a SQL \u547d\u4ee4\u4e2d\u7684\u8868\u9009\u62e9\u4e00\u4e2a\u4e0d\u540c\u7684\u522b\u540d\u6765\u907f\u514d\u8fd9\u79cd\u6df7\u6dc6\uff09\u3002</p>\n<p lang=\"zh\">\u5728\u66f4\u65e7\u7684\u6570\u5b57\u65b9\u6cd5\u4e2d\uff0c\u53c2\u6570\u53ef\u4ee5\u7528\u8bed\u6cd5<code class=\"literal\">$<em class=\"replaceable\"><code>n</code></em></code>\u5f15\u7528\uff1a<code class=\"literal\">$1</code>\u6307\u7684\u662f\u7b2c\u4e00\u4e2a\u8f93\u5165\u53c2\u6570\uff0c<code class=\"literal\">$2</code>\u6307\u7684\u662f\u7b2c\u4e8c\u4e2a\uff0c\u4ee5\u6b64\u7c7b\u63a8\u3002\u4e0d\u7ba1\u7279\u5b9a\u7684\u53c2\u6570\u662f\u5426\u4f7f\u7528\u540d\u79f0\u58f0\u660e\uff0c\u8fd9\u79cd\u65b9\u6cd5\u90fd\u6709\u6548\u3002</p>\n<p lang=\"zh\">\u5982\u679c\u4e00\u4e2a\u53c2\u6570\u662f\u4e00\u79cd\u590d\u5408\u7c7b\u578b\uff0c\u90a3\u4e48\u70b9\u53f7\u8bb0\u6cd5\uff08\u5982 <code class=\"literal\"><em class=\"replaceable\"><code>argname</code></em>.<em class=\"replaceable\"><code>fieldname</code></em></code> \u6216<code class=\"literal\">$1.<em class=\"replaceable\"><code>fieldname</code></em></code>\uff09\u4e5f\u53ef\u4ee5\u88ab\u7528\u6765\u8bbf\u95ee\u8be5\u53c2\u6570\u7684\u5c5e\u6027\u3002\u540c\u6837\uff0c\u4f60\u53ef\u80fd\u9700\u8981\u7528\u51fd\u6570\u7684\u540d\u79f0\u6765\u9650\u5b9a\u53c2\u6570\u7684\u540d\u79f0\u4ee5\u907f\u514d\u6b67\u4e49\u3002</p>\n<p lang=\"zh\">SQL \u51fd\u6570\u53c2\u6570\u53ea\u80fd\u88ab\u7528\u4f5c\u6570\u636e\u503c\u800c\u4e0d\u80fd\u4f5c\u4e3a\u6807\u8bc6\u7b26\u3002\u4f8b\u5982\u8fd9\u662f\u5408\u7406\u7684\uff1a</p>\n<pre class=\"programlisting\">INSERT INTO mytable VALUES ($1);\n</pre>\n<p lang=\"zh\">\u4f46\u8fd9\u6837\u5c31\u4e0d\u884c\uff1a</p>\n<pre class=\"programlisting\">INSERT INTO $1 VALUES (42);\n</pre>\n<div class=\"note\">\n<h3 class=\"title\" lang=\"zh\">\u6ce8\u610f</h3>\n<p lang=\"zh\">PostgreSQL 9.2 \u5f00\u59cb\u652f\u6301\u901a\u8fc7\u540d\u79f0\u5f15\u7528 SQL \u51fd\u6570\u53c2\u6570\u3002\u9700\u8981\u7528\u4e8e\u66f4\u65e9\u7248\u672c\u670d\u52a1\u5668\u7684\u51fd\u6570\u5fc5\u987b\u4f7f\u7528 $n \u8bb0\u6cd5\u3002</p>\n</div>\n</div>\n<div class=\"sect2\" id=\"XFUNC-SQL-BASE-FUNCTIONS\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/16/xfunc-sql.html#XFUNC-SQL-BASE-FUNCTIONS\">38.5.2. \u57fa\u7840\u7c7b\u578b\u4e0a\u7684<acronym class=\"acronym\">SQL</acronym>\u51fd\u6570</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\">\u6700\u7b80\u5355\u7684 <acronym class=\"acronym\">SQL</acronym> \u51fd\u6570\u6ca1\u6709\u53c2\u6570\uff0c\u53ea\u662f\u8fd4\u56de\u4e00\u4e2a\u57fa\u7840\u7c7b\u578b\uff0c\u4f8b\u5982 <code class=\"type\">integer</code>\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION one() RETURNS integer AS $$\n    SELECT 1 AS result;\n$$ LANGUAGE SQL;\n\n-- Alternative syntax for string literal:\nCREATE FUNCTION one() RETURNS integer AS '\n    SELECT 1 AS result;\n' LANGUAGE SQL;\n\nSELECT one();\n\n one\n-----\n   1\n</pre>\n<p lang=\"zh\">\u6ce8\u610f\u6211\u4eec\u4e3a\u8be5\u51fd\u6570\u7684\u7ed3\u679c\u5728\u51fd\u6570\u4f53\u5185\u5b9a\u4e49\u4e86\u4e00\u4e2a\u5217\u522b\u540d\uff08\u540d\u4e3a<code class=\"literal\">result</code>\uff09\uff0c\u4f46\u662f\u8fd9\u4e2a\u5217\u522b\u540d\u5728\u51fd\u6570\u4ee5\u5916\u662f\u4e0d\u53ef\u89c1\u7684\u3002\u56e0\u6b64\uff0c\u7ed3\u679c\u88ab\u6807\u8bb0\u4e3a<code class=\"literal\">one</code>\u800c\u4e0d\u662f<code class=\"literal\">result</code>\u3002</p>\n<p lang=\"zh\">\u5b9a\u4e49\u63a5\u53d7\u57fa\u7840\u7c7b\u578b\u53c2\u6570\u7684 <acronym class=\"acronym\">SQL</acronym> \u51fd\u6570\u4e5f\u51e0\u4e4e\u540c\u6837\u5bb9\u6613\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION add_em(x integer, y integer) RETURNS integer AS $$\n    SELECT x + y;\n$$ LANGUAGE SQL;\n\nSELECT add_em(1, 2) AS answer;\n\n answer\n--------\n      3\n</pre>\n<p lang=\"zh\">\u6216\u8005\uff0c\u6211\u4eec\u4e5f\u53ef\u4ee5\u4e0d\u7528\u53c2\u6570\u540d\uff0c\u800c\u6539\u7528\u6570\u5b57\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION add_em(integer, integer) RETURNS integer AS $$\n    SELECT $1 + $2;\n$$ LANGUAGE SQL;\n\nSELECT add_em(1, 2) AS answer;\n\n answer\n--------\n      3\n</pre>\n<p lang=\"zh\">\u4e0b\u9762\u662f\u4e00\u4e2a\u66f4\u6709\u7528\u7684\u51fd\u6570\uff0c\u5b83\u53ef\u4ee5\u7528\u6765\u4ece\u94f6\u884c\u8d26\u6237\u4e2d\u6263\u6b3e\uff1a</p>\n<pre class=\"programlisting\">CREATE FUNCTION tf1 (accountno integer, debit numeric) RETURNS numeric AS $$\n    UPDATE bank\n        SET balance = balance - debit\n        WHERE accountno = tf1.accountno;\n    SELECT 1;\n$$ LANGUAGE SQL;\n</pre>\n<p lang=\"zh\">\u7528\u6237\u53ef\u4ee5\u8fd9\u6837\u6267\u884c\u8be5\u51fd\u6570\uff0c\u4ece 17 \u53f7\u8d26\u6237\u4e2d\u6263\u9664 $100.00\uff1a</p>\n<pre class=\"programlisting\">SELECT tf1(17, 100.0);\n</pre>\n<p lang=\"zh\">\u5728\u8fd9\u4e2a\u793a\u4f8b\u4e2d\uff0c\u6211\u4eec\u4e3a\u7b2c\u4e00\u4e2a\u53c2\u6570\u9009\u62e9\u4e86\u540d\u79f0<code class=\"literal\">accountno</code>\uff0c\u4f46\u662f\u8fd9\u548c\u8868<code class=\"literal\">bank</code>\u4e2d\u7684\u4e00\u4e2a\u5217\u540d\u76f8\u540c\u3002\u5728<code class=\"command\">UPDATE</code>\u547d\u4ee4\u4e2d\uff0c<code class=\"literal\">accountno</code>\u5f15\u7528\u5217<code class=\"literal\">bank.accountno</code>\uff0c\u56e0\u6b64 <code class=\"literal\">tf1.accountno</code>\u5fc5\u987b\u88ab\u7528\u6765\u5f15\u7528\u8be5\u53c2\u6570\u3002\u6211\u4eec\u5f53\u7136\u53ef\u4ee5\u901a\u8fc7\u4e3a\u8be5\u53c2\u6570\u4f7f\u7528\u4e00\u4e2a\u4e0d\u540c\u7684\u540d\u79f0\u6765\u907f\u514d\u8fd9\u6837\u7684\u95ee\u9898\u3002</p>\n<p lang=\"zh\">\u5b9e\u9645\u4e0a\u6211\u4eec\u53ef\u80fd\u559c\u6b22\u4ece\u8be5\u51fd\u6570\u5f97\u5230\u4e00\u4e2a\u66f4\u6709\u7528\u7684\u7ed3\u679c\u800c\u4e0d\u662f\u4e00\u4e2a\u5e38\u6570 1\uff0c\u56e0\u6b64\u4e00\u4e2a\u66f4\u53ef\u80fd\u7684\u5b9a\u4e49\u662f\uff1a</p>\n<pre class=\"programlisting\">CREATE FUNCTION tf1 (accountno integer, debit numeric) RETURNS numeric AS $$\n    UPDATE bank\n        SET balance = balance - debit\n        WHERE accountno = tf1.accountno;\n    SELECT balance FROM bank WHERE accountno = tf1.accountno;\n$$ LANGUAGE SQL;\n</pre>\n<p lang=\"zh\">\u5b83\u4f1a\u8c03\u6574\u4f59\u989d\u5e76\u4e14\u8fd4\u56de\u65b0\u7684\u4f59\u989d\u3002\u540c\u6837\u7684\u4e8b\u60c5\u4e5f\u53ef\u4ee5\u7528\u4e00\u4e2a\u4f7f\u7528<code class=\"literal\">RETURNING</code>\u7684\u547d\u4ee4\u5b9e\u73b0\uff1a</p>\n<pre class=\"programlisting\">CREATE FUNCTION tf1 (accountno integer, debit numeric) RETURNS numeric AS $$\n    UPDATE bank\n        SET balance = balance - debit\n        WHERE accountno = tf1.accountno\n    RETURNING balance;\n$$ LANGUAGE SQL;\n</pre>\n<p lang=\"zh\">\u5982\u679c\u5728<code class=\"literal\">SELECT</code>\u6216<code class=\"literal\">RETURNING</code>\u5b50\u53e5\u4e2d\uff0c<acronym class=\"acronym\">SQL</acronym>\u51fd\u6570\u7684\u6700\u7ec8\u8fd4\u56de\u503c\u7c7b\u578b\u4e0e\u51fd\u6570\u58f0\u660e\u7684\u7ed3\u679c\u7c7b\u578b\u4e0d\u5b8c\u5168\u5339\u914d\uff0c\u5982\u679c\u53ef\u4ee5\u4f7f\u7528\u9690\u5f0f\u6216\u8d4b\u503c\u8f6c\u6362\uff0c<span class=\"productname\">PostgreSQL</span>\u5c06\u81ea\u52a8\u5c06\u8be5\u503c\u8f6c\u6362\u4e3a\u6240\u9700\u7c7b\u578b\u3002\u5426\u5219\uff0c\u4f60\u5fc5\u987b\u5199\u51fa\u663e\u5f0f\u7c7b\u578b\u8f6c\u6362\u3002\u4f8b\u5982\uff0c\u5047\u8bbe\u6211\u4eec\u5e0c\u671b\u524d\u9762\u7684<code class=\"function\">add_em</code>\u51fd\u6570\u8fd4\u56de<code class=\"type\">float8</code>\u7c7b\u578b\u3002\u53ea\u9700\u7f16\u5199</p>\n<pre class=\"programlisting\">CREATE FUNCTION add_em(integer, integer) RETURNS float8 AS $$\n    SELECT $1 + $2;\n$$ LANGUAGE SQL;\n</pre>\n<p lang=\"zh\">\u56e0\u4e3a<code class=\"type\">integer</code>\u7684\u548c\u53ef\u4ee5\u9690\u5f0f\u8f6c\u6362\u4e3a<code class=\"type\">float8</code>\u3002\uff08\u6709\u5173\u8f6c\u6362\u7684\u66f4\u591a\u4fe1\u606f\uff0c\u8bf7\u53c2\u89c1<a class=\"xref\" href=\"/docs/16/typeconv.html\" title=\"\u7b2c\u00a010\u00a0\u7ae0\u00a0\u7c7b\u578b\u8f6c\u6362\">\u7b2c\u00a010\u00a0\u7ae0</a>\u6216<a class=\"xref\" href=\"/docs/16/sql-createcast.html\" title=\"CREATE CAST\"><span class=\"refentrytitle\">CREATE CAST</span></a>\u3002\uff09</p>\n</div>\n<div class=\"sect2\" id=\"XFUNC-SQL-COMPOSITE-FUNCTIONS\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/16/xfunc-sql.html#XFUNC-SQL-COMPOSITE-FUNCTIONS\">38.5.3. \u590d\u5408\u7c7b\u578b\u4e0a\u7684<acronym class=\"acronym\">SQL</acronym>\u51fd\u6570</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\">\u7f16\u5199\u63a5\u53d7\u590d\u5408\u7c7b\u578b\u53c2\u6570\u7684\u51fd\u6570\u65f6\uff0c\u6211\u4eec\u4e0d\u4ec5\u5fc5\u987b\u6307\u5b9a\u8981\u7528\u54ea\u4e2a\u53c2\u6570\uff0c\u8fd8\u5fc5\u987b\u6307\u5b9a\u8be5\u53c2\u6570\u7684\u54ea\u4e2a\u5c5e\u6027\uff08\u5b57\u6bb5\uff09\u3002\u4f8b\u5982\uff0c\u5047\u8bbe <code class=\"type\">emp</code> \u662f\u4e00\u4e2a\u5305\u542b\u96c7\u5458\u6570\u636e\u7684\u8868\uff0c\u56e0\u6b64\u5b83\u4e5f\u662f\u8be5\u8868\u6bcf\u4e00\u884c\u5bf9\u5e94\u7684\u590d\u5408\u7c7b\u578b\u540d\u79f0\u3002\u4e0b\u9762\u7684\u51fd\u6570 <code class=\"function\">double_salary</code> \u7528\u6765\u8ba1\u7b97\u67d0\u4eba\u7684\u5de5\u8d44\u7ffb\u500d\u540e\u4f1a\u662f\u591a\u5c11\uff1a</p>\n<pre class=\"screen\">CREATE TABLE emp (\n    name        text,\n    salary      numeric,\n    age         integer,\n    cubicle     point\n);\n\nINSERT INTO emp VALUES ('Bill', 4200, 45, '(2,1)');\n\nCREATE FUNCTION double_salary(emp) RETURNS numeric AS $$\n    SELECT $1.salary * 2 AS salary;\n$$ LANGUAGE SQL;\n\nSELECT name, double_salary(emp.*) AS dream\n    FROM emp\n    WHERE emp.cubicle ~= point '(2,1)';\n\n name | dream\n------+-------\n Bill |  8400\n</pre>\n<p lang=\"zh\">\u6ce8\u610f\u8fd9\u91cc\u7528 <code class=\"literal\">$1.salary</code> \u8bed\u6cd5\u6765\u9009\u53d6\u53c2\u6570\u884c\u503c\u4e2d\u7684\u4e00\u4e2a\u5b57\u6bb5\u3002\u8fd8\u8981\u6ce8\u610f\uff0c\u8c03\u7528\u65f6\u7684 <code class=\"command\">SELECT</code> \u547d\u4ee4\u4f7f\u7528 <em class=\"replaceable\"><code>table_name</code></em><code class=\"literal\">.*</code> \u5c06\u8868\u7684\u5f53\u524d\u6574\u884c\u53d6\u4f5c\u4e00\u4e2a\u590d\u5408\u503c\u3002\u8be5\u8868\u884c\u4e5f\u53ef\u4ee5\u4ec5\u7528\u8868\u540d\u6765\u5f15\u7528\uff1a</p>\n<pre class=\"screen\">SELECT name, double_salary(emp) AS dream\n    FROM emp\n    WHERE emp.cubicle ~= point '(2,1)';\n</pre>\n<p lang=\"zh\">\u4f46\u8fd9\u79cd\u7528\u6cd5\u5df2\u88ab\u5f03\u7528\uff0c\u56e0\u4e3a\u5b83\u5f88\u5bb9\u6613\u8ba9\u4eba\u6df7\u6dc6\uff08\u5173\u4e8e\u8868\u884c\u590d\u5408\u503c\u8fd9\u4e24\u79cd\u8bb0\u6cd5\u7684\u66f4\u591a\u7ec6\u8282\uff0c\u89c1<a class=\"xref\" href=\"/docs/16/rowtypes.html#ROWTYPES-USAGE\" title=\"8.16.5.\u00a0\u5728\u67e5\u8be2\u4e2d\u4f7f\u7528\u590d\u5408\u7c7b\u578b\">\u7b2c\u00a08.16.5\u00a0\u8282</a>\uff09\u3002</p>\n<p lang=\"zh\">\u6709\u65f6\u5019\u5373\u65f6\u6784\u9020\u4e00\u4e2a\u590d\u5408\u53c2\u6570\u503c\u4f1a\u5f88\u65b9\u4fbf\u3002\u8fd9\u53ef\u4ee5\u7528<code class=\"literal\">ROW</code>\u6784\u9020\u5668\u5b8c\u6210\u3002\u4f8b\u5982\uff0c\u6211\u4eec\u53ef\u4ee5\u8c03\u6574\u88ab\u4f20\u9012\u7ed9\u51fd\u6570\u7684\u6570\u636e\uff1a</p>\n<pre class=\"screen\">SELECT name, double_salary(ROW(name, salary*1.1, age, cubicle)) AS dream\n    FROM emp;\n</pre>\n<p lang=\"zh\">\u4e5f\u53ef\u4ee5\u6784\u5efa\u4e00\u4e2a\u8fd4\u56de\u590d\u5408\u7c7b\u578b\u7684\u51fd\u6570\u3002\u8fd9\u662f\u4e00\u4e2a\u8fd4\u56de\u5355\u4e00<code class=\"type\">emp</code>\u884c\u7684\u51fd\u6570\u793a\u4f8b\uff1a</p>\n<pre class=\"programlisting\">CREATE FUNCTION new_emp() RETURNS emp AS $$\n    SELECT text 'None' AS name,\n        1000.0 AS salary,\n        25 AS age,\n        point '(2,2)' AS cubicle;\n$$ LANGUAGE SQL;\n</pre>\n<p lang=\"zh\">\u5728\u8fd9\u4e2a\u793a\u4f8b\u4e2d\uff0c\u6211\u4eec\u4e3a\u6bcf\u4e00\u4e2a\u5c5e\u6027\u6307\u5b9a\u4e86\u4e00\u4e2a\u5e38\u91cf\u503c\uff0c\u4f46\u662f\u53ef\u4ee5\u7528\u4efb\u4f55\u8ba1\u7b97\u6765\u66ff\u6362\u8fd9\u4e9b\u5e38\u91cf\u3002</p>\n<p lang=\"zh\">\u5b9a\u4e49\u8be5\u51fd\u6570\u65f6\u6709\u4e24\u70b9\u91cd\u8981\u6ce8\u610f\u4e8b\u9879\uff1a</p>\n<div class=\"itemizedlist\">\n<ul class=\"itemizedlist\">\n<li class=\"listitem\" lang=\"zh\">\n<p>\u67e5\u8be2\u4e2d\u7684\u9009\u62e9\u5217\u8868\u987a\u5e8f\u5fc5\u987b\u4e0e\u5217\u5728\u590d\u5408\u7c7b\u578b\u4e2d\u51fa\u73b0\u7684\u987a\u5e8f\u5b8c\u5168\u76f8\u540c\u3002\uff08\u7cfb\u7edf\u4e0d\u8003\u8651\u50cf\u4e0a\u9762\u8fd9\u6837\u6307\u5b9a\u7684\u5217\u540d\u3002\uff09</p>\n</li>\n<li class=\"listitem\" lang=\"zh\">\n<p>\u6211\u4eec\u5fc5\u987b\u786e\u4fdd\u6bcf\u4e2a\u8868\u8fbe\u5f0f\u7684\u7c7b\u578b\u90fd\u53ef\u4ee5\u8f6c\u6362\u4e3a\u590d\u5408\u7c7b\u578b\u7684\u76f8\u5e94\u5217\u7684\u7c7b\u578b\u3002\u5426\u5219\u6211\u4eec\u4f1a\u5f97\u5230\u8fd9\u6837\u7684\u9519\u8bef\uff1a</p>\n<pre class=\"screen\">\n<code class=\"computeroutput\">\nERROR:  return type mismatch in function declared to return emp\nDETAIL:  Final statement returns text instead of point at column 4.\n</code>\n</pre>\n<p>\u4e0e\u57fa\u7840\u7c7b\u578b\u7684\u60c5\u51b5\u4e00\u6837\uff0c\u7cfb\u7edf\u4e0d\u4f1a\u81ea\u52a8\u63d2\u5165\u663e\u5f0f\u8f6c\u6362\uff0c\u53ea\u4f1a\u63d2\u5165\u9690\u5f0f\u6216\u8d4b\u503c\u8f6c\u6362\u3002</p>\n</li>\n</ul>\n</div>\n<p lang=\"zh\">\u5b9a\u4e49\u540c\u6837\u7684\u51fd\u6570\u7684\u4e00\u79cd\u4e0d\u540c\u7684\u65b9\u6cd5\u662f\uff1a</p>\n<pre class=\"programlisting\">CREATE FUNCTION new_emp() RETURNS emp AS $$\n    SELECT ROW('None', 1000.0, 25, '(2,2)')::emp;\n$$ LANGUAGE SQL;\n</pre>\n<p lang=\"zh\">\u8fd9\u91cc\u6211\u4eec\u5199\u4e86\u4e00\u4e2a\u53ea\u8fd4\u56de\u5355\u5217\u3001\u4e14\u8be5\u5217\u5177\u6709\u6b63\u786e\u590d\u5408\u7c7b\u578b\u7684 <code class=\"command\">SELECT</code>\u3002\u5728\u8fd9\u79cd\u573a\u666f\u4e0b\uff0c\u8fd9\u6837\u5199\u5e76\u4e0d\u89c1\u5f97\u66f4\u597d\uff0c\u4f46\u5728\u67d0\u4e9b\u60c5\u51b5\u4e0b\u4f1a\u5f88\u65b9\u4fbf \u2014 \u4f8b\u5982\uff0c\u9700\u8981\u901a\u8fc7\u8c03\u7528\u53e6\u4e00\u4e2a\u8fd4\u56de\u76ee\u6807\u590d\u5408\u503c\u7684\u51fd\u6570\u6765\u8ba1\u7b97\u7ed3\u679c\u65f6\u3002\u8fd8\u6709\u4e00\u79cd\u60c5\u51b5\u662f\uff0c\u5982\u679c\u6211\u4eec\u8981\u7f16\u5199\u7684\u51fd\u6570\u8fd4\u56de\u7684\u662f\u57fa\u4e8e\u590d\u5408\u7c7b\u578b\u7684\u57df\uff0c\u800c\u4e0d\u662f\u666e\u901a\u590d\u5408\u7c7b\u578b\uff0c\u90a3\u4e48\u5c31\u5fc5\u987b\u5199\u6210\u8fd4\u56de\u5355\u5217\u7684\u5f62\u5f0f\uff0c\u56e0\u4e3a\u6ca1\u6709\u529e\u6cd5\u8ba9\u6574\u884c\u7ed3\u679c\u53d1\u751f\u6240\u9700\u7684\u5f3a\u5236\u8f6c\u6362\u3002</p>\n<p lang=\"zh\">\u6211\u4eec\u65e2\u53ef\u4ee5\u628a\u8fd9\u4e2a\u51fd\u6570\u76f4\u63a5\u5f53\u4f5c\u503c\u8868\u8fbe\u5f0f\u8c03\u7528\uff1a</p>\n<pre class=\"screen\">SELECT new_emp();\n\n         new_emp\n--------------------------\n (None,1000.0,25,\"(2,2)\")\n</pre>\n<p lang=\"zh\">\u4e5f\u53ef\u4ee5\u628a\u5b83\u5f53\u4f5c\u8868\u51fd\u6570\u6765\u8c03\u7528\uff1a</p>\n<pre class=\"screen\">SELECT * FROM new_emp();\n\n name | salary | age | cubicle\n------+--------+-----+---------\n None | 1000.0 |  25 | (2,2)\n</pre>\n<p lang=\"zh\">\u7b2c\u4e8c\u79cd\u65b9\u5f0f\u4f1a\u5728<a class=\"xref\" href=\"/docs/16/xfunc-sql.html#XFUNC-SQL-TABLE-FUNCTIONS\" title=\"38.5.8.\u00a0SQL \u51fd\u6570\u4f5c\u4e3a\u8868\u6765\u6e90\">\u7b2c\u00a038.5.8\u00a0\u8282</a>\u4e2d\u8fdb\u4e00\u6b65\u8bf4\u660e\u3002</p>\n<p lang=\"zh\">\u5f53\u4f60\u4f7f\u7528\u8fd4\u56de\u590d\u5408\u7c7b\u578b\u7684\u51fd\u6570\u65f6\uff0c\u53ef\u80fd\u53ea\u9700\u8981\u53d6\u5176\u7ed3\u679c\u4e2d\u7684\u4e00\u4e2a\u5b57\u6bb5\uff08\u5c5e\u6027\uff09\u3002\u53ef\u4ee5\u4f7f\u7528\u4e0b\u9762\u8fd9\u6837\u7684\u8bed\u6cd5\uff1a</p>\n<pre class=\"screen\">SELECT (new_emp()).name;\n\n name\n------\n None\n</pre>\n<p lang=\"zh\">\u8fd9\u91cc\u9700\u8981\u989d\u5916\u7684\u62ec\u53f7\uff0c\u4ee5\u514d\u89e3\u6790\u5668\u4ea7\u751f\u6b67\u4e49\u3002\u5982\u679c\u4e0d\u52a0\u62ec\u53f7\uff0c\u7ed3\u679c\u4f1a\u662f\u8fd9\u6837\uff1a</p>\n<pre class=\"screen\">SELECT new_emp().name;\nERROR:  syntax error at or near \".\"\nLINE 1: SELECT new_emp().name;\n                        ^\n</pre>\n<p lang=\"zh\">\u53e6\u4e00\u79cd\u9009\u62e9\u662f\u4f7f\u7528\u51fd\u6570\u8bb0\u6cd5\u6765\u63d0\u53d6\u5c5e\u6027\uff1a</p>\n<pre class=\"screen\">SELECT name(new_emp());\n\n name\n------\n None\n</pre>\n<p lang=\"zh\">\u5982<a class=\"xref\" href=\"/docs/16/rowtypes.html#ROWTYPES-USAGE\" title=\"8.16.5.\u00a0\u5728\u67e5\u8be2\u4e2d\u4f7f\u7528\u590d\u5408\u7c7b\u578b\">\u7b2c\u00a08.16.5\u00a0\u8282</a>\u6240\u8ff0\uff0c\u5b57\u6bb5\u8bb0\u6cd5\u548c\u51fd\u6570\u8bb0\u6cd5\u662f\u7b49\u4ef7\u7684\u3002</p>\n<p lang=\"zh\">\u53e6\u4e00\u79cd\u4f7f\u7528\u51fd\u6570\u8fd4\u56de\u590d\u5408\u7c7b\u578b\u7684\u65b9\u6cd5\u662f\u5c06\u7ed3\u679c\u4f20\u9012\u7ed9\u53e6\u4e00\u4e2a\u63a5\u53d7\u6b63\u786e\u884c\u7c7b\u578b\u4f5c\u4e3a\u8f93\u5165\u7684\u51fd\u6570\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION getname(emp) RETURNS text AS $$\n    SELECT $1.name;\n$$ LANGUAGE SQL;\n\nSELECT getname(new_emp());\n getname\n---------\n None\n(1 row)\n</pre>\n</div>\n<div class=\"sect2\" id=\"XFUNC-OUTPUT-PARAMETERS\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/16/xfunc-sql.html#XFUNC-OUTPUT-PARAMETERS\">38.5.4. \u5e26\u6709\u8f93\u51fa\u53c2\u6570\u7684<acronym class=\"acronym\">SQL</acronym>\u51fd\u6570</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\">\u63cf\u8ff0\u51fd\u6570\u7ed3\u679c\u7684\u53e6\u4e00\u79cd\u65b9\u6cd5\u662f\u4f7f\u7528<em class=\"firstterm\">\u8f93\u51fa\u53c2\u6570</em>\uff0c\u4f8b\u5982\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION add_em (IN x int, IN y int, OUT sum int)\nAS 'SELECT x + y'\nLANGUAGE SQL;\n\nSELECT add_em(3,7);\n add_em\n--------\n     10\n(1 row)\n</pre>\n<p lang=\"zh\">\u8fd9\u4e0e<a class=\"xref\" href=\"/docs/16/xfunc-sql.html#XFUNC-SQL-BASE-FUNCTIONS\" title=\"38.5.2.\u00a0\u57fa\u7840\u7c7b\u578b\u4e0a\u7684SQL\u51fd\u6570\">\u7b2c\u00a038.5.2\u00a0\u8282</a>\u4e2d\u5c55\u793a\u7684 <code class=\"literal\">add_em</code> \u7248\u672c\u672c\u8d28\u4e0a\u5e76\u65e0\u4e0d\u540c\u3002\u8f93\u51fa\u53c2\u6570\u7684\u771f\u6b63\u4ef7\u503c\u5728\u4e8e\uff0c\u5b83\u4eec\u4e3a\u5b9a\u4e49\u8fd4\u56de\u591a\u5217\u7684\u51fd\u6570\u63d0\u4f9b\u4e86\u4e00\u79cd\u65b9\u4fbf\u7684\u65b9\u6cd5\u3002\u4f8b\u5982\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION sum_n_product (x int, y int, OUT sum int, OUT product int)\nAS 'SELECT x + y, x * y'\nLANGUAGE SQL;\n\n SELECT * FROM sum_n_product(11,42);\n sum | product\n-----+---------\n  53 |     462\n(1 row)\n</pre>\n<p lang=\"zh\">\u8fd9\u91cc\u672c\u8d28\u4e0a\u53d1\u751f\u7684\u4e8b\u60c5\u662f\uff1a\u6211\u4eec\u4e3a\u8be5\u51fd\u6570\u7684\u7ed3\u679c\u521b\u5efa\u4e86\u4e00\u4e2a\u533f\u540d\u590d\u5408\u7c7b\u578b\u3002\u4e0a\u9762\u7684\u793a\u4f8b\u4e0e\u4e0b\u9762\u8fd9\u79cd\u5199\u6cd5\u7684\u6700\u7ec8\u6548\u679c\u76f8\u540c\uff1a</p>\n<pre class=\"screen\">CREATE TYPE sum_prod AS (sum int, product int);\n\nCREATE FUNCTION sum_n_product (int, int) RETURNS sum_prod\nAS 'SELECT $1 + $2, $1 * $2'\nLANGUAGE SQL;\n</pre>\n<p lang=\"zh\">\u4f46\u901a\u5e38\u4e0d\u5fc5\u989d\u5916\u5b9a\u4e49\u4e00\u4e2a\u72ec\u7acb\u7684\u590d\u5408\u7c7b\u578b\u4f1a\u66f4\u65b9\u4fbf\u3002\u6ce8\u610f\uff0c\u9644\u5728\u8f93\u51fa\u53c2\u6570\u4e0a\u7684\u540d\u79f0\u5e76\u975e\u53ea\u662f\u88c5\u9970\uff0c\u5b83\u4eec\u51b3\u5b9a\u4e86\u8fd9\u4e2a\u533f\u540d\u590d\u5408\u7c7b\u578b\u7684\u5217\u540d\u3002\uff08\u5982\u679c\u7701\u7565\u8f93\u51fa\u53c2\u6570\u540d\u79f0\uff0c\u7cfb\u7edf\u4f1a\u81ea\u884c\u9009\u62e9\u4e00\u4e2a\u540d\u79f0\u3002\uff09</p>\n<p lang=\"zh\">\u5728\u4ece SQL \u8c03\u7528\u8fd9\u6837\u4e00\u4e2a\u51fd\u6570\u65f6\uff0c\u8f93\u51fa\u53c2\u6570\u4e0d\u4f1a\u88ab\u5305\u62ec\u5728\u8c03\u7528\u53c2\u6570\u5217\u8868\u4e2d\u3002\u8fd9\u662f\u56e0\u4e3a<span class=\"productname\">PostgreSQL</span>\u53ea\u8003\u8651\u8f93\u5165\u53c2\u6570\u6765\u5b9a\u4e49\u51fd\u6570\u7684\u8c03\u7528\u7b7e\u540d\u3002\u8fd9\u4e5f\u610f\u5473\u7740\u5728\u4e3a\u8bf8\u5982\u5220\u9664\u51fd\u6570\u7b49\u76ee\u7684\u5f15\u7528\u8be5\u51fd\u6570\u65f6\u53ea\u6709\u8f93\u5165\u53c2\u6570\u6709\u5173\u7cfb\u3002\u6211\u4eec\u53ef\u4ee5\u7528\u4e0b\u9762\u7684\u547d\u4ee4\u4e4b\u4e00\u5220\u9664\u4e0a\u8ff0\u51fd\u6570</p>\n<pre class=\"screen\">DROP FUNCTION sum_n_product (x int, y int, OUT sum int, OUT product int);\nDROP FUNCTION sum_n_product (int, int);\n</pre>\n<p lang=\"zh\">\u53c2\u6570\u53ef\u4ee5\u88ab\u6807\u8bb0\u4e3a<code class=\"literal\">IN</code>\uff08\u9ed8\u8ba4\uff09\u3001<code class=\"literal\">OUT</code>\u3001<code class=\"literal\">INOUT</code>\u6216\u8005<code class=\"literal\">VARIADIC</code>\u3002\u4e00\u4e2a<code class=\"literal\">INOUT</code>\u53c2\u6570\u65e2\u4f5c\u4e3a\u4e00\u4e2a\u8f93\u5165\u53c2\u6570\uff08\u8c03\u7528\u53c2\u6570\u5217\u8868\u7684\u4e00\u90e8\u5206\uff09\u53c8\u4f5c\u4e3a\u4e00\u4e2a\u8f93\u51fa\u53c2\u6570\uff08\u7ed3\u679c\u8bb0\u5f55\u7c7b\u578b\u7684\u4e00\u90e8\u5206\uff09\u3002<code class=\"literal\">VARIADIC</code>\u53c2\u6570\u662f\u8f93\u5165\u53c2\u6570\uff0c\u4f46\u88ab\u6309\u7167\u4e0b\u6587\u6240\u8ff0\u7279\u6b8a\u5bf9\u5f85\u3002</p>\n</div>\n<div class=\"sect2\" id=\"XFUNC-OUTPUT-PARAMETERS-PROC\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/16/xfunc-sql.html#XFUNC-OUTPUT-PARAMETERS-PROC\">38.5.5. \u5e26\u6709\u8f93\u51fa\u53c2\u6570\u7684<acronym class=\"acronym\">SQL</acronym>\u8fc7\u7a0b</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\">\u8fc7\u7a0b\u4e5f\u652f\u6301\u8f93\u51fa\u53c2\u6570\uff0c\u4f46\u662f\u5b83\u4eec\u7684\u5de5\u4f5c\u65b9\u5f0f\u4e0e\u51fd\u6570\u7565\u6709\u4e0d\u540c\u3002\u5728<code class=\"command\">CALL</code>\u547d\u4ee4\u4e2d\uff0c\u8f93\u51fa\u53c2\u6570\u5fc5\u987b\u5305\u62ec\u5728\u53c2\u6570\u5217\u8868\u4e2d\u3002\u4f8b\u5982\uff0c\u524d\u9762\u7684\u94f6\u884c\u8d26\u6237\u501f\u8bb0\u4f8b\u7a0b\u53ef\u4ee5\u50cf\u8fd9\u6837\u5199\uff1a</p>\n<pre class=\"programlisting\">CREATE PROCEDURE tp1 (accountno integer, debit numeric, OUT new_balance numeric) AS $$\n    UPDATE bank\n        SET balance = balance - debit\n        WHERE accountno = tp1.accountno\n    RETURNING balance;\n$$ LANGUAGE SQL;\n</pre>\n<p lang=\"zh\">\u8981\u8c03\u7528\u8fd9\u4e2a\u4f8b\u7a0b\uff0c\u5fc5\u987b\u5305\u62ec\u5339\u914d<code class=\"literal\">OUT</code>\u53c2\u6570\u7684\u53c2\u6570\u3002\u901a\u5e38\u5199\u6210<code class=\"literal\">NULL</code>\uff1a</p>\n<pre class=\"programlisting\">CALL tp1(17, 100.0, NULL);\n</pre>\n<p lang=\"zh\">\u5982\u679c\u4f60\u5199\u7684\u662f\u5176\u4ed6\u5185\u5bb9\uff0c\u5b83\u5fc5\u987b\u662f\u4e00\u4e2a\u80fd\u591f\u50cf\u8f93\u5165\u53c2\u6570\u90a3\u6837\u88ab\u9690\u5f0f\u5f3a\u5236\u8f6c\u6362\u6210\u8be5\u53c2\u6570\u58f0\u660e\u7c7b\u578b\u7684\u8868\u8fbe\u5f0f\u3002\u4e0d\u8fc7\u8981\u6ce8\u610f\uff0c\u8fd9\u6837\u7684\u8868\u8fbe\u5f0f\u4e0d\u4f1a\u88ab\u6c42\u503c\u3002</p>\n<p lang=\"zh\">\u5f53\u4ece<span class=\"application\">PL/pgSQL</span>\u8c03\u7528\u8fc7\u7a0b\u65f6\uff0c\u4f60\u4e0d\u80fd\u5199<code class=\"literal\">NULL</code>\uff0c\u800c\u5fc5\u987b\u5199\u4e00\u4e2a\u7528\u4e8e\u63a5\u6536\u8fc7\u7a0b\u8f93\u51fa\u7684\u53d8\u91cf\u3002\u8be6\u89c1<a class=\"xref\" href=\"/docs/16/plpgsql-control-structures.html#PLPGSQL-STATEMENTS-CALLING-PROCEDURE\" title=\"43.6.3.\u00a0\u8c03\u7528\u8fc7\u7a0b\">\u7b2c\u00a043.6.3\u00a0\u8282</a>\u3002</p>\n</div>\n<div class=\"sect2\" id=\"XFUNC-SQL-VARIADIC-FUNCTIONS\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/16/xfunc-sql.html#XFUNC-SQL-VARIADIC-FUNCTIONS\">38.5.6. \u5e26\u6709\u53ef\u53d8\u6570\u91cf\u53c2\u6570\u7684<acronym class=\"acronym\">SQL</acronym>\u51fd\u6570</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\"><acronym class=\"acronym\">SQL</acronym> \u51fd\u6570\u53ef\u4ee5\u88ab\u58f0\u660e\u4e3a\u63a5\u53d7\u53ef\u53d8\u6570\u91cf\u7684\u53c2\u6570\uff0c\u53ea\u8981\u6240\u6709<span class=\"quote\">\u201c<span class=\"quote\">\u53ef\u9009</span>\u201d</span>\u53c2\u6570\u90fd\u5c5e\u4e8e\u540c\u4e00\u79cd\u6570\u636e\u7c7b\u578b\u3002\u53ef\u9009\u53c2\u6570\u4f1a\u4ee5\u6570\u7ec4\u5f62\u5f0f\u4f20\u9012\u7ed9\u51fd\u6570\u3002\u5b9a\u4e49\u8fd9\u7c7b\u51fd\u6570\u65f6\uff0c\u9700\u8981\u628a\u6700\u540e\u4e00\u4e2a\u53c2\u6570\u6807\u8bb0\u4e3a <code class=\"literal\">VARIADIC</code>\uff1b\u8be5\u53c2\u6570\u5fc5\u987b\u88ab\u58f0\u660e\u4e3a\u6570\u7ec4\u7c7b\u578b\u3002\u4f8b\u5982\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION mleast(VARIADIC arr numeric[]) RETURNS numeric AS $$\n    SELECT min($1[i]) FROM generate_subscripts($1, 1) g(i);\n$$ LANGUAGE SQL;\n\nSELECT mleast(10, -1, 5, 4.4);\n mleast\n--------\n     -1\n(1 row)\n</pre>\n<p lang=\"zh\">\u5b9e\u9645\u4e0a\uff0c\u4f4d\u4e8e <code class=\"literal\">VARIADIC</code> \u4f4d\u7f6e\u53ca\u4e4b\u540e\u7684\u6240\u6709\u5b9e\u53c2\u90fd\u4f1a\u88ab\u6536\u96c6\u6210\u4e00\u4e2a\u4e00\u7ef4\u6570\u7ec4\uff0c\u5c31\u50cf\u4f60\u5199\u6210\u4e86\uff1a</p>\n<pre class=\"screen\">SELECT mleast(ARRAY[10, -1, 5, 4.4]);    -- doesn't work\n</pre>\n<p lang=\"zh\">\u4e0d\u8fc7\u4f60\u5b9e\u9645\u4e0a\u4e0d\u80fd\u8fd9\u6837\u5199\uff0c\u81f3\u5c11\u5b83\u4e0d\u4f1a\u5339\u914d\u8fd9\u4e2a\u51fd\u6570\u5b9a\u4e49\u3002\u88ab\u6807\u8bb0\u4e3a <code class=\"literal\">VARIADIC</code> \u7684\u53c2\u6570\u5339\u914d\u7684\u662f\u5176\u5143\u7d20\u7c7b\u578b\u51fa\u73b0\u4e00\u6b21\u6216\u591a\u6b21\uff0c\u800c\u4e0d\u662f\u5b83\u81ea\u8eab\u7684\u6570\u7ec4\u7c7b\u578b\u3002</p>\n<p lang=\"zh\">\u6709\u65f6\u5019\uff0c\u80fd\u591f\u628a\u4e00\u4e2a\u5df2\u7ecf\u6784\u9020\u597d\u7684\u6570\u7ec4\u4f20\u7ed9\u53ef\u53d8\u53c2\u6570\u51fd\u6570\u4f1a\u5f88\u6709\u7528\uff0c\u5c24\u5176\u662f\u5f53\u4e00\u4e2a\u53ef\u53d8\u53c2\u6570\u51fd\u6570\u60f3\u628a\u5b83\u7684\u6570\u7ec4\u53c2\u6570\u518d\u4f20\u7ed9\u53e6\u4e00\u4e2a\u51fd\u6570\u65f6\u3002\u6b64\u5916\uff0c\u5728\u5141\u8bb8\u4e0d\u53d7\u4fe1\u4efb\u7528\u6237\u521b\u5efa\u5bf9\u8c61\u7684\u6a21\u5f0f\u4e2d\u8c03\u7528\u53ef\u53d8\u53c2\u6570\u51fd\u6570\u65f6\uff0c\u8fd9\u662f\u552f\u4e00\u5b89\u5168\u7684\u65b9\u5f0f\uff0c\u89c1<a class=\"xref\" href=\"/docs/16/typeconv-func.html\" title=\"10.3.\u00a0\u51fd\u6570\">\u7b2c\u00a010.3\u00a0\u8282</a>\u3002\u4f60\u53ef\u4ee5\u5728\u8c03\u7528\u4e2d\u6307\u5b9a<code class=\"literal\">VARIADIC</code>\u6765\u505a\u5230\u8fd9\u4e00\u70b9\uff1a</p>\n<pre class=\"screen\">SELECT mleast(VARIADIC ARRAY[10, -1, 5, 4.4]);\n</pre>\n<p lang=\"zh\">\u8fd9\u6837\u4f1a\u963b\u6b62\u51fd\u6570\u7684\u53ef\u53d8\u53c2\u6570\u6309\u5176\u5143\u7d20\u7c7b\u578b\u5c55\u5f00\uff0c\u4ece\u800c\u8ba9\u6570\u7ec4\u5b9e\u53c2\u80fd\u591f\u6309\u5e38\u89c4\u65b9\u5f0f\u5339\u914d\u3002<code class=\"literal\">VARIADIC</code> \u53ea\u80fd\u9644\u52a0\u5728\u51fd\u6570\u8c03\u7528\u7684\u6700\u540e\u4e00\u4e2a\u5b9e\u53c2\u4e0a\u3002</p>\n<p lang=\"zh\">\u5728\u8c03\u7528\u4e2d\u6307\u5b9a<code class=\"literal\">VARIADIC</code>\u4e5f\u662f\u5411\u53ef\u53d8\u53c2\u6570\u51fd\u6570\u4f20\u9012\u7a7a\u6570\u7ec4\u7684\u552f\u4e00\u65b9\u5f0f\uff0c\u4f8b\u5982\uff1a</p>\n<pre class=\"screen\">SELECT mleast(VARIADIC ARRAY[]::numeric[]);\n</pre>\n<p lang=\"zh\">\u4ec5\u4ec5\u5199\u6210<code class=\"literal\">SELECT mleast()</code>\u662f\u884c\u4e0d\u901a\u7684\uff0c\u56e0\u4e3a\u53ef\u53d8\u53c2\u6570\u5fc5\u987b\u5339\u914d\u81f3\u5c11\u4e00\u4e2a\u5b9e\u53c2\u3002\uff08\u5982\u679c\u4f60\u5e0c\u671b\u5141\u8bb8\u8fd9\u79cd\u8c03\u7528\uff0c\u53ef\u4ee5\u518d\u5b9a\u4e49\u4e00\u4e2a\u540c\u540d\u4e14\u4e0d\u5e26\u53c2\u6570\u7684\u51fd\u6570<code class=\"literal\">mleast</code>\u3002\uff09</p>\n<p lang=\"zh\">\u4ece\u53ef\u53d8\u53c2\u6570\u6d3e\u751f\u51fa\u7684\u6570\u7ec4\u5143\u7d20\u53c2\u6570\u4f1a\u88ab\u89c6\u4e3a\u6ca1\u6709\u81ea\u5df1\u7684\u540d\u5b57\u3002\u8fd9\u610f\u5473\u7740\u9664\u975e\u4f60\u6307\u5b9a\u4e86 <code class=\"literal\">VARIADIC</code>\uff0c\u5426\u5219\u4e0d\u80fd\u4f7f\u7528\u547d\u540d\u53c2\u6570\u6765\u8c03\u7528\u53ef\u53d8\u53c2\u6570\u51fd\u6570\uff08<a class=\"xref\" href=\"/docs/16/sql-syntax-calling-funcs.html\" title=\"4.3.\u00a0\u8c03\u7528\u51fd\u6570\">\u7b2c\u00a04.3\u00a0\u8282</a>\uff09\u3002\u4f8b\u5982\uff0c\u4e0b\u9762\u7684\u8c03\u7528\u662f\u53ef\u884c\u7684\uff1a</p>\n<pre class=\"screen\">SELECT mleast(VARIADIC arr =&gt; ARRAY[10, -1, 5, 4.4]);\n</pre>\n<p lang=\"zh\">\u4f46\u8fd9\u4e9b\u5c31\u4e0d\u884c\uff1a</p>\n<pre class=\"screen\">SELECT mleast(arr =&gt; 10);\nSELECT mleast(arr =&gt; ARRAY[10, -1, 5, 4.4]);\n</pre>\n</div>\n<div class=\"sect2\" id=\"XFUNC-SQL-PARAMETER-DEFAULTS\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/16/xfunc-sql.html#XFUNC-SQL-PARAMETER-DEFAULTS\">38.5.7. \u5e26\u6709\u53c2\u6570\u9ed8\u8ba4\u503c\u7684<acronym class=\"acronym\">SQL</acronym>\u51fd\u6570</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\">\u51fd\u6570\u53ef\u4ee5\u88ab\u58f0\u660e\u4e3a\u5bf9\u4e00\u4e9b\u6216\u8005\u6240\u6709\u8f93\u5165\u53c2\u6570\u5177\u6709\u9ed8\u8ba4\u503c\u3002\u53ea\u8981\u8c03\u7528\u51fd\u6570\u65f6\u6ca1\u6709\u7ed9\u51fa\u8db3\u591f\u591a\u7684\u5b9e\u53c2\uff0c\u5c31\u4f1a\u63d2\u5165\u9ed8\u8ba4\u503c\u6765\u5f25\u8865\u7f3a\u5931\u7684\u5b9e\u53c2\u3002\u7531\u4e8e\u53c2\u6570\u53ea\u80fd\u4ece\u5b9e\u53c2\u5217\u8868\u7684\u5c3e\u90e8\u5f00\u59cb\u88ab\u7701\u7565\uff0c\u5728\u4e00\u4e2a\u6709\u9ed8\u8ba4\u503c\u7684\u53c2\u6570\u4e4b\u540e\u7684\u6240\u6709\u53c2\u6570\u90fd\u4e0d\u5f97\u4e0d\u4e5f\u5177\u6709\u9ed8\u8ba4\u503c\uff08\u5c3d\u7ba1\u4f7f\u7528\u547d\u540d\u53c2\u6570\u8bb0\u6cd5\u53ef\u4ee5\u5141\u8bb8\u653e\u677e\u8fd9\u79cd\u9650\u5236\uff0c\u8fd9\u79cd\u9650\u5236\u4ecd\u7136\u4f1a\u88ab\u5f3a\u5236\u4ee5\u4fbf\u4f4d\u7f6e\u53c2\u6570\u8bb0\u6cd5\u80fd\u5de5\u4f5c\uff09\u3002\u4e0d\u7ba1\u4f60\u662f\u5426\u4f7f\u7528\u5b83\uff0c\u8fd9\u79cd\u80fd\u529b\u90fd\u8981\u6c42\u5728\u67d0\u4e9b\u7528\u6237\u4e0d\u4fe1\u4efb\u5176\u4ed6\u7528\u6237\u7684\u6570\u636e\u5e93\u4e2d\u8c03\u7528\u51fd\u6570\u65f6\u91c7\u53d6\u4e00\u4e9b\u9884\u9632\u63aa\u65bd\uff0c\u89c1<a class=\"xref\" href=\"/docs/16/typeconv-func.html\" title=\"10.3.\u00a0\u51fd\u6570\">\u7b2c\u00a010.3\u00a0\u8282</a>\u3002</p>\n<p lang=\"zh\">\u4f8b\u5982\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION foo(a int, b int DEFAULT 2, c int DEFAULT 3)\nRETURNS int\nLANGUAGE SQL\nAS $$\n    SELECT $1 + $2 + $3;\n$$;\n\nSELECT foo(10, 20, 30);\n foo\n-----\n  60\n(1 row)\n\nSELECT foo(10, 20);\n foo\n-----\n  33\n(1 row)\n\nSELECT foo(10);\n foo\n-----\n  15\n(1 row)\n\nSELECT foo();  -- fails since there is no default for the first argument\nERROR:  function foo() does not exist\n</pre>\n<p lang=\"zh\">\u4e5f\u53ef\u4ee5\u7528 <code class=\"literal\">=</code> \u7b26\u53f7\u4ee3\u66ff\u5173\u952e\u5b57 <code class=\"literal\">DEFAULT</code>\u3002</p>\n</div>\n<div class=\"sect2\" id=\"XFUNC-SQL-TABLE-FUNCTIONS\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/16/xfunc-sql.html#XFUNC-SQL-TABLE-FUNCTIONS\">38.5.8. <acronym class=\"acronym\">SQL</acronym> \u51fd\u6570\u4f5c\u4e3a\u8868\u6765\u6e90</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\">\u6240\u6709\u7684 SQL \u51fd\u6570\u90fd\u53ef\u4ee5\u88ab\u7528\u5728\u67e5\u8be2\u7684<code class=\"literal\">FROM</code>\u5b50\u53e5\u4e2d\uff0c\u4f46\u662f\u5bf9\u4e8e\u8fd4\u56de\u590d\u5408\u7c7b\u578b\u7684\u51fd\u6570\u7279\u522b\u6709\u7528\u3002\u5982\u679c\u51fd\u6570\u88ab\u5b9a\u4e49\u4e3a\u8fd4\u56de\u4e00\u79cd\u57fa\u7840\u7c7b\u578b\uff0c\u8be5\u8868\u51fd\u6570\u4f1a\u4ea7\u751f\u4e00\u4e2a\u5355\u5217\u8868\u3002\u5982\u679c\u8be5\u51fd\u6570\u88ab\u5b9a\u4e49\u4e3a\u8fd4\u56de\u4e00\u79cd\u590d\u5408\u7c7b\u578b\uff0c\u8be5\u8868\u51fd\u6570\u4f1a\u4e3a\u8be5\u590d\u5408\u7c7b\u578b\u7684\u6bcf\u4e00\u4e2a\u5c5e\u6027\u4ea7\u751f\u4e00\u5217\u3002</p>\n<p lang=\"zh\">\u4ee5\u4e0b\u662f\u4e00\u4e2a\u793a\u4f8b\uff1a</p>\n<pre class=\"screen\">CREATE TABLE foo (fooid int, foosubid int, fooname text);\nINSERT INTO foo VALUES (1, 1, 'Joe');\nINSERT INTO foo VALUES (1, 2, 'Ed');\nINSERT INTO foo VALUES (2, 1, 'Mary');\n\nCREATE FUNCTION getfoo(int) RETURNS foo AS $$\n    SELECT * FROM foo WHERE fooid = $1;\n$$ LANGUAGE SQL;\n\nSELECT *, upper(fooname) FROM getfoo(1) AS t1;\n\n fooid | foosubid | fooname | upper\n-------+----------+---------+-------\n     1 |        1 | Joe     | JOE\n(1 row)\n</pre>\n<p lang=\"zh\">\u5982\u793a\u4f8b\u6240\u793a\uff0c\u6211\u4eec\u53ef\u4ee5\u50cf\u64cd\u4f5c\u666e\u901a\u8868\u7684\u5217\u4e00\u6837\u64cd\u4f5c\u51fd\u6570\u7ed3\u679c\u4e2d\u7684\u5217\u3002</p>\n<p lang=\"zh\">\u6ce8\u610f\u6211\u4eec\u53ea\u4ece\u51fd\u6570\u5f97\u5230\u4e86\u4e00\u884c\u3002\u8fd9\u662f\u56e0\u4e3a\u6211\u4eec\u6ca1\u6709\u4f7f\u7528<code class=\"literal\">SETOF</code>\u3002\u8fd9\u4f1a\u5728\u4e0b\u4e00\u8282\u4e2d\u4ecb\u7ecd\u3002</p>\n</div>\n<div class=\"sect2\" id=\"XFUNC-SQL-FUNCTIONS-RETURNING-SET\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/16/xfunc-sql.html#XFUNC-SQL-FUNCTIONS-RETURNING-SET\">38.5.9. \u8fd4\u56de\u96c6\u5408\u7684<acronym class=\"acronym\">SQL</acronym>\u51fd\u6570</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\">\u5f53\u4e00\u4e2a SQL \u51fd\u6570\u88ab\u58f0\u660e\u4e3a\u8fd4\u56de<code class=\"literal\">SETOF <em class=\"replaceable\"><code>sometype</code></em></code>\u65f6\uff0c\u8be5\u51fd\u6570\u7684\u6700\u540e\u4e00\u4e2a\u67e5\u8be2\u4f1a\u88ab\u6267\u884c\u5b8c\uff0c\u5e76\u4e14\u5b83\u8f93\u51fa\u7684\u6bcf\u4e00\u884c\u90fd\u4f1a\u88ab\u4f5c\u4e3a\u7ed3\u679c\u96c6\u7684\u4e00\u4e2a\u5143\u7d20\u8fd4\u56de\u3002</p>\n<p lang=\"zh\">\u8fd9\u4e00\u7279\u6027\u901a\u5e38\u662f\u5728\u67e5\u8be2\u7684 <code class=\"literal\">FROM</code> \u5b50\u53e5\u4e2d\u8c03\u7528\u51fd\u6570\u65f6\u4f7f\u7528\u7684\u3002\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b\uff0c\u51fd\u6570\u8fd4\u56de\u7684\u6bcf\u4e00\u884c\u90fd\u4f1a\u6210\u4e3a\u67e5\u8be2\u6240\u89c1\u8868\u4e2d\u7684\u4e00\u884c\u3002\u4f8b\u5982\uff0c\u5047\u8bbe\u8868 <code class=\"literal\">foo</code> \u4e0e\u4e0a\u6587\u76f8\u540c\uff0c\u6211\u4eec\u5199\uff1a</p>\n<pre class=\"programlisting\">CREATE FUNCTION getfoo(int) RETURNS SETOF foo AS $$\n    SELECT * FROM foo WHERE fooid = $1;\n$$ LANGUAGE SQL;\n\nSELECT * FROM getfoo(1) AS t1;\n</pre>\n<p lang=\"zh\">\u90a3\u4e48\u4f1a\u5f97\u5230\uff1a</p>\n<pre class=\"screen\"> fooid | foosubid | fooname\n-------+----------+---------\n     1 |        1 | Joe\n     1 |        2 | Ed\n(2 rows)\n</pre>\n<p lang=\"zh\">\u4e5f\u53ef\u4ee5\u901a\u8fc7\u8f93\u51fa\u53c2\u6570\u5b9a\u4e49\u7684\u5217\u6765\u8fd4\u56de\u591a\u884c\uff0c\u4f8b\u5982\uff1a</p>\n<pre class=\"programlisting\">CREATE TABLE tab (y int, z int);\nINSERT INTO tab VALUES (1, 2), (3, 4), (5, 6), (7, 8);\n\nCREATE FUNCTION sum_n_product_with_tab (x int, OUT sum int, OUT product int)\nRETURNS SETOF record\nAS $$\n    SELECT $1 + tab.y, $1 * tab.y FROM tab;\n$$ LANGUAGE SQL;\n\nSELECT * FROM sum_n_product_with_tab(10);\n sum | product\n-----+---------\n  11 |      10\n  13 |      30\n  15 |      50\n  17 |      70\n(4 rows)\n</pre>\n<p lang=\"zh\">\u8fd9\u91cc\u7684\u5173\u952e\u70b9\u662f\uff1a\u4f60\u5fc5\u987b\u5199\u6210 <code class=\"literal\">RETURNS SETOF record</code>\uff0c\u4ee5\u8868\u660e\u8be5\u51fd\u6570\u8fd4\u56de\u7684\u662f\u591a\u884c\u800c\u4e0d\u662f\u5355\u884c\u3002\u5982\u679c\u53ea\u6709\u4e00\u4e2a\u8f93\u51fa\u53c2\u6570\uff0c\u5219\u5199\u8be5\u53c2\u6570\u7684\u7c7b\u578b\uff0c\u800c\u4e0d\u662f <code class=\"type\">record</code>\u3002</p>\n<p lang=\"zh\">\u901a\u8fc7\u591a\u6b21\u8c03\u7528\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u6765\u6784\u9020\u67e5\u8be2\u7ed3\u679c\u901a\u5e38\u5f88\u6709\u7528\uff0c\u5176\u4e2d\u6bcf\u6b21\u8c03\u7528\u7684\u53c2\u6570\u90fd\u6765\u81ea\u8868\u6216\u5b50\u67e5\u8be2\u7684\u8fde\u7eed\u884c\u3002\u9996\u9009\u65b9\u5f0f\u662f\u4f7f\u7528 <code class=\"literal\">LATERAL</code> \u5173\u952e\u5b57\uff0c\u8be6\u89c1<a class=\"xref\" href=\"/docs/16/queries-table-expressions.html#QUERIES-LATERAL\" title=\"7.2.1.5.\u00a0LATERAL\u5b50\u67e5\u8be2\">\u7b2c\u00a07.2.1.5\u00a0\u8282</a>\u3002\u4e0b\u9762\u662f\u4e00\u4e2a\u4f7f\u7528\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u679a\u4e3e\u6811\u7ed3\u6784\u5143\u7d20\u7684\u793a\u4f8b\uff1a</p>\n<pre class=\"screen\">SELECT * FROM nodes;\n   name    | parent\n-----------+--------\n Top       |\n Child1    | Top\n Child2    | Top\n Child3    | Top\n SubChild1 | Child1\n SubChild2 | Child1\n(6 rows)\n\nCREATE FUNCTION listchildren(text) RETURNS SETOF text AS $$\n    SELECT name FROM nodes WHERE parent = $1\n$$ LANGUAGE SQL STABLE;\n\nSELECT * FROM listchildren('Top');\n listchildren\n--------------\n Child1\n Child2\n Child3\n(3 rows)\n\nSELECT name, child FROM nodes, LATERAL listchildren(name) AS child;\n  name  |   child\n--------+-----------\n Top    | Child1\n Top    | Child2\n Top    | Child3\n Child1 | SubChild1\n Child1 | SubChild2\n(5 rows)\n</pre>\n<p lang=\"zh\">\u8fd9\u4e2a\u4f8b\u5b50\u5e76\u6ca1\u6709\u505a\u51fa\u4efb\u4f55\u65e0\u6cd5\u7528\u7b80\u5355\u8fde\u63a5\u5b9e\u73b0\u7684\u4e8b\uff0c\u4f46\u5728\u66f4\u590d\u6742\u7684\u8ba1\u7b97\u4e2d\uff0c\u628a\u4e00\u90e8\u5206\u5de5\u4f5c\u653e\u8fdb\u51fd\u6570\u91cc\u901a\u5e38\u4f1a\u975e\u5e38\u65b9\u4fbf\u3002</p>\n<p lang=\"zh\">\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u4e5f\u53ef\u4ee5\u51fa\u73b0\u5728\u67e5\u8be2\u7684\u9009\u62e9\u5217\u8868\u4e2d\u3002\u5bf9\u4e8e\u67e5\u8be2\u672c\u8eab\u751f\u6210\u7684\u6bcf\u4e00\u884c\uff0c\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u90fd\u4f1a\u88ab\u8c03\u7528\uff0c\u5e76\u4e3a\u5176\u7ed3\u679c\u96c6\u4e2d\u7684\u6bcf\u4e00\u4e2a\u5143\u7d20\u751f\u6210\u4e00\u884c\u8f93\u51fa\u3002\u524d\u9762\u7684\u4f8b\u5b50\u4e5f\u53ef\u4ee5\u5199\u6210\u8fd9\u6837\uff1a</p>\n<pre class=\"screen\">SELECT listchildren('Top');\n listchildren\n--------------\n Child1\n Child2\n Child3\n(3 rows)\n\nSELECT name, listchildren(name) FROM nodes;\n  name  | listchildren\n--------+--------------\n Top    | Child1\n Top    | Child2\n Top    | Child3\n Child1 | SubChild1\n Child1 | SubChild2\n(5 rows)\n</pre>\n<p lang=\"zh\">\u5728\u6700\u540e\u4e00\u4e2a <code class=\"command\">SELECT</code> \u4e2d\uff0c\u6ce8\u610f\u6ca1\u6709\u4e3a <code class=\"literal\">Child2</code>\u3001<code class=\"literal\">Child3</code> \u7b49\u663e\u793a\u4efb\u4f55\u8f93\u51fa\u884c\u3002\u8fd9\u662f\u56e0\u4e3a <code class=\"function\">listchildren</code> \u5bf9\u8fd9\u4e9b\u53c2\u6570\u8fd4\u56de\u7684\u662f\u7a7a\u96c6\uff0c\u56e0\u6b64\u4e0d\u4f1a\u751f\u6210\u7ed3\u679c\u884c\u3002\u8fd9\u4e0e\u4f7f\u7528 <code class=\"literal\">LATERAL</code> \u8bed\u6cd5\u628a\u51fd\u6570\u7ed3\u679c\u505a\u5185\u8fde\u63a5\u65f6\u5f97\u5230\u7684\u884c\u4e3a\u76f8\u540c\u3002</p>\n<p lang=\"zh\"><span class=\"productname\">PostgreSQL</span>\u4e2d\uff0c\u5199\u5728\u67e5\u8be2\u7684\u9009\u62e9\u5217\u8868\u4e2d\u7684\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u7684\u884c\u4e3a\u51e0\u4e4e\u548c\u5199\u5728<code class=\"literal\">LATERAL FROM</code>\u5b50\u53e5\u9879\u4e2d\u7684\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u5b8c\u5168\u4e00\u6837\u3002\u4f8b\u5982\uff1a</p>\n<pre class=\"programlisting\">SELECT x, generate_series(1,5) AS g FROM tab;\n</pre>\n<p lang=\"zh\">\u51e0\u4e4e\u7b49\u6548\u4e8e</p>\n<pre class=\"programlisting\">SELECT x, g FROM tab, LATERAL generate_series(1,5) AS g;\n</pre>\n<p lang=\"zh\">\u8fd9\u4f1a\u662f\u5b8c\u5168\u4e00\u6837\u7684\uff0c\u9664\u4e86\u5728\u8fd9\u4e2a\u7279\u522b\u7684\u793a\u4f8b\u4e2d\uff0c\u89c4\u5212\u5668\u53ef\u4ee5\u9009\u62e9\u628a<code class=\"structname\">g</code>\u653e\u5728\u5d4c\u5957\u5faa\u73af\u8fde\u63a5\u7684\u5916\u4fa7\uff0c\u56e0\u4e3a<code class=\"structname\">g</code>\u5bf9<code class=\"structname\">tab</code>\u6ca1\u6709\u5b9e\u9645\u7684\u6a2a\u5411\u4f9d\u8d56\u3002\u90a3\u4f1a\u5bfc\u81f4\u4e00\u79cd\u4e0d\u540c\u7684\u8f93\u51fa\u884c\u987a\u5e8f\u3002\u9009\u62e9\u5217\u8868\u4e2d\u7684\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u603b\u662f\u4f1a\u88ab\u8ba1\u7b97\uff0c\u5c31\u597d\u50cf\u5b83\u4eec\u5728<code class=\"literal\">FROM</code>\u5b50\u53e5\u5269\u4f59\u90e8\u5206\u7684\u5d4c\u5957\u5faa\u73af\u8fde\u63a5\u7684\u5185\u4fa7\u4e00\u6837\uff0c\u56e0\u6b64\u5728\u8003\u8651\u6765\u81ea<code class=\"literal\">FROM</code>\u5b50\u53e5\u7684\u4e0b\u4e00\u884c\u4e4b\u524d\uff0c\u8fd9\u4e9b\u51fd\u6570\u4f1a\u8fd0\u884c\u5230\u5b8c\u6210\u3002</p>\n<p lang=\"zh\">\u5982\u679c\u5728\u67e5\u8be2\u7684\u9009\u62e9\u5217\u8868\u4e2d\u6709\u4e0d\u6b62\u4e00\u4e2a\u96c6\u5408\u8fd4\u56de\u51fd\u6570\uff0c\u5219\u884c\u4e3a\u7c7b\u4f3c\u4e8e\u628a\u90a3\u4e9b\u51fd\u6570\u653e\u5230\u4e00\u4e2a\u5355\u4e00\u7684<code class=\"literal\">LATERAL ROWS FROM( ... )</code> <code class=\"literal\">FROM</code>\u5b50\u53e5\u9879\u4e2d\u7684\u884c\u4e3a\u3002\u5bf9\u4e8e\u6765\u81ea\u5e95\u5c42\u67e5\u8be2\u7684\u6bcf\u4e00\u884c\uff0c\u90fd\u6709\u4e00\u4e2a\u7528\u5230\u6bcf\u4e2a\u51fd\u6570\u9996\u4e2a\u7ed3\u679c\u7684\u8f93\u51fa\u884c\uff0c\u7136\u540e\u662f\u4e00\u4e2a\u4f7f\u7528\u6bcf\u4e2a\u51fd\u6570\u7b2c\u4e8c\u4e2a\u7ed3\u679c\u7684\u8f93\u51fa\u884c\uff0c\u4ee5\u6b64\u7c7b\u63a8\u3002\u5982\u679c\u67d0\u4e9b\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u4ea7\u751f\u7684\u8f93\u51fa\u6bd4\u5176\u4ed6\u51fd\u6570\u5c11\uff0c\u4f1a\u7528\u7a7a\u503c\u4ee3\u66ff\u7f3a\u5931\u7684\u6570\u636e\uff0c\u56e0\u6b64\u4e3a\u4e00\u4e2a\u5e95\u5c42\u884c\u5f62\u6210\u7684\u603b\u884c\u6570\u7b49\u4e8e\u4ea7\u751f\u6700\u591a\u8f93\u51fa\u7684\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u7684\u8f93\u51fa\u884c\u6570\u3002\u56e0\u6b64\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u4f1a<span class=\"quote\">\u201c<span class=\"quote\">\u6b65\u8c03\u4e00\u81f4</span>\u201d</span>\u5730\u8fd0\u884c\u76f4\u5230\u5b83\u4eec\u7684\u8f93\u51fa\u88ab\u8017\u5c3d\uff0c\u7136\u540e\u7528\u4e0b\u4e00\u4e2a\u5e95\u5c42\u884c\u7ee7\u7eed\u6267\u884c\u3002</p>\n<p lang=\"zh\">\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u53ef\u4ee5\u88ab\u5d4c\u5957\u5728\u4e00\u4e2a\u9009\u62e9\u5217\u8868\u4e2d\uff0c\u4e0d\u8fc7\u5728<code class=\"literal\">FROM</code>\u5b50\u53e5\u9879\u4e2d\u4e0d\u5141\u8bb8\u8fd9\u6837\u505a\u3002\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b\uff0c\u5d4c\u5957\u7684\u6bcf\u4e00\u5c42\u4f1a\u88ab\u5355\u72ec\u5bf9\u5f85\uff0c\u5c31\u50cf\u5b83\u662f\u4e00\u4e2a\u5355\u72ec\u7684<code class=\"literal\">LATERAL ROWS FROM( ... )</code>\u9879\u4e00\u6837\u3002\u4f8b\u5982\uff0c\u5728</p>\n<pre class=\"programlisting\">SELECT srf1(srf2(x), srf3(y)), srf4(srf5(z)) FROM tab;\n</pre>\n<p lang=\"zh\">\u4e2d\uff0c\u96c6\u5408\u8fd4\u56de\u51fd\u6570<code class=\"function\">srf2</code>\u3001<code class=\"function\">srf3</code>\u548c<code class=\"function\">srf5</code>\u5c06\u4e3a<code class=\"structname\">tab</code>\u7684\u6bcf\u4e00\u884c\u6b65\u8c03\u4e00\u81f4\u5730\u8fd0\u884c\uff0c\u7136\u540e\u4f1a\u5bf9\u8f83\u4f4e\u5c42\u7684\u51fd\u6570\u4ea7\u751f\u7684\u6bcf\u4e00\u884c\u4ee5\u6b65\u8c03\u4e00\u81f4\u7684\u5f62\u5f0f\u5e94\u7528<code class=\"function\">srf1</code>\u548c<code class=\"function\">srf4</code>\u3002</p>\n<p lang=\"zh\">\u5728<code class=\"literal\">CASE</code>\u6216<code class=\"literal\">COALESCE</code>\u8fd9\u6837\u7684\u6761\u4ef6\u8ba1\u7b97\u7ed3\u6784\u4e2d\uff0c\u4e0d\u80fd\u4f7f\u7528\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u3002\u4f8b\u5982\uff0c\u8003\u8651</p>\n<pre class=\"programlisting\">SELECT x, CASE WHEN x &gt; 0 THEN generate_series(1, 5) ELSE 0 END FROM tab;\n</pre>\n<p lang=\"zh\">\u8868\u9762\u4e0a\u770b\uff0c\u8fd9\u5e94\u5f53\u8ba9 x &gt; 0 \u7684\u8f93\u5165\u884c\u91cd\u590d\u4e94\u6b21\uff0c\u5176\u4f59\u884c\u53ea\u51fa\u73b0\u4e00\u6b21\uff1b\u4f46\u5b9e\u9645\u4e0a\uff0cgenerate_series(1, 5) \u4f1a\u5728 CASE \u8868\u8fbe\u5f0f\u6c42\u503c\u4e4b\u524d\uff0c\u4f5c\u4e3a\u9690\u5f0f LATERAL FROM \u9879\u6267\u884c\uff0c\u56e0\u6b64\u6bcf\u4e2a\u8f93\u5165\u884c\u90fd\u4f1a\u91cd\u590d\u4e94\u6b21\u3002\u4e3a\u907f\u514d\u6df7\u6dc6\uff0c\u6b64\u7c7b\u5199\u6cd5\u4f1a\u5728\u89e3\u6790\u9636\u6bb5\u62a5\u9519\u3002</p>\n<div class=\"note\">\n<h3 class=\"title\" lang=\"zh\">\u6ce8\u610f</h3>\n<p lang=\"zh\">\u5982\u679c\u4e00\u4e2a\u51fd\u6570\u7684\u6700\u540e\u4e00\u6761\u547d\u4ee4\u662f <code class=\"command\">INSERT</code>\u3001<code class=\"command\">UPDATE</code> \u6216 <code class=\"command\">DELETE</code> \u5e76\u5e26\u6709 <code class=\"literal\">RETURNING</code>\uff0c\u90a3\u4e48\u5373\u4f7f\u8be5\u51fd\u6570\u6ca1\u6709\u58f0\u660e\u4e3a <code class=\"literal\">SETOF</code>\uff0c\u6216\u8005\u8c03\u7528\u5b83\u7684\u67e5\u8be2\u5e76\u672a\u53d6\u8d70\u5168\u90e8\u7ed3\u679c\u884c\uff0c\u8be5\u547d\u4ee4\u4e5f\u603b\u4f1a\u6267\u884c\u5230\u5b8c\u6210\u3002<code class=\"literal\">RETURNING</code> \u5b50\u53e5\u4ea7\u751f\u7684\u989d\u5916\u7ed3\u679c\u884c\u4f1a\u88ab\u9759\u9ed8\u4e22\u5f03\uff0c\u4f46\u76f8\u5e94\u7684\u8868\u4fee\u6539\u4ecd\u7136\u4f1a\u53d1\u751f\uff0c\u5e76\u4e14\u4f1a\u5728\u51fd\u6570\u8fd4\u56de\u524d\u5168\u90e8\u5b8c\u6210\u3002</p>\n</div>\n<div class=\"note\">\n<h3 class=\"title\" lang=\"zh\">\u6ce8\u610f</h3>\n<p lang=\"zh\">\u5728 <span class=\"productname\">PostgreSQL</span> 10 \u4e4b\u524d\uff0c\u9664\u975e\u591a\u4e2a\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u59cb\u7ec8\u4ea7\u751f\u76f8\u540c\u6570\u91cf\u7684\u884c\uff0c\u5426\u5219\u628a\u5b83\u4eec\u653e\u5728\u540c\u4e00\u4e2a\u9009\u62e9\u5217\u8868\u4e2d\u7684\u884c\u4e3a\u5e76\u4e0d\u5408\u7406\u3002\u5426\u5219\uff0c\u5f97\u5230\u7684\u8f93\u51fa\u884c\u6570\u4f1a\u662f\u8fd9\u4e9b\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u5404\u81ea\u4ea7\u751f\u884c\u6570\u7684\u6700\u5c0f\u516c\u500d\u6570\u3002\u6b64\u5916\uff0c\u5d4c\u5957\u7684\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u4e5f\u4e0d\u50cf\u4e0a\u6587\u6240\u63cf\u8ff0\u7684\u90a3\u6837\u5de5\u4f5c\uff1b\u76f8\u53cd\uff0c\u4e00\u4e2a\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u81f3\u591a\u53ea\u80fd\u6709\u4e00\u4e2a\u96c6\u5408\u8fd4\u56de\u53c2\u6570\uff0c\u5e76\u4e14\u6bcf\u4e00\u7ec4\u5d4c\u5957\u7684\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u90fd\u4f1a\u72ec\u7acb\u8fd0\u884c\u3002\u518d\u52a0\u4e0a\u8fc7\u53bb\u8fd8\u5141\u8bb8\u6761\u4ef6\u6267\u884c\uff08\u5373\u5728 <code class=\"literal\">CASE</code> \u7b49\u7ed3\u6784\u5185\u90e8\u4f7f\u7528\u96c6\u5408\u8fd4\u56de\u51fd\u6570\uff09\uff0c\u4e8b\u60c5\u5c31\u66f4\u52a0\u590d\u6742\u4e86\u3002\u5982\u679c\u4f60\u8981\u7f16\u5199\u9700\u8981\u5728\u65e7\u7248 <span class=\"productname\">PostgreSQL</span> \u4e0a\u8fd0\u884c\u7684\u67e5\u8be2\uff0c\u5efa\u8bae\u4f7f\u7528 <code class=\"literal\">LATERAL</code> \u8bed\u6cd5\uff0c\u56e0\u4e3a\u8fd9\u6837\u5728\u4e0d\u540c\u7248\u672c\u4e4b\u95f4\u80fd\u591f\u5f97\u5230\u4e00\u81f4\u7684\u7ed3\u679c\u3002\u5982\u679c\u4f60\u7684\u67e5\u8be2\u4f9d\u8d56\u4e8e\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u7684\u6761\u4ef6\u6267\u884c\uff0c\u6216\u8bb8\u53ef\u4ee5\u628a\u6761\u4ef6\u5224\u65ad\u79fb\u52a8\u5230\u81ea\u5b9a\u4e49\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u5185\u90e8\u6765\u4fee\u590d\u3002\u4f8b\u5982\uff0c</p>\n<pre class=\"programlisting\">SELECT x, CASE WHEN y &gt; 0 THEN generate_series(1, z) ELSE 5 END FROM tab;\n</pre>\n<p lang=\"zh\">\u53ef\u4ee5\u53d8\u6210</p>\n<pre class=\"programlisting\">CREATE FUNCTION case_generate_series(cond bool, start int, fin int, els int)\n  RETURNS SETOF int AS $$\nBEGIN\n  IF cond THEN\n    RETURN QUERY SELECT generate_series(start, fin);\n  ELSE\n    RETURN QUERY SELECT els;\n  END IF;\nEND$$ LANGUAGE plpgsql;\n\nSELECT x, case_generate_series(y &gt; 0, 1, z, 5) FROM tab;\n</pre>\n<p lang=\"zh\">\u8fd9\u79cd\u5199\u6cd5\u5728\u6240\u6709\u7248\u672c\u7684 <span class=\"productname\">PostgreSQL</span> \u4e2d\u7684\u884c\u4e3a\u90fd\u76f8\u540c\u3002</p>\n</div>\n</div>\n<div class=\"sect2\" id=\"XFUNC-SQL-FUNCTIONS-RETURNING-TABLE\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/16/xfunc-sql.html#XFUNC-SQL-FUNCTIONS-RETURNING-TABLE\">38.5.10. \u8fd4\u56de<code class=\"literal\">TABLE</code>\u7684<acronym class=\"acronym\">SQL</acronym>\u51fd\u6570</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\">\u8fd8\u6709\u53e6\u4e00\u79cd\u65b9\u6cd5\u53ef\u4ee5\u628a\u51fd\u6570\u58f0\u660e\u4e3a\u8fd4\u56de\u4e00\u4e2a\u96c6\u5408\uff0c\u5373\u4f7f\u7528 <code class=\"literal\">RETURNS TABLE(<em class=\"replaceable\"><code>columns</code></em>)</code>\u8bed\u6cd5\u3002\u8fd9\u7b49\u6548\u4e8e\u4f7f\u7528\u4e00\u4e2a\u6216\u8005\u591a\u4e2a<code class=\"literal\">OUT</code>\u53c2\u6570\u5916\u52a0\u628a\u51fd\u6570\u6807\u8bb0\u4e3a\u8fd4\u56de <code class=\"literal\">SETOF record</code>\uff08\u6216\u8005\u662f<code class=\"literal\">SETOF</code>\u5355\u4e2a\u8f93\u51fa\u53c2\u6570\u7684\u7c7b\u578b\uff09\u3002\u8fd9\u79cd\u5199\u6cd5\u662f\u5728\u6700\u8fd1\u7684 SQL \u6807\u51c6\u4e2d\u6307\u5b9a\u7684\uff0c\u56e0\u6b64\u53ef\u80fd\u6bd4\u4f7f\u7528 <code class=\"literal\">SETOF</code>\u7684\u79fb\u690d\u6027\u66f4\u597d\u3002</p>\n<p lang=\"zh\">\u4f8b\u5982\uff0c\u524d\u9762\u7684\u6c42\u548c\u5e76\u4e14\u76f8\u4e58\u7684\u793a\u4f8b\u4e5f\u53ef\u4ee5\u8fd9\u6837\u6765\u505a\uff1a</p>\n<pre class=\"programlisting\">CREATE FUNCTION sum_n_product_with_tab (x int)\nRETURNS TABLE(sum int, product int) AS $$\n    SELECT $1 + tab.y, $1 * tab.y FROM tab;\n$$ LANGUAGE SQL;\n</pre>\n<p lang=\"zh\">\u4e0d\u5141\u8bb8\u628a\u663e\u5f0f\u7684<code class=\"literal\">OUT</code>\u6216\u8005<code class=\"literal\">INOUT</code>\u53c2\u6570\u7528\u4e8e <code class=\"literal\">RETURNS TABLE</code>\u8bb0\u6cd5 \u2014 \u5fc5\u987b\u628a\u6240\u6709\u8f93\u51fa\u5217\u653e\u5728 <code class=\"literal\">TABLE</code>\u5217\u8868\u4e2d\u3002</p>\n</div>\n<div class=\"sect2\" id=\"XFUNC-SQL-POLYMORPHIC-FUNCTIONS\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/16/xfunc-sql.html#XFUNC-SQL-POLYMORPHIC-FUNCTIONS\">38.5.11. \u591a\u6001<acronym class=\"acronym\">SQL</acronym>\u51fd\u6570</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\"><acronym class=\"acronym\">SQL</acronym> \u51fd\u6570\u53ef\u4ee5\u88ab\u58f0\u660e\u4e3a\u63a5\u53d7\u5e76\u8fd4\u56de<a class=\"xref\" href=\"/docs/16/extend-type-system.html#EXTEND-TYPES-POLYMORPHIC\" title=\"38.2.5.\u00a0\u591a\u6001\u7c7b\u578b\">\u7b2c\u00a038.2.5\u00a0\u8282</a>\u4e2d\u63cf\u8ff0\u7684\u591a\u6001\u7c7b\u578b\u3002\u4e0b\u9762\u8fd9\u4e2a\u591a\u6001\u51fd\u6570 <code class=\"function\">make_array</code> \u4f1a\u6839\u636e\u4e24\u4e2a\u4efb\u610f\u6570\u636e\u7c7b\u578b\u7684\u5143\u7d20\u6784\u9020\u4e00\u4e2a\u6570\u7ec4\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION make_array(anyelement, anyelement) RETURNS anyarray AS $$\n    SELECT ARRAY[$1, $2];\n$$ LANGUAGE SQL;\n\nSELECT make_array(1, 2) AS intarray, make_array('a'::text, 'b') AS textarray;\n intarray | textarray\n----------+-----------\n {1,2}    | {a,b}\n(1 row)\n</pre>\n<p lang=\"zh\">\u6ce8\u610f\u7c7b\u578b\u8f6c\u6362<code class=\"literal\">'a'::text</code>\u7684\u4f7f\u7528\u662f\u4e3a\u4e86\u6307\u5b9a\u8be5\u53c2\u6570\u7684\u7c7b\u578b\u662f<code class=\"type\">text</code>\u3002\u5982\u679c\u8be5\u53c2\u6570\u53ea\u662f\u4e00\u4e2a\u5b57\u7b26\u4e32\u5b57\u9762\u91cf\uff0c\u8fd9\u5c31\u662f\u5fc5\u987b\u7684\uff0c\u56e0\u4e3a\u5426\u5219\u5b83\u4f1a\u88ab\u5f53\u4f5c<code class=\"type\">unknown</code>\u7c7b\u578b\uff0c\u5e76\u4e14 <code class=\"type\">unknown</code>\u7684\u6570\u7ec4\u4e5f\u4e0d\u662f\u4e00\u79cd\u5408\u6cd5\u7684\u7c7b\u578b\u3002\u5982\u679c\u6ca1\u6709\u8be5\u7c7b\u578b\u8f6c\u6362\uff0c\u5c06\u5f97\u5230\u8fd9\u6837\u7684\u9519\u8bef\uff1a</p>\n<pre class=\"screen\">ERROR:  could not determine polymorphic type because input has type unknown\n</pre>\n<p lang=\"zh\">\u6309\u7167\u4e0a\u9762\u7684\u65b9\u5f0f\u58f0\u660e <code class=\"function\">make_array</code> \u65f6\uff0c\u4f60\u5fc5\u987b\u63d0\u4f9b\u4e24\u4e2a\u6570\u636e\u7c7b\u578b\u5b8c\u5168\u76f8\u540c\u7684\u53c2\u6570\uff1b\u7cfb\u7edf\u4e0d\u4f1a\u5c1d\u8bd5\u89e3\u51b3\u5b83\u4eec\u4e4b\u95f4\u7684\u7c7b\u578b\u5dee\u5f02\u3002\u4f8b\u5982\uff0c\u4e0b\u9762\u8fd9\u6837\u662f\u4e0d\u884c\u7684\uff1a</p>\n<pre class=\"screen\">SELECT make_array(1, 2.5) AS numericarray;\nERROR:  function make_array(integer, numeric) does not exist\n</pre>\n<p lang=\"zh\">\u53e6\u4e00\u79cd\u65b9\u6cd5\u662f\u4f7f\u7528<span class=\"quote\">\u201c<span class=\"quote\">common</span>\u201d</span>\u8fd9\u4e00\u65cf\u591a\u6001\u7c7b\u578b\uff0c\u5b83\u5141\u8bb8\u7cfb\u7edf\u5c1d\u8bd5\u8bc6\u522b\u4e00\u4e2a\u5408\u9002\u7684\u516c\u5171\u7c7b\u578b\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION make_array2(anycompatible, anycompatible)\nRETURNS anycompatiblearray AS $$\n    SELECT ARRAY[$1, $2];\n$$ LANGUAGE SQL;\n\nSELECT make_array2(1, 2.5) AS numericarray;\n numericarray\n--------------\n {1,2.5}\n(1 row)\n</pre>\n<p lang=\"zh\">\u7531\u4e8e\u516c\u5171\u7c7b\u578b\u89e3\u6790\u89c4\u5219\u5728\u6240\u6709\u8f93\u5165\u90fd\u662f\u672a\u77e5\u7c7b\u578b\u65f6\u9ed8\u8ba4\u9009\u62e9 <code class=\"type\">text</code>\uff0c\u6240\u4ee5\u4e0b\u9762\u7684\u5199\u6cd5\u4e5f\u80fd\u5de5\u4f5c\uff1a</p>\n<pre class=\"screen\">SELECT make_array2('a', 'b') AS textarray;\n textarray\n-----------\n {a,b}\n(1 row)\n</pre>\n<p lang=\"zh\">\u5141\u8bb8\u5b58\u5728\u5177\u6709\u56fa\u5b9a\u8fd4\u56de\u7c7b\u578b\u7684\u591a\u6001\u53c2\u6570\uff0c\u4f46\u53cd\u8fc7\u6765\u5219\u4e0d\u5141\u8bb8\u3002\u4f8b\u5982\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION is_greater(anyelement, anyelement) RETURNS boolean AS $$\n    SELECT $1 &gt; $2;\n$$ LANGUAGE SQL;\n\nSELECT is_greater(1, 2);\n is_greater\n------------\n f\n(1 row)\n\nCREATE FUNCTION invalid_func() RETURNS anyelement AS $$\n    SELECT 1;\n$$ LANGUAGE SQL;\nERROR:  cannot determine result data type\nDETAIL:  A result of type anyelement requires at least one input of type anyelement, anyarray, anynonarray, anyenum, or anyrange.\n</pre>\n<p lang=\"zh\">\u591a\u6001\u4e5f\u53ef\u4ee5\u548c\u5e26\u8f93\u51fa\u53c2\u6570\u7684\u51fd\u6570\u4e00\u8d77\u4f7f\u7528\u3002\u4f8b\u5982\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION dup (f1 anyelement, OUT f2 anyelement, OUT f3 anyarray)\nAS 'select $1, array[$1,$1]' LANGUAGE SQL;\n\nSELECT * FROM dup(22);\n f2 |   f3\n----+---------\n 22 | {22,22}\n(1 row)\n</pre>\n<p lang=\"zh\">\u591a\u6001\u4e5f\u53ef\u4ee5\u7528\u4e8e\u53ef\u53d8\u53c2\u6570\u51fd\u6570\u3002\u4f8b\u5982\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION anyleast (VARIADIC anyarray) RETURNS anyelement AS $$\n    SELECT min($1[i]) FROM generate_subscripts($1, 1) g(i);\n$$ LANGUAGE SQL;\n\nSELECT anyleast(10, -1, 5, 4);\n anyleast\n----------\n       -1\n(1 row)\n\nSELECT anyleast('abc'::text, 'def');\n anyleast\n----------\n abc\n(1 row)\n\nCREATE FUNCTION concat_values(text, VARIADIC anyarray) RETURNS text AS $$\n    SELECT array_to_string($2, $1);\n$$ LANGUAGE SQL;\n\nSELECT concat_values('|', 1, 4, 2);\n concat_values\n---------------\n 1|4|2\n(1 row)\n</pre>\n</div>\n<div class=\"sect2\" id=\"XFUNC-SQL-COLLATIONS\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/16/xfunc-sql.html#XFUNC-SQL-COLLATIONS\">38.5.12. \u5e26\u6709\u6392\u5e8f\u89c4\u5219\u7684<acronym class=\"acronym\">SQL</acronym>\u51fd\u6570</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\">\u5f53\u4e00\u4e2a SQL \u51fd\u6570\u6709\u4e00\u4e2a\u6216\u591a\u4e2a\u652f\u6301\u6392\u5e8f\u89c4\u5219\u7684\u6570\u636e\u7c7b\u578b\u53c2\u6570\u65f6\uff0c\u4f1a\u6309<a class=\"xref\" href=\"/docs/16/collation.html\" title=\"24.2.\u00a0\u6392\u5e8f\u89c4\u5219\u652f\u6301\">\u7b2c\u00a024.2\u00a0\u8282</a>\u4e2d\u7684\u8bf4\u660e\uff0c\u6839\u636e\u5206\u914d\u7ed9\u5b9e\u53c2\u7684\u6392\u5e8f\u89c4\u5219\uff0c\u4e3a\u6bcf\u6b21\u51fd\u6570\u8c03\u7528\u786e\u5b9a\u4e00\u4e2a\u6392\u5e8f\u89c4\u5219\u3002\u5982\u679c\u80fd\u591f\u6210\u529f\u786e\u5b9a\uff08\u4e5f\u5c31\u662f\u8bf4\uff0c\u53c2\u6570\u4e4b\u95f4\u4e0d\u5b58\u5728\u9690\u5f0f\u6392\u5e8f\u89c4\u5219\u51b2\u7a81\uff09\uff0c\u90a3\u4e48\u6240\u6709\u652f\u6301\u6392\u5e8f\u89c4\u5219\u7684\u53c2\u6570\u90fd\u4f1a\u88ab\u89c6\u4e3a\u9690\u5f0f\u5e26\u6709\u8be5\u6392\u5e8f\u89c4\u5219\u3002\u8fd9\u4f1a\u5f71\u54cd\u51fd\u6570\u4e2d\u5bf9\u6392\u5e8f\u89c4\u5219\u654f\u611f\u7684\u64cd\u4f5c\u7684\u884c\u4e3a\u3002\u4f8b\u5982\uff0c\u4f7f\u7528\u4e0a\u6587\u7684 <code class=\"function\">anyleast</code> \u51fd\u6570\u65f6\uff0c</p>\n<pre class=\"programlisting\">SELECT anyleast('abc'::text, 'ABC');\n</pre>\n<p lang=\"zh\">\u5176\u7ed3\u679c\u5c06\u53d6\u51b3\u4e8e\u6570\u636e\u5e93\u7684\u9ed8\u8ba4\u6392\u5e8f\u89c4\u5219\u3002\u5728 <code class=\"literal\">C</code> \u533a\u57df\u8bbe\u7f6e\u4e0b\uff0c\u7ed3\u679c\u4f1a\u662f <code class=\"literal\">ABC</code>\uff0c\u4f46\u5728\u8bb8\u591a\u5176\u4ed6\u533a\u57df\u8bbe\u7f6e\u4e0b\u5219\u4f1a\u662f <code class=\"literal\">abc</code>\u3002\u53ef\u4ee5\u5728\u4efb\u610f\u53c2\u6570\u4e0a\u6dfb\u52a0 <code class=\"literal\">COLLATE</code> \u5b50\u53e5\u6765\u5f3a\u5236\u6307\u5b9a\u8981\u4f7f\u7528\u7684\u6392\u5e8f\u89c4\u5219\uff0c\u4f8b\u5982\uff1a</p>\n<pre class=\"programlisting\">SELECT anyleast('abc'::text, 'ABC' COLLATE \"C\");\n</pre>\n<p lang=\"zh\">\u53e6\u5916\uff0c\u5982\u679c\u4f60\u5e0c\u671b\u67d0\u4e2a\u51fd\u6570\u65e0\u8bba\u4ee5\u4ec0\u4e48\u6392\u5e8f\u89c4\u5219\u8c03\u7528\uff0c\u90fd\u59cb\u7ec8\u6309\u7279\u5b9a\u6392\u5e8f\u89c4\u5219\u5de5\u4f5c\uff0c\u53ef\u4ee5\u5728\u51fd\u6570\u5b9a\u4e49\u4e2d\u6309\u9700\u63d2\u5165 <code class=\"literal\">COLLATE</code> \u5b50\u53e5\u3002\u4e0b\u9762\u8fd9\u4e2a\u7248\u672c\u7684 <code class=\"function\">anyleast</code> \u5c06\u59cb\u7ec8\u4f7f\u7528 <code class=\"literal\">en_US</code> \u533a\u57df\u8bbe\u7f6e\u6765\u6bd4\u8f83\u5b57\u7b26\u4e32\uff1a</p>\n<pre class=\"programlisting\">CREATE FUNCTION anyleast (VARIADIC anyarray) RETURNS anyelement AS $$\n    SELECT min($1[i] COLLATE \"en_US\") FROM generate_subscripts($1, 1) g(i);\n$$ LANGUAGE SQL;\n</pre>\n<p lang=\"zh\">\u4f46\u8bf7\u6ce8\u610f\uff0c\u5982\u679c\u628a\u5b83\u7528\u4e8e\u4e0d\u652f\u6301\u6392\u5e8f\u89c4\u5219\u7684\u6570\u636e\u7c7b\u578b\uff0c\u5c31\u4f1a\u629b\u51fa\u9519\u8bef\u3002</p>\n<p lang=\"zh\">\u5982\u679c\u65e0\u6cd5\u5728\u5b9e\u53c2\u4e4b\u95f4\u786e\u5b9a\u5171\u540c\u7684\u6392\u5e8f\u89c4\u5219\uff0c\u90a3\u4e48 SQL \u51fd\u6570\u4f1a\u628a\u53c2\u6570\u89c6\u4e3a\u5e26\u6709\u5176\u6570\u636e\u7c7b\u578b\u7684\u9ed8\u8ba4\u6392\u5e8f\u89c4\u5219\uff08\u901a\u5e38\u662f\u6570\u636e\u5e93\u7684\u9ed8\u8ba4\u6392\u5e8f\u89c4\u5219\uff0c\u4f46\u5bf9\u57df\u7c7b\u578b\u53c2\u6570\u6765\u8bf4\u4e5f\u53ef\u80fd\u4e0d\u540c\uff09\u3002</p>\n<p lang=\"zh\">\u8fd9\u79cd\u652f\u6301\u6392\u5e8f\u89c4\u5219\u7684\u53c2\u6570\u7684\u884c\u4e3a\uff0c\u53ef\u4ee5\u770b\u4f5c\u662f\u4ec5\u9002\u7528\u4e8e\u6587\u672c\u6570\u636e\u7c7b\u578b\u7684\u4e00\u79cd\u53d7\u9650\u591a\u6001\u5f62\u5f0f\u3002</p>\n</div>\n</div>", "manual_path": "/docs/16/xfunc-sql.html", "localization": {"status": "complete", "sources": [{"url": "/docs/16/xfunc-sql.html", "method": "same-major semantic node", "sha256": "1ebe87d1395d64ee8d2fb06e101ed52b699962cb408e83e64d37c7f6501895a1", "language": "zh", "matched_nodes": ["#XFUNC-SQL/div[11]/h3[0]", "#XFUNC-SQL/div[13]/p[2]", "#XFUNC-SQL/div[13]/p[3]", "#XFUNC-SQL/div[13]/p[4]", "#XFUNC-SQL/div[13]/p[5]", "#XFUNC-SQL/div[13]/p[6]", "#XFUNC-SQL/div[13]/p[8]", "#XFUNC-SQL/div[14]/p[10]", "#XFUNC-SQL/div[14]/p[12]", "#XFUNC-SQL/div[14]/p[13]", "#XFUNC-SQL/div[14]/p[15]", "#XFUNC-SQL/div[14]/p[17]", "#XFUNC-SQL/div[14]/p[19]", "#XFUNC-SQL/div[14]/p[1]", "#XFUNC-SQL/div[14]/p[3]", "#XFUNC-SQL/div[14]/p[4]", "#XFUNC-SQL/div[14]/p[6]", "#XFUNC-SQL/div[14]/p[8]", "#XFUNC-SQL/div[15]/div[12]/ul[0]/li[0]", "#XFUNC-SQL/div[15]/div[12]/ul[0]/li[1]", "#XFUNC-SQL/div[15]/p[10]", "#XFUNC-SQL/div[15]/p[11]", "#XFUNC-SQL/div[15]/p[13]", "#XFUNC-SQL/div[15]/p[15]", "#XFUNC-SQL/div[15]/p[16]", "#XFUNC-SQL/div[15]/p[18]", "#XFUNC-SQL/div[15]/p[1]", "#XFUNC-SQL/div[15]/p[20]", "#XFUNC-SQL/div[15]/p[21]", "#XFUNC-SQL/div[15]/p[23]", "#XFUNC-SQL/div[15]/p[25]", "#XFUNC-SQL/div[15]/p[27]", "#XFUNC-SQL/div[15]/p[28]", "#XFUNC-SQL/div[15]/p[3]", "#XFUNC-SQL/div[15]/p[5]", "#XFUNC-SQL/div[15]/p[6]", "#XFUNC-SQL/div[15]/p[8]", "#XFUNC-SQL/div[16]/p[11]", "#XFUNC-SQL/div[16]/p[2]", "#XFUNC-SQL/div[16]/p[4]", "#XFUNC-SQL/div[16]/p[6]", "#XFUNC-SQL/div[16]/p[8]", "#XFUNC-SQL/div[16]/p[9]", "#XFUNC-SQL/div[17]/p[2]", "#XFUNC-SQL/div[17]/p[4]", "#XFUNC-SQL/div[17]/p[6]", "#XFUNC-SQL/div[17]/p[7]", "#XFUNC-SQL/div[18]/p[10]", "#XFUNC-SQL/div[18]/p[11]", "#XFUNC-SQL/div[18]/p[13]", "#XFUNC-SQL/div[18]/p[14]", "#XFUNC-SQL/div[18]/p[16]", "#XFUNC-SQL/div[18]/p[3]", "#XFUNC-SQL/div[18]/p[5]", "#XFUNC-SQL/div[18]/p[7]", "#XFUNC-SQL/div[18]/p[8]", "#XFUNC-SQL/div[19]/p[2]", "#XFUNC-SQL/div[19]/p[3]", "#XFUNC-SQL/div[19]/p[5]", "#XFUNC-SQL/div[1]/dl[0]/dt[0]", "#XFUNC-SQL/div[1]/dl[0]/dt[10]", "#XFUNC-SQL/div[1]/dl[0]/dt[11]", "#XFUNC-SQL/div[1]/dl[0]/dt[1]", "#XFUNC-SQL/div[1]/dl[0]/dt[2]", "#XFUNC-SQL/div[1]/dl[0]/dt[3]", "#XFUNC-SQL/div[1]/dl[0]/dt[4]", "#XFUNC-SQL/div[1]/dl[0]/dt[5]", "#XFUNC-SQL/div[1]/dl[0]/dt[6]", "#XFUNC-SQL/div[1]/dl[0]/dt[7]", "#XFUNC-SQL/div[1]/dl[0]/dt[8]", "#XFUNC-SQL/div[1]/dl[0]/dt[9]", "#XFUNC-SQL/div[20]/p[1]", "#XFUNC-SQL/div[20]/p[2]", "#XFUNC-SQL/div[20]/p[4]", "#XFUNC-SQL/div[20]/p[5]", "#XFUNC-SQL/div[21]/div[28]/p[1]", "#XFUNC-SQL/div[21]/div[29]/p[1]", "#XFUNC-SQL/div[21]/div[29]/p[3]", "#XFUNC-SQL/div[21]/div[29]/p[5]", "#XFUNC-SQL/div[21]/p[10]", "#XFUNC-SQL/div[21]/p[12]", "#XFUNC-SQL/div[21]/p[13]", "#XFUNC-SQL/div[21]/p[15]", "#XFUNC-SQL/div[21]/p[16]", "#XFUNC-SQL/div[21]/p[18]", "#XFUNC-SQL/div[21]/p[20]", "#XFUNC-SQL/div[21]/p[21]", "#XFUNC-SQL/div[21]/p[22]", "#XFUNC-SQL/div[21]/p[24]", "#XFUNC-SQL/div[21]/p[25]", "#XFUNC-SQL/div[21]/p[2]", "#XFUNC-SQL/div[21]/p[3]", "#XFUNC-SQL/div[21]/p[5]", "#XFUNC-SQL/div[21]/p[7]", "#XFUNC-SQL/div[21]/p[9]", "#XFUNC-SQL/div[22]/p[2]", "#XFUNC-SQL/div[22]/p[3]", "#XFUNC-SQL/div[22]/p[5]", "#XFUNC-SQL/div[23]/p[11]", "#XFUNC-SQL/div[23]/p[13]", "#XFUNC-SQL/div[23]/p[15]", "#XFUNC-SQL/div[23]/p[1]", "#XFUNC-SQL/div[23]/p[3]", "#XFUNC-SQL/div[23]/p[5]", "#XFUNC-SQL/div[23]/p[7]", "#XFUNC-SQL/div[23]/p[9]", "#XFUNC-SQL/div[24]/p[10]", "#XFUNC-SQL/div[24]/p[2]", "#XFUNC-SQL/div[24]/p[4]", "#XFUNC-SQL/div[24]/p[6]", "#XFUNC-SQL/div[24]/p[8]", "#XFUNC-SQL/div[24]/p[9]", "#XFUNC-SQL/p[10]", "#XFUNC-SQL/p[12]", "#XFUNC-SQL/p[3]", "#XFUNC-SQL/p[4]", "#XFUNC-SQL/p[5]", "#XFUNC-SQL/p[6]", "#XFUNC-SQL/p[8]"]}], "language": "zh", "original_text": {"/versions/16/description/0": "SQL-language functions", "/versions/16/facts/0/label": "Kind", "/versions/16/facts/0/value": "Native function language", "/versions/16/facts/1/label": "Trusted", "/versions/16/facts/2/label": "Validator"}, "fallback_fields": [], "source_language": "en", "original_snapshot_sha256": "196fa64924bdd21c735c6c6433ee50000d470cb3ed0be8c7de23cda1805045cd"}, "comparison_data": {"kind": "Native function language", "handler": "", "trusted": "t", "validator": "fmgr_sql_validator"}, "comparison_hash": "a4af9cf453d140d941e865b952c6a41e2b704a4b30cb77b61c1cdda8a77c5035", "manual_language": "zh"}, "17": {"facts": [{"label": "\u79cd\u7c7b", "value": "\u539f\u751f\u51fd\u6570\u8bed\u8a00"}, {"label": "\u53ef\u4fe1", "value": "t"}, {"label": "\u6821\u9a8c\u51fd\u6570", "value": "fmgr_sql_validator"}], "tables": [], "aliases": [], "catalog": {"oid": "14", "descr": "SQL-language functions", "lanacl": "_null_", "lanispl": "f", "lanname": "sql", "lanowner": "POSTGRES", "laninline": "0", "oid_symbol": "SQLlanguageId", "lanpltrusted": "t", "lanvalidator": "fmgr_sql_validator", "lanplcallfoid": "0"}, "related": [], "release": {"ref": "https://ftp.postgresql.org/pub/source/v17.11/postgresql-17.11.tar.bz2", "label": "17.11", "major": "17", "channel": "stable", "revision": "dd27f2b3c59e73ed14aa3324901242bf69a032a6347805f274e6260322d42979", "source_sha256": "dd27f2b3c59e73ed14aa3324901242bf69a032a6347805f274e6260322d42979", "catalog_fingerprint": "4bbe3ac77becd618478f66aec420a533e9017be356c5c1d51a4b17f0fd497c07"}, "sources": [{"url": "https://ftp.postgresql.org/pub/source/v17.11/postgresql-17.11.tar.bz2", "label": "Matching PostgreSQL source archive", "sha256": "dd27f2b3c59e73ed14aa3324901242bf69a032a6347805f274e6260322d42979"}, {"url": "https://pg.center/docs/17/xfunc-sql.html", "path": "xfunc-sql.html", "label": "PostgreSQL 17 English manual", "sha256": "7bc5d8b6f108c5089cfda273945423a8aabd5610024afbf6dc737d579bc5995e", "language": "en", "original_url": "/docs/17/xfunc-sql.html"}], "sections": [], "signature": "", "attributes": {"kind": "Native function language", "handler": "", "trusted": "t", "validator": "fmgr_sql_validator"}, "description": ["SQL \u8bed\u8a00\u51fd\u6570"], "manual_html": "<div class=\"sect1\" id=\"XFUNC-SQL\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h2 class=\"title\" lang=\"zh\">36.5. \u67e5\u8be2\u8bed\u8a00\uff08SQL\uff09\u51fd\u6570</h2>\n</div>\n</div>\n</div>\n<p lang=\"zh\">SQL \u51fd\u6570\u6267\u884c\u7531\u4efb\u610f SQL \u8bed\u53e5\u7ec4\u6210\u7684\u4e00\u4e2a\u5217\u8868\uff0c\u5e76\u8fd4\u56de\u5217\u8868\u4e2d\u6700\u540e\u4e00\u4e2a\u67e5\u8be2\u7684\u7ed3\u679c\u3002\u5728\u7b80\u5355\uff08\u975e\u96c6\u5408\uff09\u60c5\u51b5\u4e0b\uff0c\u5c06\u8fd4\u56de\u6700\u540e\u4e00\u4e2a\u67e5\u8be2\u7ed3\u679c\u7684\u7b2c\u4e00\u884c\u3002\uff08\u8bf7\u8bb0\u4f4f\uff0c\u9664\u975e\u4f7f\u7528 <code class=\"literal\">ORDER BY</code>\uff0c\u5426\u5219\u591a\u884c\u7ed3\u679c\u4e2d\u7684<span class=\"quote\">\u201c<span class=\"quote\">\u7b2c\u4e00\u884c</span>\u201d</span>\u5e76\u6ca1\u6709\u660e\u786e\u5b9a\u4e49\u3002\uff09\u5982\u679c\u6700\u540e\u4e00\u4e2a\u67e5\u8be2\u5b8c\u5168\u6ca1\u6709\u8fd4\u56de\u4efb\u4f55\u884c\uff0c\u5219\u8fd4\u56de\u7a7a\u503c\u3002</p>\n<p lang=\"zh\">\u6216\u8005\uff0c\u4e00\u4e2a SQL \u51fd\u6570\u53ef\u4ee5\u901a\u8fc7\u6307\u5b9a\u51fd\u6570\u7684\u8fd4\u56de\u7c7b\u578b\u4e3a<code class=\"literal\">SETOF <em class=\"replaceable\"><code>sometype</code></em></code>\u88ab\u58f0\u660e\u4e3a\u8fd4\u56de\u4e00\u4e2a\u96c6\u5408\uff08\u4e5f\u5c31\u662f\u591a\u4e2a\u884c\uff09\uff0c\u6216\u8005\u7b49\u6548\u5730\u58f0\u660e\u5b83\u4e3a<code class=\"literal\">RETURNS TABLE(<em class=\"replaceable\"><code>columns</code></em>)</code>\u3002\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b\uff0c\u6700\u540e\u4e00\u4e2a\u67e5\u8be2\u7684\u7ed3\u679c\u7684\u6240\u6709\u884c\u4f1a\u88ab\u8fd4\u56de\u3002\u4e0b\u6587\u5c06\u7ed9\u51fa\u8fdb\u4e00\u6b65\u7684\u7ec6\u8282\u3002</p>\n<p lang=\"zh\">SQL \u51fd\u6570\u4f53\u5fc5\u987b\u662f\u4e00\u7ec4\u7528\u5206\u53f7\u5206\u9694\u7684 SQL \u8bed\u53e5\uff0c\u6700\u540e\u4e00\u6761\u8bed\u53e5\u540e\u7684\u5206\u53f7\u53ef\u7701\u7565\u3002\u9664\u975e\u51fd\u6570\u58f0\u660e\u4e3a\u8fd4\u56de void\uff0c\u5426\u5219\u6700\u540e\u4e00\u6761\u8bed\u53e5\u5fc5\u987b\u662f SELECT\uff0c\u6216\u5305\u542b RETURNING \u5b50\u53e5\u7684 INSERT\u3001UPDATE\u3001DELETE \u6216 MERGE\u3002</p>\n<p lang=\"zh\">\u4efb\u610f\u4e00\u7ec4 <acronym class=\"acronym\">SQL</acronym> \u8bed\u8a00\u547d\u4ee4\u90fd\u53ef\u4ee5\u6253\u5305\u5e76\u5b9a\u4e49\u6210\u51fd\u6570\u3002\u9664 <code class=\"command\">SELECT</code> \u67e5\u8be2\u5916\uff0c\u8fd9\u4e9b\u547d\u4ee4\u8fd8\u53ef\u4ee5\u5305\u542b\u6570\u636e\u4fee\u6539\u67e5\u8be2\uff08<code class=\"command\">INSERT</code>\u3001<code class=\"command\">UPDATE</code>\u3001<code class=\"command\">DELETE</code> \u548c <code class=\"command\">MERGE</code>\uff09\uff0c\u4ee5\u53ca\u5176\u4ed6 SQL \u547d\u4ee4\u3002\uff08\u5728 <acronym class=\"acronym\">SQL</acronym> \u51fd\u6570\u4e2d\u4e0d\u80fd\u4f7f\u7528\u4e8b\u52a1\u63a7\u5236\u547d\u4ee4\uff0c\u4f8b\u5982 <code class=\"command\">COMMIT</code>\u3001<code class=\"command\">SAVEPOINT</code>\uff0c\u4e5f\u4e0d\u80fd\u4f7f\u7528\u67d0\u4e9b\u5de5\u5177\u547d\u4ee4\uff0c\u4f8b\u5982 <code class=\"literal\">VACUUM</code>\u3002\uff09\u4e0d\u8fc7\uff0c\u6700\u540e\u4e00\u6761\u547d\u4ee4\u5fc5\u987b\u662f <code class=\"command\">SELECT</code>\uff0c\u6216\u8005\u5e26\u6709 <code class=\"literal\">RETURNING</code> \u5b50\u53e5\uff0c\u5e76\u8fd4\u56de\u4e0e\u51fd\u6570\u58f0\u660e\u8fd4\u56de\u7c7b\u578b\u76f8\u7b26\u7684\u7ed3\u679c\u3002\u6216\u8005\uff0c\u5982\u679c\u4f60\u60f3\u5b9a\u4e49\u4e00\u4e2a\u6267\u884c\u52a8\u4f5c\u4f46\u6ca1\u6709\u6709\u7528\u8fd4\u56de\u503c\u7684 SQL \u51fd\u6570\uff0c\u4e5f\u53ef\u4ee5\u628a\u5b83\u5b9a\u4e49\u4e3a\u8fd4\u56de <code class=\"type\">void</code>\u3002\u4f8b\u5982\uff0c\u4e0b\u9762\u8fd9\u4e2a\u51fd\u6570\u4f1a\u4ece <code class=\"literal\">emp</code> \u8868\u4e2d\u5220\u9664\u85aa\u8d44\u4e3a\u8d1f\u7684\u884c\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION clean_emp() RETURNS void AS '\n    DELETE FROM emp\n        WHERE salary &lt; 0;\n' LANGUAGE SQL;\n\nSELECT clean_emp();\n\n clean_emp\n-----------\n\n(1 row)\n</pre>\n<p lang=\"zh\">\u4f60\u4e5f\u53ef\u4ee5\u628a\u8fd9\u4e2a\u5199\u4e3a\u4e00\u4e2a\u8fc7\u7a0b\uff0c\u90a3\u6837\u907f\u514d\u8fd4\u56de\u7c7b\u578b\u7684\u95ee\u9898\u3002\u4f8b\u5982\uff1a</p>\n<pre class=\"screen\">CREATE PROCEDURE clean_emp() AS '\n    DELETE FROM emp\n        WHERE salary &lt; 0;\n' LANGUAGE SQL;\n\nCALL clean_emp();\n</pre>\n<p lang=\"zh\">\u5728\u50cf\u8fd9\u6837\u7684\u7b80\u5355\u60c5\u51b5\u4e2d\uff0c\u8fd4\u56de<code class=\"type\">void</code>\u7684\u51fd\u6570\u4e0e\u8fc7\u7a0b\u4e4b\u95f4\u7684\u5dee\u5f02\u4e3b\u8981\u662f\u98ce\u683c\u4e0a\u9762\u7684\u3002\u4e0d\u8fc7\uff0c\u8fc7\u7a0b\u8fd8\u63d0\u4f9b\u4e86\u51fd\u6570\u6240\u6ca1\u6709\u7684\u989d\u5916\u80fd\u529b\uff0c\u4f8b\u5982\u4e8b\u52a1\u63a7\u5236\u3002\u6b64\u5916\uff0c\u8fc7\u7a0b\u662f SQL \u6807\u51c6\u7684\u4e00\u90e8\u5206\uff0c\u800c\u8fd4\u56de<code class=\"type\">void</code>\u5219\u662f PostgreSQL \u6269\u5c55\u3002</p>\n<div class=\"note\">\n<h3 class=\"title\" lang=\"zh\">\u6ce8\u610f</h3>\n<p lang=\"zh\">SQL \u51fd\u6570\u7684\u6574\u4e2a\u51fd\u6570\u4f53\u4f1a\u5728\u4efb\u4f55\u8bed\u53e5\u6267\u884c\u4e4b\u524d\u5b8c\u6210\u89e3\u6790\u3002\u867d\u7136 SQL \u51fd\u6570\u53ef\u4ee5\u5305\u542b\u4fee\u6539\u7cfb\u7edf\u76ee\u5f55\u7684\u547d\u4ee4\uff0c\u4f8b\u5982 CREATE TABLE\uff0c\u4f46\u5728\u5206\u6790\u51fd\u6570\u4e2d\u540e\u7eed\u547d\u4ee4\u65f6\uff0c\u8fd9\u4e9b\u4fee\u6539\u5c1a\u4e0d\u53ef\u89c1\u3002\u56e0\u6b64\uff0c\u5c06 CREATE TABLE foo (...); INSERT INTO foo VALUES(...); \u653e\u5728\u540c\u4e00\u4e2a SQL \u51fd\u6570\u4e2d\u4e0d\u4f1a\u6309\u9884\u671f\u5de5\u4f5c\uff0c\u56e0\u4e3a\u89e3\u6790 INSERT \u65f6 foo \u5c1a\u4e0d\u5b58\u5728\u3002\u6b64\u7c7b\u60c5\u51b5\u5efa\u8bae\u6539\u7528 PL/pgSQL\u3002</p>\n</div>\n<p lang=\"zh\"><code class=\"command\">CREATE FUNCTION</code> \u547d\u4ee4\u7684\u8bed\u6cd5\u8981\u6c42\u628a\u51fd\u6570\u4f53\u5199\u6210\u4e00\u4e2a\u5b57\u7b26\u4e32\u5e38\u91cf\u3002\u5bf9\u4e8e\u5b57\u7b26\u4e32\u5e38\u91cf\uff0c\u901a\u5e38\u4f7f\u7528\u7f8e\u5143\u5f15\u7528\u6700\u65b9\u4fbf\uff08\u89c1<a class=\"xref\" href=\"/docs/17/sql-syntax-lexical.html#SQL-SYNTAX-DOLLAR-QUOTING\" title=\"4.1.2.4.\u00a0\u7f8e\u5143\u5f15\u7528\u7684\u5b57\u7b26\u4e32\u5e38\u91cf\">\u7b2c\u00a04.1.2.4\u00a0\u8282</a>\uff09\u3002\u5982\u679c\u4f60\u9009\u62e9\u4f7f\u7528\u5e38\u89c4\u7684\u5355\u5f15\u53f7\u5b57\u7b26\u4e32\u5e38\u91cf\u8bed\u6cd5\uff0c\u90a3\u4e48\u5fc5\u987b\u5728\u51fd\u6570\u4f53\u4e2d\u5c06\u5355\u5f15\u53f7\uff08<code class=\"literal\">'</code>\uff09\u548c\u53cd\u659c\u7ebf\uff08<code class=\"literal\">\\</code>\uff09\u5199\u6210\u53cc\u4efd\uff08\u5047\u5b9a\u4f7f\u7528\u8f6c\u4e49\u5b57\u7b26\u4e32\u8bed\u6cd5\uff0c\u89c1<a class=\"xref\" href=\"/docs/17/sql-syntax-lexical.html#SQL-SYNTAX-STRINGS\" title=\"4.1.2.1.\u00a0\u5b57\u7b26\u4e32\u5e38\u91cf\">\u7b2c\u00a04.1.2.1\u00a0\u8282</a>\uff09\u3002</p>\n<div class=\"sect2\" id=\"XFUNC-SQL-FUNCTION-ARGUMENTS\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/17/xfunc-sql.html#XFUNC-SQL-FUNCTION-ARGUMENTS\">36.5.1. <acronym class=\"acronym\">SQL</acronym>\u51fd\u6570\u7684\u53c2\u6570</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\">\u4e00\u4e2a SQL \u51fd\u6570\u7684\u53c2\u6570\u53ef\u4ee5\u5728\u51fd\u6570\u4f53\u4e2d\u7528\u540d\u79f0\u6216\u7f16\u53f7\u5f15\u7528\u3002\u4e0b\u9762\u4f1a\u6709\u4e24\u79cd\u65b9\u6cd5\u7684\u793a\u4f8b\u3002</p>\n<p lang=\"zh\">\u8981\u4f7f\u7528\u4e00\u4e2a\u540d\u79f0\uff0c\u5c06\u51fd\u6570\u53c2\u6570\u58f0\u660e\u4e3a\u5e26\u6709\u4e00\u4e2a\u540d\u79f0\uff0c\u7136\u540e\u5728\u51fd\u6570\u4f53\u4e2d\u53ea\u5199\u8be5\u540d\u79f0\u3002\u5982\u679c\u53c2\u6570\u540d\u79f0\u4e0e\u51fd\u6570\u5185\u5f53\u524d SQL \u547d\u4ee4\u4e2d\u7684\u4efb\u610f\u5217\u540d\u76f8\u540c\uff0c\u5217\u540d\u5c06\u4f18\u5148\u3002\u5982\u679c\u4e0d\u60f3\u8fd9\u6837\uff0c\u53ef\u4ee5\u7528\u51fd\u6570\u672c\u8eab\u7684\u540d\u79f0\u6765\u9650\u5b9a\u53c2\u6570\u540d\uff0c\u4e5f\u5c31\u662f<code class=\"literal\"><em class=\"replaceable\"><code>function_name</code></em>.<em class=\"replaceable\"><code>argument_name</code></em></code>\uff08\u5982\u679c\u8fd9\u4f1a\u4e0e\u4e00\u4e2a\u88ab\u9650\u5b9a\u7684\u5217\u540d\u51b2\u7a81\uff0c\u7167\u4f8b\u8fd8\u662f\u5217\u540d\u8d62\u5f97\u4f18\u5148\u3002\u4f60\u53ef\u4ee5\u901a\u8fc7\u4e3a SQL \u547d\u4ee4\u4e2d\u7684\u8868\u9009\u62e9\u4e00\u4e2a\u4e0d\u540c\u7684\u522b\u540d\u6765\u907f\u514d\u8fd9\u79cd\u6df7\u6dc6\uff09\u3002</p>\n<p lang=\"zh\">\u5728\u66f4\u65e7\u7684\u6570\u5b57\u65b9\u6cd5\u4e2d\uff0c\u53c2\u6570\u53ef\u4ee5\u7528\u8bed\u6cd5<code class=\"literal\">$<em class=\"replaceable\"><code>n</code></em></code>\u5f15\u7528\uff1a<code class=\"literal\">$1</code>\u6307\u7684\u662f\u7b2c\u4e00\u4e2a\u8f93\u5165\u53c2\u6570\uff0c<code class=\"literal\">$2</code>\u6307\u7684\u662f\u7b2c\u4e8c\u4e2a\uff0c\u4ee5\u6b64\u7c7b\u63a8\u3002\u4e0d\u7ba1\u7279\u5b9a\u7684\u53c2\u6570\u662f\u5426\u4f7f\u7528\u540d\u79f0\u58f0\u660e\uff0c\u8fd9\u79cd\u65b9\u6cd5\u90fd\u6709\u6548\u3002</p>\n<p lang=\"zh\">\u5982\u679c\u4e00\u4e2a\u53c2\u6570\u662f\u4e00\u79cd\u590d\u5408\u7c7b\u578b\uff0c\u90a3\u4e48\u70b9\u53f7\u8bb0\u6cd5\uff08\u5982 <code class=\"literal\"><em class=\"replaceable\"><code>argname</code></em>.<em class=\"replaceable\"><code>fieldname</code></em></code> \u6216<code class=\"literal\">$1.<em class=\"replaceable\"><code>fieldname</code></em></code>\uff09\u4e5f\u53ef\u4ee5\u88ab\u7528\u6765\u8bbf\u95ee\u8be5\u53c2\u6570\u7684\u5c5e\u6027\u3002\u540c\u6837\uff0c\u4f60\u53ef\u80fd\u9700\u8981\u7528\u51fd\u6570\u7684\u540d\u79f0\u6765\u9650\u5b9a\u53c2\u6570\u7684\u540d\u79f0\u4ee5\u907f\u514d\u6b67\u4e49\u3002</p>\n<p lang=\"zh\">SQL \u51fd\u6570\u53c2\u6570\u53ea\u80fd\u88ab\u7528\u4f5c\u6570\u636e\u503c\u800c\u4e0d\u80fd\u4f5c\u4e3a\u6807\u8bc6\u7b26\u3002\u4f8b\u5982\u8fd9\u662f\u5408\u7406\u7684\uff1a</p>\n<pre class=\"programlisting\">INSERT INTO mytable VALUES ($1);\n</pre>\n<p lang=\"zh\">\u4f46\u8fd9\u6837\u5c31\u4e0d\u884c\uff1a</p>\n<pre class=\"programlisting\">INSERT INTO $1 VALUES (42);\n</pre>\n<div class=\"note\">\n<h3 class=\"title\" lang=\"zh\">\u6ce8\u610f</h3>\n<p lang=\"zh\">PostgreSQL 9.2 \u5f00\u59cb\u652f\u6301\u901a\u8fc7\u540d\u79f0\u5f15\u7528 SQL \u51fd\u6570\u53c2\u6570\u3002\u9700\u8981\u7528\u4e8e\u66f4\u65e9\u7248\u672c\u670d\u52a1\u5668\u7684\u51fd\u6570\u5fc5\u987b\u4f7f\u7528 $n \u8bb0\u6cd5\u3002</p>\n</div>\n</div>\n<div class=\"sect2\" id=\"XFUNC-SQL-BASE-FUNCTIONS\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/17/xfunc-sql.html#XFUNC-SQL-BASE-FUNCTIONS\">36.5.2. \u57fa\u7840\u7c7b\u578b\u4e0a\u7684<acronym class=\"acronym\">SQL</acronym>\u51fd\u6570</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\">\u6700\u7b80\u5355\u7684 <acronym class=\"acronym\">SQL</acronym> \u51fd\u6570\u6ca1\u6709\u53c2\u6570\uff0c\u53ea\u662f\u8fd4\u56de\u4e00\u4e2a\u57fa\u7840\u7c7b\u578b\uff0c\u4f8b\u5982 <code class=\"type\">integer</code>\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION one() RETURNS integer AS $$\n    SELECT 1 AS result;\n$$ LANGUAGE SQL;\n\n-- Alternative syntax for string literal:\nCREATE FUNCTION one() RETURNS integer AS '\n    SELECT 1 AS result;\n' LANGUAGE SQL;\n\nSELECT one();\n\n one\n-----\n   1\n</pre>\n<p lang=\"zh\">\u6ce8\u610f\u6211\u4eec\u4e3a\u8be5\u51fd\u6570\u7684\u7ed3\u679c\u5728\u51fd\u6570\u4f53\u5185\u5b9a\u4e49\u4e86\u4e00\u4e2a\u5217\u522b\u540d\uff08\u540d\u4e3a<code class=\"literal\">result</code>\uff09\uff0c\u4f46\u662f\u8fd9\u4e2a\u5217\u522b\u540d\u5728\u51fd\u6570\u4ee5\u5916\u662f\u4e0d\u53ef\u89c1\u7684\u3002\u56e0\u6b64\uff0c\u7ed3\u679c\u88ab\u6807\u8bb0\u4e3a<code class=\"literal\">one</code>\u800c\u4e0d\u662f<code class=\"literal\">result</code>\u3002</p>\n<p lang=\"zh\">\u5b9a\u4e49\u63a5\u53d7\u57fa\u7840\u7c7b\u578b\u53c2\u6570\u7684 <acronym class=\"acronym\">SQL</acronym> \u51fd\u6570\u4e5f\u51e0\u4e4e\u540c\u6837\u5bb9\u6613\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION add_em(x integer, y integer) RETURNS integer AS $$\n    SELECT x + y;\n$$ LANGUAGE SQL;\n\nSELECT add_em(1, 2) AS answer;\n\n answer\n--------\n      3\n</pre>\n<p lang=\"zh\">\u6216\u8005\uff0c\u6211\u4eec\u4e5f\u53ef\u4ee5\u4e0d\u7528\u53c2\u6570\u540d\uff0c\u800c\u6539\u7528\u6570\u5b57\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION add_em(integer, integer) RETURNS integer AS $$\n    SELECT $1 + $2;\n$$ LANGUAGE SQL;\n\nSELECT add_em(1, 2) AS answer;\n\n answer\n--------\n      3\n</pre>\n<p lang=\"zh\">\u4e0b\u9762\u662f\u4e00\u4e2a\u66f4\u6709\u7528\u7684\u51fd\u6570\uff0c\u5b83\u53ef\u4ee5\u7528\u6765\u4ece\u94f6\u884c\u8d26\u6237\u4e2d\u6263\u6b3e\uff1a</p>\n<pre class=\"programlisting\">CREATE FUNCTION tf1 (accountno integer, debit numeric) RETURNS numeric AS $$\n    UPDATE bank\n        SET balance = balance - debit\n        WHERE accountno = tf1.accountno;\n    SELECT 1;\n$$ LANGUAGE SQL;\n</pre>\n<p lang=\"zh\">\u7528\u6237\u53ef\u4ee5\u8fd9\u6837\u6267\u884c\u8be5\u51fd\u6570\uff0c\u4ece 17 \u53f7\u8d26\u6237\u4e2d\u6263\u9664 $100.00\uff1a</p>\n<pre class=\"programlisting\">SELECT tf1(17, 100.0);\n</pre>\n<p lang=\"zh\">\u5728\u8fd9\u4e2a\u793a\u4f8b\u4e2d\uff0c\u6211\u4eec\u4e3a\u7b2c\u4e00\u4e2a\u53c2\u6570\u9009\u62e9\u4e86\u540d\u79f0<code class=\"literal\">accountno</code>\uff0c\u4f46\u662f\u8fd9\u548c\u8868<code class=\"literal\">bank</code>\u4e2d\u7684\u4e00\u4e2a\u5217\u540d\u76f8\u540c\u3002\u5728<code class=\"command\">UPDATE</code>\u547d\u4ee4\u4e2d\uff0c<code class=\"literal\">accountno</code>\u5f15\u7528\u5217<code class=\"literal\">bank.accountno</code>\uff0c\u56e0\u6b64 <code class=\"literal\">tf1.accountno</code>\u5fc5\u987b\u88ab\u7528\u6765\u5f15\u7528\u8be5\u53c2\u6570\u3002\u6211\u4eec\u5f53\u7136\u53ef\u4ee5\u901a\u8fc7\u4e3a\u8be5\u53c2\u6570\u4f7f\u7528\u4e00\u4e2a\u4e0d\u540c\u7684\u540d\u79f0\u6765\u907f\u514d\u8fd9\u6837\u7684\u95ee\u9898\u3002</p>\n<p lang=\"zh\">\u5b9e\u9645\u4e0a\u6211\u4eec\u53ef\u80fd\u559c\u6b22\u4ece\u8be5\u51fd\u6570\u5f97\u5230\u4e00\u4e2a\u66f4\u6709\u7528\u7684\u7ed3\u679c\u800c\u4e0d\u662f\u4e00\u4e2a\u5e38\u6570 1\uff0c\u56e0\u6b64\u4e00\u4e2a\u66f4\u53ef\u80fd\u7684\u5b9a\u4e49\u662f\uff1a</p>\n<pre class=\"programlisting\">CREATE FUNCTION tf1 (accountno integer, debit numeric) RETURNS numeric AS $$\n    UPDATE bank\n        SET balance = balance - debit\n        WHERE accountno = tf1.accountno;\n    SELECT balance FROM bank WHERE accountno = tf1.accountno;\n$$ LANGUAGE SQL;\n</pre>\n<p lang=\"zh\">\u5b83\u4f1a\u8c03\u6574\u4f59\u989d\u5e76\u4e14\u8fd4\u56de\u65b0\u7684\u4f59\u989d\u3002\u540c\u6837\u7684\u4e8b\u60c5\u4e5f\u53ef\u4ee5\u7528\u4e00\u4e2a\u4f7f\u7528<code class=\"literal\">RETURNING</code>\u7684\u547d\u4ee4\u5b9e\u73b0\uff1a</p>\n<pre class=\"programlisting\">CREATE FUNCTION tf1 (accountno integer, debit numeric) RETURNS numeric AS $$\n    UPDATE bank\n        SET balance = balance - debit\n        WHERE accountno = tf1.accountno\n    RETURNING balance;\n$$ LANGUAGE SQL;\n</pre>\n<p lang=\"zh\">\u5982\u679c\u5728<code class=\"literal\">SELECT</code>\u6216<code class=\"literal\">RETURNING</code>\u5b50\u53e5\u4e2d\uff0c<acronym class=\"acronym\">SQL</acronym>\u51fd\u6570\u7684\u6700\u7ec8\u8fd4\u56de\u503c\u7c7b\u578b\u4e0e\u51fd\u6570\u58f0\u660e\u7684\u7ed3\u679c\u7c7b\u578b\u4e0d\u5b8c\u5168\u5339\u914d\uff0c\u5982\u679c\u53ef\u4ee5\u4f7f\u7528\u9690\u5f0f\u6216\u8d4b\u503c\u8f6c\u6362\uff0c<span class=\"productname\">PostgreSQL</span>\u5c06\u81ea\u52a8\u5c06\u8be5\u503c\u8f6c\u6362\u4e3a\u6240\u9700\u7c7b\u578b\u3002\u5426\u5219\uff0c\u4f60\u5fc5\u987b\u5199\u51fa\u663e\u5f0f\u7c7b\u578b\u8f6c\u6362\u3002\u4f8b\u5982\uff0c\u5047\u8bbe\u6211\u4eec\u5e0c\u671b\u524d\u9762\u7684<code class=\"function\">add_em</code>\u51fd\u6570\u8fd4\u56de<code class=\"type\">float8</code>\u7c7b\u578b\u3002\u53ea\u9700\u7f16\u5199</p>\n<pre class=\"programlisting\">CREATE FUNCTION add_em(integer, integer) RETURNS float8 AS $$\n    SELECT $1 + $2;\n$$ LANGUAGE SQL;\n</pre>\n<p lang=\"zh\">\u56e0\u4e3a<code class=\"type\">integer</code>\u7684\u548c\u53ef\u4ee5\u9690\u5f0f\u8f6c\u6362\u4e3a<code class=\"type\">float8</code>\u3002\uff08\u6709\u5173\u8f6c\u6362\u7684\u66f4\u591a\u4fe1\u606f\uff0c\u8bf7\u53c2\u89c1<a class=\"xref\" href=\"/docs/17/typeconv.html\" title=\"\u7b2c\u00a010\u00a0\u7ae0\u00a0\u7c7b\u578b\u8f6c\u6362\">\u7b2c\u00a010\u00a0\u7ae0</a>\u6216<a class=\"xref\" href=\"/docs/17/sql-createcast.html\" title=\"CREATE CAST\"><span class=\"refentrytitle\">CREATE CAST</span></a>\u3002\uff09</p>\n</div>\n<div class=\"sect2\" id=\"XFUNC-SQL-COMPOSITE-FUNCTIONS\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/17/xfunc-sql.html#XFUNC-SQL-COMPOSITE-FUNCTIONS\">36.5.3. \u590d\u5408\u7c7b\u578b\u4e0a\u7684<acronym class=\"acronym\">SQL</acronym>\u51fd\u6570</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\">\u7f16\u5199\u63a5\u53d7\u590d\u5408\u7c7b\u578b\u53c2\u6570\u7684\u51fd\u6570\u65f6\uff0c\u6211\u4eec\u4e0d\u4ec5\u5fc5\u987b\u6307\u5b9a\u8981\u7528\u54ea\u4e2a\u53c2\u6570\uff0c\u8fd8\u5fc5\u987b\u6307\u5b9a\u8be5\u53c2\u6570\u7684\u54ea\u4e2a\u5c5e\u6027\uff08\u5b57\u6bb5\uff09\u3002\u4f8b\u5982\uff0c\u5047\u8bbe <code class=\"type\">emp</code> \u662f\u4e00\u4e2a\u5305\u542b\u96c7\u5458\u6570\u636e\u7684\u8868\uff0c\u56e0\u6b64\u5b83\u4e5f\u662f\u8be5\u8868\u6bcf\u4e00\u884c\u5bf9\u5e94\u7684\u590d\u5408\u7c7b\u578b\u540d\u79f0\u3002\u4e0b\u9762\u7684\u51fd\u6570 <code class=\"function\">double_salary</code> \u7528\u6765\u8ba1\u7b97\u67d0\u4eba\u7684\u5de5\u8d44\u7ffb\u500d\u540e\u4f1a\u662f\u591a\u5c11\uff1a</p>\n<pre class=\"screen\">CREATE TABLE emp (\n    name        text,\n    salary      numeric,\n    age         integer,\n    cubicle     point\n);\n\nINSERT INTO emp VALUES ('Bill', 4200, 45, '(2,1)');\n\nCREATE FUNCTION double_salary(emp) RETURNS numeric AS $$\n    SELECT $1.salary * 2 AS salary;\n$$ LANGUAGE SQL;\n\nSELECT name, double_salary(emp.*) AS dream\n    FROM emp\n    WHERE emp.cubicle ~= point '(2,1)';\n\n name | dream\n------+-------\n Bill |  8400\n</pre>\n<p lang=\"zh\">\u6ce8\u610f\u8fd9\u91cc\u7528 <code class=\"literal\">$1.salary</code> \u8bed\u6cd5\u6765\u9009\u53d6\u53c2\u6570\u884c\u503c\u4e2d\u7684\u4e00\u4e2a\u5b57\u6bb5\u3002\u8fd8\u8981\u6ce8\u610f\uff0c\u8c03\u7528\u65f6\u7684 <code class=\"command\">SELECT</code> \u547d\u4ee4\u4f7f\u7528 <em class=\"replaceable\"><code>table_name</code></em><code class=\"literal\">.*</code> \u5c06\u8868\u7684\u5f53\u524d\u6574\u884c\u53d6\u4f5c\u4e00\u4e2a\u590d\u5408\u503c\u3002\u8be5\u8868\u884c\u4e5f\u53ef\u4ee5\u4ec5\u7528\u8868\u540d\u6765\u5f15\u7528\uff1a</p>\n<pre class=\"screen\">SELECT name, double_salary(emp) AS dream\n    FROM emp\n    WHERE emp.cubicle ~= point '(2,1)';\n</pre>\n<p lang=\"zh\">\u4f46\u8fd9\u79cd\u7528\u6cd5\u5df2\u88ab\u5f03\u7528\uff0c\u56e0\u4e3a\u5b83\u5f88\u5bb9\u6613\u8ba9\u4eba\u6df7\u6dc6\uff08\u5173\u4e8e\u8868\u884c\u590d\u5408\u503c\u8fd9\u4e24\u79cd\u8bb0\u6cd5\u7684\u66f4\u591a\u7ec6\u8282\uff0c\u89c1<a class=\"xref\" href=\"/docs/17/rowtypes.html#ROWTYPES-USAGE\" title=\"8.16.5.\u00a0\u5728\u67e5\u8be2\u4e2d\u4f7f\u7528\u590d\u5408\u7c7b\u578b\">\u7b2c\u00a08.16.5\u00a0\u8282</a>\uff09\u3002</p>\n<p lang=\"zh\">\u6709\u65f6\u5019\u5373\u65f6\u6784\u9020\u4e00\u4e2a\u590d\u5408\u53c2\u6570\u503c\u4f1a\u5f88\u65b9\u4fbf\u3002\u8fd9\u53ef\u4ee5\u7528<code class=\"literal\">ROW</code>\u6784\u9020\u5668\u5b8c\u6210\u3002\u4f8b\u5982\uff0c\u6211\u4eec\u53ef\u4ee5\u8c03\u6574\u88ab\u4f20\u9012\u7ed9\u51fd\u6570\u7684\u6570\u636e\uff1a</p>\n<pre class=\"screen\">SELECT name, double_salary(ROW(name, salary*1.1, age, cubicle)) AS dream\n    FROM emp;\n</pre>\n<p lang=\"zh\">\u4e5f\u53ef\u4ee5\u6784\u5efa\u4e00\u4e2a\u8fd4\u56de\u590d\u5408\u7c7b\u578b\u7684\u51fd\u6570\u3002\u8fd9\u662f\u4e00\u4e2a\u8fd4\u56de\u5355\u4e00<code class=\"type\">emp</code>\u884c\u7684\u51fd\u6570\u793a\u4f8b\uff1a</p>\n<pre class=\"programlisting\">CREATE FUNCTION new_emp() RETURNS emp AS $$\n    SELECT text 'None' AS name,\n        1000.0 AS salary,\n        25 AS age,\n        point '(2,2)' AS cubicle;\n$$ LANGUAGE SQL;\n</pre>\n<p lang=\"zh\">\u5728\u8fd9\u4e2a\u793a\u4f8b\u4e2d\uff0c\u6211\u4eec\u4e3a\u6bcf\u4e00\u4e2a\u5c5e\u6027\u6307\u5b9a\u4e86\u4e00\u4e2a\u5e38\u91cf\u503c\uff0c\u4f46\u662f\u53ef\u4ee5\u7528\u4efb\u4f55\u8ba1\u7b97\u6765\u66ff\u6362\u8fd9\u4e9b\u5e38\u91cf\u3002</p>\n<p lang=\"zh\">\u5b9a\u4e49\u8be5\u51fd\u6570\u65f6\u6709\u4e24\u70b9\u91cd\u8981\u6ce8\u610f\u4e8b\u9879\uff1a</p>\n<div class=\"itemizedlist\">\n<ul class=\"itemizedlist\">\n<li class=\"listitem\" lang=\"zh\">\n<p>\u67e5\u8be2\u4e2d\u7684\u9009\u62e9\u5217\u8868\u987a\u5e8f\u5fc5\u987b\u4e0e\u5217\u5728\u590d\u5408\u7c7b\u578b\u4e2d\u51fa\u73b0\u7684\u987a\u5e8f\u5b8c\u5168\u76f8\u540c\u3002\uff08\u7cfb\u7edf\u4e0d\u8003\u8651\u50cf\u4e0a\u9762\u8fd9\u6837\u6307\u5b9a\u7684\u5217\u540d\u3002\uff09</p>\n</li>\n<li class=\"listitem\" lang=\"zh\">\n<p>\u6211\u4eec\u5fc5\u987b\u786e\u4fdd\u6bcf\u4e2a\u8868\u8fbe\u5f0f\u7684\u7c7b\u578b\u90fd\u53ef\u4ee5\u8f6c\u6362\u4e3a\u590d\u5408\u7c7b\u578b\u7684\u76f8\u5e94\u5217\u7684\u7c7b\u578b\u3002\u5426\u5219\u6211\u4eec\u4f1a\u5f97\u5230\u8fd9\u6837\u7684\u9519\u8bef\uff1a</p>\n<pre class=\"screen\">\n<code class=\"computeroutput\">\nERROR:  return type mismatch in function declared to return emp\nDETAIL:  Final statement returns text instead of point at column 4.\n</code>\n</pre>\n<p>\u4e0e\u57fa\u7840\u7c7b\u578b\u7684\u60c5\u51b5\u4e00\u6837\uff0c\u7cfb\u7edf\u4e0d\u4f1a\u81ea\u52a8\u63d2\u5165\u663e\u5f0f\u8f6c\u6362\uff0c\u53ea\u4f1a\u63d2\u5165\u9690\u5f0f\u6216\u8d4b\u503c\u8f6c\u6362\u3002</p>\n</li>\n</ul>\n</div>\n<p lang=\"zh\">\u5b9a\u4e49\u540c\u6837\u7684\u51fd\u6570\u7684\u4e00\u79cd\u4e0d\u540c\u7684\u65b9\u6cd5\u662f\uff1a</p>\n<pre class=\"programlisting\">CREATE FUNCTION new_emp() RETURNS emp AS $$\n    SELECT ROW('None', 1000.0, 25, '(2,2)')::emp;\n$$ LANGUAGE SQL;\n</pre>\n<p lang=\"zh\">\u8fd9\u91cc\u6211\u4eec\u5199\u4e86\u4e00\u4e2a\u53ea\u8fd4\u56de\u5355\u5217\u3001\u4e14\u8be5\u5217\u5177\u6709\u6b63\u786e\u590d\u5408\u7c7b\u578b\u7684 <code class=\"command\">SELECT</code>\u3002\u5728\u8fd9\u79cd\u573a\u666f\u4e0b\uff0c\u8fd9\u6837\u5199\u5e76\u4e0d\u89c1\u5f97\u66f4\u597d\uff0c\u4f46\u5728\u67d0\u4e9b\u60c5\u51b5\u4e0b\u4f1a\u5f88\u65b9\u4fbf \u2014 \u4f8b\u5982\uff0c\u9700\u8981\u901a\u8fc7\u8c03\u7528\u53e6\u4e00\u4e2a\u8fd4\u56de\u76ee\u6807\u590d\u5408\u503c\u7684\u51fd\u6570\u6765\u8ba1\u7b97\u7ed3\u679c\u65f6\u3002\u8fd8\u6709\u4e00\u79cd\u60c5\u51b5\u662f\uff0c\u5982\u679c\u6211\u4eec\u8981\u7f16\u5199\u7684\u51fd\u6570\u8fd4\u56de\u7684\u662f\u57fa\u4e8e\u590d\u5408\u7c7b\u578b\u7684\u57df\uff0c\u800c\u4e0d\u662f\u666e\u901a\u590d\u5408\u7c7b\u578b\uff0c\u90a3\u4e48\u5c31\u5fc5\u987b\u5199\u6210\u8fd4\u56de\u5355\u5217\u7684\u5f62\u5f0f\uff0c\u56e0\u4e3a\u6ca1\u6709\u529e\u6cd5\u8ba9\u6574\u884c\u7ed3\u679c\u53d1\u751f\u6240\u9700\u7684\u5f3a\u5236\u8f6c\u6362\u3002</p>\n<p lang=\"zh\">\u6211\u4eec\u65e2\u53ef\u4ee5\u628a\u8fd9\u4e2a\u51fd\u6570\u76f4\u63a5\u5f53\u4f5c\u503c\u8868\u8fbe\u5f0f\u8c03\u7528\uff1a</p>\n<pre class=\"screen\">SELECT new_emp();\n\n         new_emp\n--------------------------\n (None,1000.0,25,\"(2,2)\")\n</pre>\n<p lang=\"zh\">\u4e5f\u53ef\u4ee5\u628a\u5b83\u5f53\u4f5c\u8868\u51fd\u6570\u6765\u8c03\u7528\uff1a</p>\n<pre class=\"screen\">SELECT * FROM new_emp();\n\n name | salary | age | cubicle\n------+--------+-----+---------\n None | 1000.0 |  25 | (2,2)\n</pre>\n<p lang=\"zh\">\u7b2c\u4e8c\u79cd\u65b9\u5f0f\u4f1a\u5728<a class=\"xref\" href=\"/docs/17/xfunc-sql.html#XFUNC-SQL-TABLE-FUNCTIONS\" title=\"36.5.8.\u00a0SQL \u51fd\u6570\u4f5c\u4e3a\u8868\u6765\u6e90\">\u7b2c\u00a036.5.8\u00a0\u8282</a>\u4e2d\u8fdb\u4e00\u6b65\u8bf4\u660e\u3002</p>\n<p lang=\"zh\">\u5f53\u4f60\u4f7f\u7528\u8fd4\u56de\u590d\u5408\u7c7b\u578b\u7684\u51fd\u6570\u65f6\uff0c\u53ef\u80fd\u53ea\u9700\u8981\u53d6\u5176\u7ed3\u679c\u4e2d\u7684\u4e00\u4e2a\u5b57\u6bb5\uff08\u5c5e\u6027\uff09\u3002\u53ef\u4ee5\u4f7f\u7528\u4e0b\u9762\u8fd9\u6837\u7684\u8bed\u6cd5\uff1a</p>\n<pre class=\"screen\">SELECT (new_emp()).name;\n\n name\n------\n None\n</pre>\n<p lang=\"zh\">\u8fd9\u91cc\u9700\u8981\u989d\u5916\u7684\u62ec\u53f7\uff0c\u4ee5\u514d\u89e3\u6790\u5668\u4ea7\u751f\u6b67\u4e49\u3002\u5982\u679c\u4e0d\u52a0\u62ec\u53f7\uff0c\u7ed3\u679c\u4f1a\u662f\u8fd9\u6837\uff1a</p>\n<pre class=\"screen\">SELECT new_emp().name;\nERROR:  syntax error at or near \".\"\nLINE 1: SELECT new_emp().name;\n                        ^\n</pre>\n<p lang=\"zh\">\u53e6\u4e00\u79cd\u9009\u62e9\u662f\u4f7f\u7528\u51fd\u6570\u8bb0\u6cd5\u6765\u63d0\u53d6\u5c5e\u6027\uff1a</p>\n<pre class=\"screen\">SELECT name(new_emp());\n\n name\n------\n None\n</pre>\n<p lang=\"zh\">\u5982<a class=\"xref\" href=\"/docs/17/rowtypes.html#ROWTYPES-USAGE\" title=\"8.16.5.\u00a0\u5728\u67e5\u8be2\u4e2d\u4f7f\u7528\u590d\u5408\u7c7b\u578b\">\u7b2c\u00a08.16.5\u00a0\u8282</a>\u6240\u8ff0\uff0c\u5b57\u6bb5\u8bb0\u6cd5\u548c\u51fd\u6570\u8bb0\u6cd5\u662f\u7b49\u4ef7\u7684\u3002</p>\n<p lang=\"zh\">\u53e6\u4e00\u79cd\u4f7f\u7528\u51fd\u6570\u8fd4\u56de\u590d\u5408\u7c7b\u578b\u7684\u65b9\u6cd5\u662f\u5c06\u7ed3\u679c\u4f20\u9012\u7ed9\u53e6\u4e00\u4e2a\u63a5\u53d7\u6b63\u786e\u884c\u7c7b\u578b\u4f5c\u4e3a\u8f93\u5165\u7684\u51fd\u6570\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION getname(emp) RETURNS text AS $$\n    SELECT $1.name;\n$$ LANGUAGE SQL;\n\nSELECT getname(new_emp());\n getname\n---------\n None\n(1 row)\n</pre>\n</div>\n<div class=\"sect2\" id=\"XFUNC-OUTPUT-PARAMETERS\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/17/xfunc-sql.html#XFUNC-OUTPUT-PARAMETERS\">36.5.4. \u5e26\u6709\u8f93\u51fa\u53c2\u6570\u7684<acronym class=\"acronym\">SQL</acronym>\u51fd\u6570</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\">\u63cf\u8ff0\u51fd\u6570\u7ed3\u679c\u7684\u53e6\u4e00\u79cd\u65b9\u6cd5\u662f\u4f7f\u7528<em class=\"firstterm\">\u8f93\u51fa\u53c2\u6570</em>\uff0c\u4f8b\u5982\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION add_em (IN x int, IN y int, OUT sum int)\nAS 'SELECT x + y'\nLANGUAGE SQL;\n\nSELECT add_em(3,7);\n add_em\n--------\n     10\n(1 row)\n</pre>\n<p lang=\"zh\">\u8fd9\u4e0e<a class=\"xref\" href=\"/docs/17/xfunc-sql.html#XFUNC-SQL-BASE-FUNCTIONS\" title=\"36.5.2.\u00a0\u57fa\u7840\u7c7b\u578b\u4e0a\u7684SQL\u51fd\u6570\">\u7b2c\u00a036.5.2\u00a0\u8282</a>\u4e2d\u5c55\u793a\u7684 <code class=\"literal\">add_em</code> \u7248\u672c\u672c\u8d28\u4e0a\u5e76\u65e0\u4e0d\u540c\u3002\u8f93\u51fa\u53c2\u6570\u7684\u771f\u6b63\u4ef7\u503c\u5728\u4e8e\uff0c\u5b83\u4eec\u4e3a\u5b9a\u4e49\u8fd4\u56de\u591a\u5217\u7684\u51fd\u6570\u63d0\u4f9b\u4e86\u4e00\u79cd\u65b9\u4fbf\u7684\u65b9\u6cd5\u3002\u4f8b\u5982\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION sum_n_product (x int, y int, OUT sum int, OUT product int)\nAS 'SELECT x + y, x * y'\nLANGUAGE SQL;\n\n SELECT * FROM sum_n_product(11,42);\n sum | product\n-----+---------\n  53 |     462\n(1 row)\n</pre>\n<p lang=\"zh\">\u8fd9\u91cc\u672c\u8d28\u4e0a\u53d1\u751f\u7684\u4e8b\u60c5\u662f\uff1a\u6211\u4eec\u4e3a\u8be5\u51fd\u6570\u7684\u7ed3\u679c\u521b\u5efa\u4e86\u4e00\u4e2a\u533f\u540d\u590d\u5408\u7c7b\u578b\u3002\u4e0a\u9762\u7684\u793a\u4f8b\u4e0e\u4e0b\u9762\u8fd9\u79cd\u5199\u6cd5\u7684\u6700\u7ec8\u6548\u679c\u76f8\u540c\uff1a</p>\n<pre class=\"screen\">CREATE TYPE sum_prod AS (sum int, product int);\n\nCREATE FUNCTION sum_n_product (int, int) RETURNS sum_prod\nAS 'SELECT $1 + $2, $1 * $2'\nLANGUAGE SQL;\n</pre>\n<p lang=\"zh\">\u4f46\u901a\u5e38\u4e0d\u5fc5\u989d\u5916\u5b9a\u4e49\u4e00\u4e2a\u72ec\u7acb\u7684\u590d\u5408\u7c7b\u578b\u4f1a\u66f4\u65b9\u4fbf\u3002\u6ce8\u610f\uff0c\u9644\u5728\u8f93\u51fa\u53c2\u6570\u4e0a\u7684\u540d\u79f0\u5e76\u975e\u53ea\u662f\u88c5\u9970\uff0c\u5b83\u4eec\u51b3\u5b9a\u4e86\u8fd9\u4e2a\u533f\u540d\u590d\u5408\u7c7b\u578b\u7684\u5217\u540d\u3002\uff08\u5982\u679c\u7701\u7565\u8f93\u51fa\u53c2\u6570\u540d\u79f0\uff0c\u7cfb\u7edf\u4f1a\u81ea\u884c\u9009\u62e9\u4e00\u4e2a\u540d\u79f0\u3002\uff09</p>\n<p lang=\"zh\">\u5728\u4ece SQL \u8c03\u7528\u8fd9\u6837\u4e00\u4e2a\u51fd\u6570\u65f6\uff0c\u8f93\u51fa\u53c2\u6570\u4e0d\u4f1a\u88ab\u5305\u62ec\u5728\u8c03\u7528\u53c2\u6570\u5217\u8868\u4e2d\u3002\u8fd9\u662f\u56e0\u4e3a<span class=\"productname\">PostgreSQL</span>\u53ea\u8003\u8651\u8f93\u5165\u53c2\u6570\u6765\u5b9a\u4e49\u51fd\u6570\u7684\u8c03\u7528\u7b7e\u540d\u3002\u8fd9\u4e5f\u610f\u5473\u7740\u5728\u4e3a\u8bf8\u5982\u5220\u9664\u51fd\u6570\u7b49\u76ee\u7684\u5f15\u7528\u8be5\u51fd\u6570\u65f6\u53ea\u6709\u8f93\u5165\u53c2\u6570\u6709\u5173\u7cfb\u3002\u6211\u4eec\u53ef\u4ee5\u7528\u4e0b\u9762\u7684\u547d\u4ee4\u4e4b\u4e00\u5220\u9664\u4e0a\u8ff0\u51fd\u6570</p>\n<pre class=\"screen\">DROP FUNCTION sum_n_product (x int, y int, OUT sum int, OUT product int);\nDROP FUNCTION sum_n_product (int, int);\n</pre>\n<p lang=\"zh\">\u53c2\u6570\u53ef\u4ee5\u88ab\u6807\u8bb0\u4e3a<code class=\"literal\">IN</code>\uff08\u9ed8\u8ba4\uff09\u3001<code class=\"literal\">OUT</code>\u3001<code class=\"literal\">INOUT</code>\u6216\u8005<code class=\"literal\">VARIADIC</code>\u3002\u4e00\u4e2a<code class=\"literal\">INOUT</code>\u53c2\u6570\u65e2\u4f5c\u4e3a\u4e00\u4e2a\u8f93\u5165\u53c2\u6570\uff08\u8c03\u7528\u53c2\u6570\u5217\u8868\u7684\u4e00\u90e8\u5206\uff09\u53c8\u4f5c\u4e3a\u4e00\u4e2a\u8f93\u51fa\u53c2\u6570\uff08\u7ed3\u679c\u8bb0\u5f55\u7c7b\u578b\u7684\u4e00\u90e8\u5206\uff09\u3002<code class=\"literal\">VARIADIC</code>\u53c2\u6570\u662f\u8f93\u5165\u53c2\u6570\uff0c\u4f46\u88ab\u6309\u7167\u4e0b\u6587\u6240\u8ff0\u7279\u6b8a\u5bf9\u5f85\u3002</p>\n</div>\n<div class=\"sect2\" id=\"XFUNC-OUTPUT-PARAMETERS-PROC\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/17/xfunc-sql.html#XFUNC-OUTPUT-PARAMETERS-PROC\">36.5.5. \u5e26\u6709\u8f93\u51fa\u53c2\u6570\u7684<acronym class=\"acronym\">SQL</acronym>\u8fc7\u7a0b</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\">\u8fc7\u7a0b\u4e5f\u652f\u6301\u8f93\u51fa\u53c2\u6570\uff0c\u4f46\u662f\u5b83\u4eec\u7684\u5de5\u4f5c\u65b9\u5f0f\u4e0e\u51fd\u6570\u7565\u6709\u4e0d\u540c\u3002\u5728<code class=\"command\">CALL</code>\u547d\u4ee4\u4e2d\uff0c\u8f93\u51fa\u53c2\u6570\u5fc5\u987b\u5305\u62ec\u5728\u53c2\u6570\u5217\u8868\u4e2d\u3002\u4f8b\u5982\uff0c\u524d\u9762\u7684\u94f6\u884c\u8d26\u6237\u501f\u8bb0\u4f8b\u7a0b\u53ef\u4ee5\u50cf\u8fd9\u6837\u5199\uff1a</p>\n<pre class=\"programlisting\">CREATE PROCEDURE tp1 (accountno integer, debit numeric, OUT new_balance numeric) AS $$\n    UPDATE bank\n        SET balance = balance - debit\n        WHERE accountno = tp1.accountno\n    RETURNING balance;\n$$ LANGUAGE SQL;\n</pre>\n<p lang=\"zh\">\u8981\u8c03\u7528\u8fd9\u4e2a\u4f8b\u7a0b\uff0c\u5fc5\u987b\u5305\u62ec\u5339\u914d<code class=\"literal\">OUT</code>\u53c2\u6570\u7684\u53c2\u6570\u3002\u901a\u5e38\u5199\u6210<code class=\"literal\">NULL</code>\uff1a</p>\n<pre class=\"programlisting\">CALL tp1(17, 100.0, NULL);\n</pre>\n<p lang=\"zh\">\u5982\u679c\u4f60\u5199\u7684\u662f\u5176\u4ed6\u5185\u5bb9\uff0c\u5b83\u5fc5\u987b\u662f\u4e00\u4e2a\u80fd\u591f\u50cf\u8f93\u5165\u53c2\u6570\u90a3\u6837\u88ab\u9690\u5f0f\u5f3a\u5236\u8f6c\u6362\u6210\u8be5\u53c2\u6570\u58f0\u660e\u7c7b\u578b\u7684\u8868\u8fbe\u5f0f\u3002\u4e0d\u8fc7\u8981\u6ce8\u610f\uff0c\u8fd9\u6837\u7684\u8868\u8fbe\u5f0f\u4e0d\u4f1a\u88ab\u6c42\u503c\u3002</p>\n<p lang=\"zh\">\u5f53\u4ece<span class=\"application\">PL/pgSQL</span>\u8c03\u7528\u8fc7\u7a0b\u65f6\uff0c\u4f60\u4e0d\u80fd\u5199<code class=\"literal\">NULL</code>\uff0c\u800c\u5fc5\u987b\u5199\u4e00\u4e2a\u7528\u4e8e\u63a5\u6536\u8fc7\u7a0b\u8f93\u51fa\u7684\u53d8\u91cf\u3002\u8be6\u89c1<a class=\"xref\" href=\"/docs/17/plpgsql-control-structures.html#PLPGSQL-STATEMENTS-CALLING-PROCEDURE\" title=\"41.6.3.\u00a0\u8c03\u7528\u8fc7\u7a0b\">\u7b2c\u00a041.6.3\u00a0\u8282</a>\u3002</p>\n</div>\n<div class=\"sect2\" id=\"XFUNC-SQL-VARIADIC-FUNCTIONS\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/17/xfunc-sql.html#XFUNC-SQL-VARIADIC-FUNCTIONS\">36.5.6. \u5e26\u6709\u53ef\u53d8\u6570\u91cf\u53c2\u6570\u7684<acronym class=\"acronym\">SQL</acronym>\u51fd\u6570</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\"><acronym class=\"acronym\">SQL</acronym> \u51fd\u6570\u53ef\u4ee5\u88ab\u58f0\u660e\u4e3a\u63a5\u53d7\u53ef\u53d8\u6570\u91cf\u7684\u53c2\u6570\uff0c\u53ea\u8981\u6240\u6709<span class=\"quote\">\u201c<span class=\"quote\">\u53ef\u9009</span>\u201d</span>\u53c2\u6570\u90fd\u5c5e\u4e8e\u540c\u4e00\u79cd\u6570\u636e\u7c7b\u578b\u3002\u53ef\u9009\u53c2\u6570\u4f1a\u4ee5\u6570\u7ec4\u5f62\u5f0f\u4f20\u9012\u7ed9\u51fd\u6570\u3002\u5b9a\u4e49\u8fd9\u7c7b\u51fd\u6570\u65f6\uff0c\u9700\u8981\u628a\u6700\u540e\u4e00\u4e2a\u53c2\u6570\u6807\u8bb0\u4e3a <code class=\"literal\">VARIADIC</code>\uff1b\u8be5\u53c2\u6570\u5fc5\u987b\u88ab\u58f0\u660e\u4e3a\u6570\u7ec4\u7c7b\u578b\u3002\u4f8b\u5982\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION mleast(VARIADIC arr numeric[]) RETURNS numeric AS $$\n    SELECT min($1[i]) FROM generate_subscripts($1, 1) g(i);\n$$ LANGUAGE SQL;\n\nSELECT mleast(10, -1, 5, 4.4);\n mleast\n--------\n     -1\n(1 row)\n</pre>\n<p lang=\"zh\">\u5b9e\u9645\u4e0a\uff0c\u4f4d\u4e8e <code class=\"literal\">VARIADIC</code> \u4f4d\u7f6e\u53ca\u4e4b\u540e\u7684\u6240\u6709\u5b9e\u53c2\u90fd\u4f1a\u88ab\u6536\u96c6\u6210\u4e00\u4e2a\u4e00\u7ef4\u6570\u7ec4\uff0c\u5c31\u50cf\u4f60\u5199\u6210\u4e86\uff1a</p>\n<pre class=\"screen\">SELECT mleast(ARRAY[10, -1, 5, 4.4]);    -- doesn't work\n</pre>\n<p lang=\"zh\">\u4e0d\u8fc7\u4f60\u5b9e\u9645\u4e0a\u4e0d\u80fd\u8fd9\u6837\u5199\uff0c\u81f3\u5c11\u5b83\u4e0d\u4f1a\u5339\u914d\u8fd9\u4e2a\u51fd\u6570\u5b9a\u4e49\u3002\u88ab\u6807\u8bb0\u4e3a <code class=\"literal\">VARIADIC</code> \u7684\u53c2\u6570\u5339\u914d\u7684\u662f\u5176\u5143\u7d20\u7c7b\u578b\u51fa\u73b0\u4e00\u6b21\u6216\u591a\u6b21\uff0c\u800c\u4e0d\u662f\u5b83\u81ea\u8eab\u7684\u6570\u7ec4\u7c7b\u578b\u3002</p>\n<p lang=\"zh\">\u6709\u65f6\u5019\uff0c\u80fd\u591f\u628a\u4e00\u4e2a\u5df2\u7ecf\u6784\u9020\u597d\u7684\u6570\u7ec4\u4f20\u7ed9\u53ef\u53d8\u53c2\u6570\u51fd\u6570\u4f1a\u5f88\u6709\u7528\uff0c\u5c24\u5176\u662f\u5f53\u4e00\u4e2a\u53ef\u53d8\u53c2\u6570\u51fd\u6570\u60f3\u628a\u5b83\u7684\u6570\u7ec4\u53c2\u6570\u518d\u4f20\u7ed9\u53e6\u4e00\u4e2a\u51fd\u6570\u65f6\u3002\u6b64\u5916\uff0c\u5728\u5141\u8bb8\u4e0d\u53d7\u4fe1\u4efb\u7528\u6237\u521b\u5efa\u5bf9\u8c61\u7684\u6a21\u5f0f\u4e2d\u8c03\u7528\u53ef\u53d8\u53c2\u6570\u51fd\u6570\u65f6\uff0c\u8fd9\u662f\u552f\u4e00\u5b89\u5168\u7684\u65b9\u5f0f\uff0c\u89c1<a class=\"xref\" href=\"/docs/17/typeconv-func.html\" title=\"10.3.\u00a0\u51fd\u6570\">\u7b2c\u00a010.3\u00a0\u8282</a>\u3002\u4f60\u53ef\u4ee5\u5728\u8c03\u7528\u4e2d\u6307\u5b9a<code class=\"literal\">VARIADIC</code>\u6765\u505a\u5230\u8fd9\u4e00\u70b9\uff1a</p>\n<pre class=\"screen\">SELECT mleast(VARIADIC ARRAY[10, -1, 5, 4.4]);\n</pre>\n<p lang=\"zh\">\u8fd9\u6837\u4f1a\u963b\u6b62\u51fd\u6570\u7684\u53ef\u53d8\u53c2\u6570\u6309\u5176\u5143\u7d20\u7c7b\u578b\u5c55\u5f00\uff0c\u4ece\u800c\u8ba9\u6570\u7ec4\u5b9e\u53c2\u80fd\u591f\u6309\u5e38\u89c4\u65b9\u5f0f\u5339\u914d\u3002<code class=\"literal\">VARIADIC</code> \u53ea\u80fd\u9644\u52a0\u5728\u51fd\u6570\u8c03\u7528\u7684\u6700\u540e\u4e00\u4e2a\u5b9e\u53c2\u4e0a\u3002</p>\n<p lang=\"zh\">\u5728\u8c03\u7528\u4e2d\u6307\u5b9a<code class=\"literal\">VARIADIC</code>\u4e5f\u662f\u5411\u53ef\u53d8\u53c2\u6570\u51fd\u6570\u4f20\u9012\u7a7a\u6570\u7ec4\u7684\u552f\u4e00\u65b9\u5f0f\uff0c\u4f8b\u5982\uff1a</p>\n<pre class=\"screen\">SELECT mleast(VARIADIC ARRAY[]::numeric[]);\n</pre>\n<p lang=\"zh\">\u4ec5\u4ec5\u5199\u6210<code class=\"literal\">SELECT mleast()</code>\u662f\u884c\u4e0d\u901a\u7684\uff0c\u56e0\u4e3a\u53ef\u53d8\u53c2\u6570\u5fc5\u987b\u5339\u914d\u81f3\u5c11\u4e00\u4e2a\u5b9e\u53c2\u3002\uff08\u5982\u679c\u4f60\u5e0c\u671b\u5141\u8bb8\u8fd9\u79cd\u8c03\u7528\uff0c\u53ef\u4ee5\u518d\u5b9a\u4e49\u4e00\u4e2a\u540c\u540d\u4e14\u4e0d\u5e26\u53c2\u6570\u7684\u51fd\u6570<code class=\"literal\">mleast</code>\u3002\uff09</p>\n<p lang=\"zh\">\u4ece\u53ef\u53d8\u53c2\u6570\u6d3e\u751f\u51fa\u7684\u6570\u7ec4\u5143\u7d20\u53c2\u6570\u4f1a\u88ab\u89c6\u4e3a\u6ca1\u6709\u81ea\u5df1\u7684\u540d\u5b57\u3002\u8fd9\u610f\u5473\u7740\u9664\u975e\u4f60\u6307\u5b9a\u4e86 <code class=\"literal\">VARIADIC</code>\uff0c\u5426\u5219\u4e0d\u80fd\u4f7f\u7528\u547d\u540d\u53c2\u6570\u6765\u8c03\u7528\u53ef\u53d8\u53c2\u6570\u51fd\u6570\uff08<a class=\"xref\" href=\"/docs/17/sql-syntax-calling-funcs.html\" title=\"4.3.\u00a0\u8c03\u7528\u51fd\u6570\">\u7b2c\u00a04.3\u00a0\u8282</a>\uff09\u3002\u4f8b\u5982\uff0c\u4e0b\u9762\u7684\u8c03\u7528\u662f\u53ef\u884c\u7684\uff1a</p>\n<pre class=\"screen\">SELECT mleast(VARIADIC arr =&gt; ARRAY[10, -1, 5, 4.4]);\n</pre>\n<p lang=\"zh\">\u4f46\u8fd9\u4e9b\u5c31\u4e0d\u884c\uff1a</p>\n<pre class=\"screen\">SELECT mleast(arr =&gt; 10);\nSELECT mleast(arr =&gt; ARRAY[10, -1, 5, 4.4]);\n</pre>\n</div>\n<div class=\"sect2\" id=\"XFUNC-SQL-PARAMETER-DEFAULTS\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/17/xfunc-sql.html#XFUNC-SQL-PARAMETER-DEFAULTS\">36.5.7. \u5e26\u6709\u53c2\u6570\u9ed8\u8ba4\u503c\u7684<acronym class=\"acronym\">SQL</acronym>\u51fd\u6570</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\">\u51fd\u6570\u53ef\u4ee5\u88ab\u58f0\u660e\u4e3a\u5bf9\u4e00\u4e9b\u6216\u8005\u6240\u6709\u8f93\u5165\u53c2\u6570\u5177\u6709\u9ed8\u8ba4\u503c\u3002\u53ea\u8981\u8c03\u7528\u51fd\u6570\u65f6\u6ca1\u6709\u7ed9\u51fa\u8db3\u591f\u591a\u7684\u5b9e\u53c2\uff0c\u5c31\u4f1a\u63d2\u5165\u9ed8\u8ba4\u503c\u6765\u5f25\u8865\u7f3a\u5931\u7684\u5b9e\u53c2\u3002\u7531\u4e8e\u53c2\u6570\u53ea\u80fd\u4ece\u5b9e\u53c2\u5217\u8868\u7684\u5c3e\u90e8\u5f00\u59cb\u88ab\u7701\u7565\uff0c\u5728\u4e00\u4e2a\u6709\u9ed8\u8ba4\u503c\u7684\u53c2\u6570\u4e4b\u540e\u7684\u6240\u6709\u53c2\u6570\u90fd\u4e0d\u5f97\u4e0d\u4e5f\u5177\u6709\u9ed8\u8ba4\u503c\uff08\u5c3d\u7ba1\u4f7f\u7528\u547d\u540d\u53c2\u6570\u8bb0\u6cd5\u53ef\u4ee5\u5141\u8bb8\u653e\u677e\u8fd9\u79cd\u9650\u5236\uff0c\u8fd9\u79cd\u9650\u5236\u4ecd\u7136\u4f1a\u88ab\u5f3a\u5236\u4ee5\u4fbf\u4f4d\u7f6e\u53c2\u6570\u8bb0\u6cd5\u80fd\u5de5\u4f5c\uff09\u3002\u4e0d\u7ba1\u4f60\u662f\u5426\u4f7f\u7528\u5b83\uff0c\u8fd9\u79cd\u80fd\u529b\u90fd\u8981\u6c42\u5728\u67d0\u4e9b\u7528\u6237\u4e0d\u4fe1\u4efb\u5176\u4ed6\u7528\u6237\u7684\u6570\u636e\u5e93\u4e2d\u8c03\u7528\u51fd\u6570\u65f6\u91c7\u53d6\u4e00\u4e9b\u9884\u9632\u63aa\u65bd\uff0c\u89c1<a class=\"xref\" href=\"/docs/17/typeconv-func.html\" title=\"10.3.\u00a0\u51fd\u6570\">\u7b2c\u00a010.3\u00a0\u8282</a>\u3002</p>\n<p lang=\"zh\">\u4f8b\u5982\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION foo(a int, b int DEFAULT 2, c int DEFAULT 3)\nRETURNS int\nLANGUAGE SQL\nAS $$\n    SELECT $1 + $2 + $3;\n$$;\n\nSELECT foo(10, 20, 30);\n foo\n-----\n  60\n(1 row)\n\nSELECT foo(10, 20);\n foo\n-----\n  33\n(1 row)\n\nSELECT foo(10);\n foo\n-----\n  15\n(1 row)\n\nSELECT foo();  -- fails since there is no default for the first argument\nERROR:  function foo() does not exist\n</pre>\n<p lang=\"zh\">\u4e5f\u53ef\u4ee5\u7528 <code class=\"literal\">=</code> \u7b26\u53f7\u4ee3\u66ff\u5173\u952e\u5b57 <code class=\"literal\">DEFAULT</code>\u3002</p>\n</div>\n<div class=\"sect2\" id=\"XFUNC-SQL-TABLE-FUNCTIONS\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/17/xfunc-sql.html#XFUNC-SQL-TABLE-FUNCTIONS\">36.5.8. <acronym class=\"acronym\">SQL</acronym> \u51fd\u6570\u4f5c\u4e3a\u8868\u6765\u6e90</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\">\u6240\u6709\u7684 SQL \u51fd\u6570\u90fd\u53ef\u4ee5\u88ab\u7528\u5728\u67e5\u8be2\u7684<code class=\"literal\">FROM</code>\u5b50\u53e5\u4e2d\uff0c\u4f46\u662f\u5bf9\u4e8e\u8fd4\u56de\u590d\u5408\u7c7b\u578b\u7684\u51fd\u6570\u7279\u522b\u6709\u7528\u3002\u5982\u679c\u51fd\u6570\u88ab\u5b9a\u4e49\u4e3a\u8fd4\u56de\u4e00\u79cd\u57fa\u7840\u7c7b\u578b\uff0c\u8be5\u8868\u51fd\u6570\u4f1a\u4ea7\u751f\u4e00\u4e2a\u5355\u5217\u8868\u3002\u5982\u679c\u8be5\u51fd\u6570\u88ab\u5b9a\u4e49\u4e3a\u8fd4\u56de\u4e00\u79cd\u590d\u5408\u7c7b\u578b\uff0c\u8be5\u8868\u51fd\u6570\u4f1a\u4e3a\u8be5\u590d\u5408\u7c7b\u578b\u7684\u6bcf\u4e00\u4e2a\u5c5e\u6027\u4ea7\u751f\u4e00\u5217\u3002</p>\n<p lang=\"zh\">\u4ee5\u4e0b\u662f\u4e00\u4e2a\u793a\u4f8b\uff1a</p>\n<pre class=\"screen\">CREATE TABLE foo (fooid int, foosubid int, fooname text);\nINSERT INTO foo VALUES (1, 1, 'Joe');\nINSERT INTO foo VALUES (1, 2, 'Ed');\nINSERT INTO foo VALUES (2, 1, 'Mary');\n\nCREATE FUNCTION getfoo(int) RETURNS foo AS $$\n    SELECT * FROM foo WHERE fooid = $1;\n$$ LANGUAGE SQL;\n\nSELECT *, upper(fooname) FROM getfoo(1) AS t1;\n\n fooid | foosubid | fooname | upper\n-------+----------+---------+-------\n     1 |        1 | Joe     | JOE\n(1 row)\n</pre>\n<p lang=\"zh\">\u5982\u793a\u4f8b\u6240\u793a\uff0c\u6211\u4eec\u53ef\u4ee5\u50cf\u64cd\u4f5c\u666e\u901a\u8868\u7684\u5217\u4e00\u6837\u64cd\u4f5c\u51fd\u6570\u7ed3\u679c\u4e2d\u7684\u5217\u3002</p>\n<p lang=\"zh\">\u6ce8\u610f\u6211\u4eec\u53ea\u4ece\u51fd\u6570\u5f97\u5230\u4e86\u4e00\u884c\u3002\u8fd9\u662f\u56e0\u4e3a\u6211\u4eec\u6ca1\u6709\u4f7f\u7528<code class=\"literal\">SETOF</code>\u3002\u8fd9\u4f1a\u5728\u4e0b\u4e00\u8282\u4e2d\u4ecb\u7ecd\u3002</p>\n</div>\n<div class=\"sect2\" id=\"XFUNC-SQL-FUNCTIONS-RETURNING-SET\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/17/xfunc-sql.html#XFUNC-SQL-FUNCTIONS-RETURNING-SET\">36.5.9. \u8fd4\u56de\u96c6\u5408\u7684<acronym class=\"acronym\">SQL</acronym>\u51fd\u6570</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\">\u5f53\u4e00\u4e2a SQL \u51fd\u6570\u88ab\u58f0\u660e\u4e3a\u8fd4\u56de<code class=\"literal\">SETOF <em class=\"replaceable\"><code>sometype</code></em></code>\u65f6\uff0c\u8be5\u51fd\u6570\u7684\u6700\u540e\u4e00\u4e2a\u67e5\u8be2\u4f1a\u88ab\u6267\u884c\u5b8c\uff0c\u5e76\u4e14\u5b83\u8f93\u51fa\u7684\u6bcf\u4e00\u884c\u90fd\u4f1a\u88ab\u4f5c\u4e3a\u7ed3\u679c\u96c6\u7684\u4e00\u4e2a\u5143\u7d20\u8fd4\u56de\u3002</p>\n<p lang=\"zh\">\u8fd9\u4e00\u7279\u6027\u901a\u5e38\u662f\u5728\u67e5\u8be2\u7684 <code class=\"literal\">FROM</code> \u5b50\u53e5\u4e2d\u8c03\u7528\u51fd\u6570\u65f6\u4f7f\u7528\u7684\u3002\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b\uff0c\u51fd\u6570\u8fd4\u56de\u7684\u6bcf\u4e00\u884c\u90fd\u4f1a\u6210\u4e3a\u67e5\u8be2\u6240\u89c1\u8868\u4e2d\u7684\u4e00\u884c\u3002\u4f8b\u5982\uff0c\u5047\u8bbe\u8868 <code class=\"literal\">foo</code> \u4e0e\u4e0a\u6587\u76f8\u540c\uff0c\u6211\u4eec\u5199\uff1a</p>\n<pre class=\"programlisting\">CREATE FUNCTION getfoo(int) RETURNS SETOF foo AS $$\n    SELECT * FROM foo WHERE fooid = $1;\n$$ LANGUAGE SQL;\n\nSELECT * FROM getfoo(1) AS t1;\n</pre>\n<p lang=\"zh\">\u90a3\u4e48\u4f1a\u5f97\u5230\uff1a</p>\n<pre class=\"screen\"> fooid | foosubid | fooname\n-------+----------+---------\n     1 |        1 | Joe\n     1 |        2 | Ed\n(2 rows)\n</pre>\n<p lang=\"zh\">\u4e5f\u53ef\u4ee5\u901a\u8fc7\u8f93\u51fa\u53c2\u6570\u5b9a\u4e49\u7684\u5217\u6765\u8fd4\u56de\u591a\u884c\uff0c\u4f8b\u5982\uff1a</p>\n<pre class=\"programlisting\">CREATE TABLE tab (y int, z int);\nINSERT INTO tab VALUES (1, 2), (3, 4), (5, 6), (7, 8);\n\nCREATE FUNCTION sum_n_product_with_tab (x int, OUT sum int, OUT product int)\nRETURNS SETOF record\nAS $$\n    SELECT $1 + tab.y, $1 * tab.y FROM tab;\n$$ LANGUAGE SQL;\n\nSELECT * FROM sum_n_product_with_tab(10);\n sum | product\n-----+---------\n  11 |      10\n  13 |      30\n  15 |      50\n  17 |      70\n(4 rows)\n</pre>\n<p lang=\"zh\">\u8fd9\u91cc\u7684\u5173\u952e\u70b9\u662f\uff1a\u4f60\u5fc5\u987b\u5199\u6210 <code class=\"literal\">RETURNS SETOF record</code>\uff0c\u4ee5\u8868\u660e\u8be5\u51fd\u6570\u8fd4\u56de\u7684\u662f\u591a\u884c\u800c\u4e0d\u662f\u5355\u884c\u3002\u5982\u679c\u53ea\u6709\u4e00\u4e2a\u8f93\u51fa\u53c2\u6570\uff0c\u5219\u5199\u8be5\u53c2\u6570\u7684\u7c7b\u578b\uff0c\u800c\u4e0d\u662f <code class=\"type\">record</code>\u3002</p>\n<p lang=\"zh\">\u901a\u8fc7\u591a\u6b21\u8c03\u7528\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u6765\u6784\u9020\u67e5\u8be2\u7ed3\u679c\u901a\u5e38\u5f88\u6709\u7528\uff0c\u5176\u4e2d\u6bcf\u6b21\u8c03\u7528\u7684\u53c2\u6570\u90fd\u6765\u81ea\u8868\u6216\u5b50\u67e5\u8be2\u7684\u8fde\u7eed\u884c\u3002\u9996\u9009\u65b9\u5f0f\u662f\u4f7f\u7528 <code class=\"literal\">LATERAL</code> \u5173\u952e\u5b57\uff0c\u8be6\u89c1<a class=\"xref\" href=\"/docs/17/queries-table-expressions.html#QUERIES-LATERAL\" title=\"7.2.1.5.\u00a0LATERAL\u5b50\u67e5\u8be2\">\u7b2c\u00a07.2.1.5\u00a0\u8282</a>\u3002\u4e0b\u9762\u662f\u4e00\u4e2a\u4f7f\u7528\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u679a\u4e3e\u6811\u7ed3\u6784\u5143\u7d20\u7684\u793a\u4f8b\uff1a</p>\n<pre class=\"screen\">SELECT * FROM nodes;\n   name    | parent\n-----------+--------\n Top       |\n Child1    | Top\n Child2    | Top\n Child3    | Top\n SubChild1 | Child1\n SubChild2 | Child1\n(6 rows)\n\nCREATE FUNCTION listchildren(text) RETURNS SETOF text AS $$\n    SELECT name FROM nodes WHERE parent = $1\n$$ LANGUAGE SQL STABLE;\n\nSELECT * FROM listchildren('Top');\n listchildren\n--------------\n Child1\n Child2\n Child3\n(3 rows)\n\nSELECT name, child FROM nodes, LATERAL listchildren(name) AS child;\n  name  |   child\n--------+-----------\n Top    | Child1\n Top    | Child2\n Top    | Child3\n Child1 | SubChild1\n Child1 | SubChild2\n(5 rows)\n</pre>\n<p lang=\"zh\">\u8fd9\u4e2a\u4f8b\u5b50\u5e76\u6ca1\u6709\u505a\u51fa\u4efb\u4f55\u65e0\u6cd5\u7528\u7b80\u5355\u8fde\u63a5\u5b9e\u73b0\u7684\u4e8b\uff0c\u4f46\u5728\u66f4\u590d\u6742\u7684\u8ba1\u7b97\u4e2d\uff0c\u628a\u4e00\u90e8\u5206\u5de5\u4f5c\u653e\u8fdb\u51fd\u6570\u91cc\u901a\u5e38\u4f1a\u975e\u5e38\u65b9\u4fbf\u3002</p>\n<p lang=\"zh\">\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u4e5f\u53ef\u4ee5\u51fa\u73b0\u5728\u67e5\u8be2\u7684\u9009\u62e9\u5217\u8868\u4e2d\u3002\u5bf9\u4e8e\u67e5\u8be2\u672c\u8eab\u751f\u6210\u7684\u6bcf\u4e00\u884c\uff0c\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u90fd\u4f1a\u88ab\u8c03\u7528\uff0c\u5e76\u4e3a\u5176\u7ed3\u679c\u96c6\u4e2d\u7684\u6bcf\u4e00\u4e2a\u5143\u7d20\u751f\u6210\u4e00\u884c\u8f93\u51fa\u3002\u524d\u9762\u7684\u4f8b\u5b50\u4e5f\u53ef\u4ee5\u5199\u6210\u8fd9\u6837\uff1a</p>\n<pre class=\"screen\">SELECT listchildren('Top');\n listchildren\n--------------\n Child1\n Child2\n Child3\n(3 rows)\n\nSELECT name, listchildren(name) FROM nodes;\n  name  | listchildren\n--------+--------------\n Top    | Child1\n Top    | Child2\n Top    | Child3\n Child1 | SubChild1\n Child1 | SubChild2\n(5 rows)\n</pre>\n<p lang=\"zh\">\u5728\u6700\u540e\u4e00\u4e2a <code class=\"command\">SELECT</code> \u4e2d\uff0c\u6ce8\u610f\u6ca1\u6709\u4e3a <code class=\"literal\">Child2</code>\u3001<code class=\"literal\">Child3</code> \u7b49\u663e\u793a\u4efb\u4f55\u8f93\u51fa\u884c\u3002\u8fd9\u662f\u56e0\u4e3a <code class=\"function\">listchildren</code> \u5bf9\u8fd9\u4e9b\u53c2\u6570\u8fd4\u56de\u7684\u662f\u7a7a\u96c6\uff0c\u56e0\u6b64\u4e0d\u4f1a\u751f\u6210\u7ed3\u679c\u884c\u3002\u8fd9\u4e0e\u4f7f\u7528 <code class=\"literal\">LATERAL</code> \u8bed\u6cd5\u628a\u51fd\u6570\u7ed3\u679c\u505a\u5185\u8fde\u63a5\u65f6\u5f97\u5230\u7684\u884c\u4e3a\u76f8\u540c\u3002</p>\n<p lang=\"zh\"><span class=\"productname\">PostgreSQL</span>\u4e2d\uff0c\u5199\u5728\u67e5\u8be2\u7684\u9009\u62e9\u5217\u8868\u4e2d\u7684\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u7684\u884c\u4e3a\u51e0\u4e4e\u548c\u5199\u5728<code class=\"literal\">LATERAL FROM</code>\u5b50\u53e5\u9879\u4e2d\u7684\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u5b8c\u5168\u4e00\u6837\u3002\u4f8b\u5982\uff1a</p>\n<pre class=\"programlisting\">SELECT x, generate_series(1,5) AS g FROM tab;\n</pre>\n<p lang=\"zh\">\u51e0\u4e4e\u7b49\u6548\u4e8e</p>\n<pre class=\"programlisting\">SELECT x, g FROM tab, LATERAL generate_series(1,5) AS g;\n</pre>\n<p lang=\"zh\">\u8fd9\u4f1a\u662f\u5b8c\u5168\u4e00\u6837\u7684\uff0c\u9664\u4e86\u5728\u8fd9\u4e2a\u7279\u522b\u7684\u793a\u4f8b\u4e2d\uff0c\u89c4\u5212\u5668\u53ef\u4ee5\u9009\u62e9\u628a<code class=\"structname\">g</code>\u653e\u5728\u5d4c\u5957\u5faa\u73af\u8fde\u63a5\u7684\u5916\u4fa7\uff0c\u56e0\u4e3a<code class=\"structname\">g</code>\u5bf9<code class=\"structname\">tab</code>\u6ca1\u6709\u5b9e\u9645\u7684\u6a2a\u5411\u4f9d\u8d56\u3002\u90a3\u4f1a\u5bfc\u81f4\u4e00\u79cd\u4e0d\u540c\u7684\u8f93\u51fa\u884c\u987a\u5e8f\u3002\u9009\u62e9\u5217\u8868\u4e2d\u7684\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u603b\u662f\u4f1a\u88ab\u8ba1\u7b97\uff0c\u5c31\u597d\u50cf\u5b83\u4eec\u5728<code class=\"literal\">FROM</code>\u5b50\u53e5\u5269\u4f59\u90e8\u5206\u7684\u5d4c\u5957\u5faa\u73af\u8fde\u63a5\u7684\u5185\u4fa7\u4e00\u6837\uff0c\u56e0\u6b64\u5728\u8003\u8651\u6765\u81ea<code class=\"literal\">FROM</code>\u5b50\u53e5\u7684\u4e0b\u4e00\u884c\u4e4b\u524d\uff0c\u8fd9\u4e9b\u51fd\u6570\u4f1a\u8fd0\u884c\u5230\u5b8c\u6210\u3002</p>\n<p lang=\"zh\">\u5982\u679c\u5728\u67e5\u8be2\u7684\u9009\u62e9\u5217\u8868\u4e2d\u6709\u4e0d\u6b62\u4e00\u4e2a\u96c6\u5408\u8fd4\u56de\u51fd\u6570\uff0c\u5219\u884c\u4e3a\u7c7b\u4f3c\u4e8e\u628a\u90a3\u4e9b\u51fd\u6570\u653e\u5230\u4e00\u4e2a\u5355\u4e00\u7684<code class=\"literal\">LATERAL ROWS FROM( ... )</code> <code class=\"literal\">FROM</code>\u5b50\u53e5\u9879\u4e2d\u7684\u884c\u4e3a\u3002\u5bf9\u4e8e\u6765\u81ea\u5e95\u5c42\u67e5\u8be2\u7684\u6bcf\u4e00\u884c\uff0c\u90fd\u6709\u4e00\u4e2a\u7528\u5230\u6bcf\u4e2a\u51fd\u6570\u9996\u4e2a\u7ed3\u679c\u7684\u8f93\u51fa\u884c\uff0c\u7136\u540e\u662f\u4e00\u4e2a\u4f7f\u7528\u6bcf\u4e2a\u51fd\u6570\u7b2c\u4e8c\u4e2a\u7ed3\u679c\u7684\u8f93\u51fa\u884c\uff0c\u4ee5\u6b64\u7c7b\u63a8\u3002\u5982\u679c\u67d0\u4e9b\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u4ea7\u751f\u7684\u8f93\u51fa\u6bd4\u5176\u4ed6\u51fd\u6570\u5c11\uff0c\u4f1a\u7528\u7a7a\u503c\u4ee3\u66ff\u7f3a\u5931\u7684\u6570\u636e\uff0c\u56e0\u6b64\u4e3a\u4e00\u4e2a\u5e95\u5c42\u884c\u5f62\u6210\u7684\u603b\u884c\u6570\u7b49\u4e8e\u4ea7\u751f\u6700\u591a\u8f93\u51fa\u7684\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u7684\u8f93\u51fa\u884c\u6570\u3002\u56e0\u6b64\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u4f1a<span class=\"quote\">\u201c<span class=\"quote\">\u6b65\u8c03\u4e00\u81f4</span>\u201d</span>\u5730\u8fd0\u884c\u76f4\u5230\u5b83\u4eec\u7684\u8f93\u51fa\u88ab\u8017\u5c3d\uff0c\u7136\u540e\u7528\u4e0b\u4e00\u4e2a\u5e95\u5c42\u884c\u7ee7\u7eed\u6267\u884c\u3002</p>\n<p lang=\"zh\">\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u53ef\u4ee5\u88ab\u5d4c\u5957\u5728\u4e00\u4e2a\u9009\u62e9\u5217\u8868\u4e2d\uff0c\u4e0d\u8fc7\u5728<code class=\"literal\">FROM</code>\u5b50\u53e5\u9879\u4e2d\u4e0d\u5141\u8bb8\u8fd9\u6837\u505a\u3002\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b\uff0c\u5d4c\u5957\u7684\u6bcf\u4e00\u5c42\u4f1a\u88ab\u5355\u72ec\u5bf9\u5f85\uff0c\u5c31\u50cf\u5b83\u662f\u4e00\u4e2a\u5355\u72ec\u7684<code class=\"literal\">LATERAL ROWS FROM( ... )</code>\u9879\u4e00\u6837\u3002\u4f8b\u5982\uff0c\u5728</p>\n<pre class=\"programlisting\">SELECT srf1(srf2(x), srf3(y)), srf4(srf5(z)) FROM tab;\n</pre>\n<p lang=\"zh\">\u4e2d\uff0c\u96c6\u5408\u8fd4\u56de\u51fd\u6570<code class=\"function\">srf2</code>\u3001<code class=\"function\">srf3</code>\u548c<code class=\"function\">srf5</code>\u5c06\u4e3a<code class=\"structname\">tab</code>\u7684\u6bcf\u4e00\u884c\u6b65\u8c03\u4e00\u81f4\u5730\u8fd0\u884c\uff0c\u7136\u540e\u4f1a\u5bf9\u8f83\u4f4e\u5c42\u7684\u51fd\u6570\u4ea7\u751f\u7684\u6bcf\u4e00\u884c\u4ee5\u6b65\u8c03\u4e00\u81f4\u7684\u5f62\u5f0f\u5e94\u7528<code class=\"function\">srf1</code>\u548c<code class=\"function\">srf4</code>\u3002</p>\n<p lang=\"zh\">\u5728<code class=\"literal\">CASE</code>\u6216<code class=\"literal\">COALESCE</code>\u8fd9\u6837\u7684\u6761\u4ef6\u8ba1\u7b97\u7ed3\u6784\u4e2d\uff0c\u4e0d\u80fd\u4f7f\u7528\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u3002\u4f8b\u5982\uff0c\u8003\u8651</p>\n<pre class=\"programlisting\">SELECT x, CASE WHEN x &gt; 0 THEN generate_series(1, 5) ELSE 0 END FROM tab;\n</pre>\n<p lang=\"zh\">\u8868\u9762\u4e0a\u770b\uff0c\u8fd9\u5e94\u5f53\u8ba9 x &gt; 0 \u7684\u8f93\u5165\u884c\u91cd\u590d\u4e94\u6b21\uff0c\u5176\u4f59\u884c\u53ea\u51fa\u73b0\u4e00\u6b21\uff1b\u4f46\u5b9e\u9645\u4e0a\uff0cgenerate_series(1, 5) \u4f1a\u5728 CASE \u8868\u8fbe\u5f0f\u6c42\u503c\u4e4b\u524d\uff0c\u4f5c\u4e3a\u9690\u5f0f LATERAL FROM \u9879\u6267\u884c\uff0c\u56e0\u6b64\u6bcf\u4e2a\u8f93\u5165\u884c\u90fd\u4f1a\u91cd\u590d\u4e94\u6b21\u3002\u4e3a\u907f\u514d\u6df7\u6dc6\uff0c\u6b64\u7c7b\u5199\u6cd5\u4f1a\u5728\u89e3\u6790\u9636\u6bb5\u62a5\u9519\u3002</p>\n<div class=\"note\">\n<h3 class=\"title\" lang=\"zh\">\u6ce8\u610f</h3>\n<p lang=\"zh\">\u5982\u679c\u51fd\u6570\u7684\u6700\u540e\u4e00\u6761\u547d\u4ee4\u662f\u5e26 RETURNING \u7684 INSERT\u3001UPDATE\u3001DELETE \u6216 MERGE\uff0c\u8be5\u547d\u4ee4\u59cb\u7ec8\u6267\u884c\u5230\u5b8c\u6210\uff0c\u5373\u4f7f\u51fd\u6570\u672a\u58f0\u660e SETOF\uff0c\u6216\u8c03\u7528\u67e5\u8be2\u672a\u83b7\u53d6\u5168\u90e8\u7ed3\u679c\u884c\u4e5f\u662f\u5982\u6b64\u3002RETURNING \u5b50\u53e5\u4ea7\u751f\u7684\u989d\u5916\u884c\u4f1a\u88ab\u9759\u9ed8\u4e22\u5f03\uff0c\u4f46\u6307\u5b9a\u7684\u8868\u4fee\u6539\u4ecd\u4f1a\u53d1\u751f\uff0c\u5e76\u5728\u51fd\u6570\u8fd4\u56de\u4e4b\u524d\u5168\u90e8\u5b8c\u6210\u3002</p>\n</div>\n<div class=\"note\">\n<h3 class=\"title\" lang=\"zh\">\u6ce8\u610f</h3>\n<p lang=\"zh\">\u5728 <span class=\"productname\">PostgreSQL</span> 10 \u4e4b\u524d\uff0c\u9664\u975e\u591a\u4e2a\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u59cb\u7ec8\u4ea7\u751f\u76f8\u540c\u6570\u91cf\u7684\u884c\uff0c\u5426\u5219\u628a\u5b83\u4eec\u653e\u5728\u540c\u4e00\u4e2a\u9009\u62e9\u5217\u8868\u4e2d\u7684\u884c\u4e3a\u5e76\u4e0d\u5408\u7406\u3002\u5426\u5219\uff0c\u5f97\u5230\u7684\u8f93\u51fa\u884c\u6570\u4f1a\u662f\u8fd9\u4e9b\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u5404\u81ea\u4ea7\u751f\u884c\u6570\u7684\u6700\u5c0f\u516c\u500d\u6570\u3002\u6b64\u5916\uff0c\u5d4c\u5957\u7684\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u4e5f\u4e0d\u50cf\u4e0a\u6587\u6240\u63cf\u8ff0\u7684\u90a3\u6837\u5de5\u4f5c\uff1b\u76f8\u53cd\uff0c\u4e00\u4e2a\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u81f3\u591a\u53ea\u80fd\u6709\u4e00\u4e2a\u96c6\u5408\u8fd4\u56de\u53c2\u6570\uff0c\u5e76\u4e14\u6bcf\u4e00\u7ec4\u5d4c\u5957\u7684\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u90fd\u4f1a\u72ec\u7acb\u8fd0\u884c\u3002\u518d\u52a0\u4e0a\u8fc7\u53bb\u8fd8\u5141\u8bb8\u6761\u4ef6\u6267\u884c\uff08\u5373\u5728 <code class=\"literal\">CASE</code> \u7b49\u7ed3\u6784\u5185\u90e8\u4f7f\u7528\u96c6\u5408\u8fd4\u56de\u51fd\u6570\uff09\uff0c\u4e8b\u60c5\u5c31\u66f4\u52a0\u590d\u6742\u4e86\u3002\u5982\u679c\u4f60\u8981\u7f16\u5199\u9700\u8981\u5728\u65e7\u7248 <span class=\"productname\">PostgreSQL</span> \u4e0a\u8fd0\u884c\u7684\u67e5\u8be2\uff0c\u5efa\u8bae\u4f7f\u7528 <code class=\"literal\">LATERAL</code> \u8bed\u6cd5\uff0c\u56e0\u4e3a\u8fd9\u6837\u5728\u4e0d\u540c\u7248\u672c\u4e4b\u95f4\u80fd\u591f\u5f97\u5230\u4e00\u81f4\u7684\u7ed3\u679c\u3002\u5982\u679c\u4f60\u7684\u67e5\u8be2\u4f9d\u8d56\u4e8e\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u7684\u6761\u4ef6\u6267\u884c\uff0c\u6216\u8bb8\u53ef\u4ee5\u628a\u6761\u4ef6\u5224\u65ad\u79fb\u52a8\u5230\u81ea\u5b9a\u4e49\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u5185\u90e8\u6765\u4fee\u590d\u3002\u4f8b\u5982\uff0c</p>\n<pre class=\"programlisting\">SELECT x, CASE WHEN y &gt; 0 THEN generate_series(1, z) ELSE 5 END FROM tab;\n</pre>\n<p lang=\"zh\">\u53ef\u4ee5\u53d8\u6210</p>\n<pre class=\"programlisting\">CREATE FUNCTION case_generate_series(cond bool, start int, fin int, els int)\n  RETURNS SETOF int AS $$\nBEGIN\n  IF cond THEN\n    RETURN QUERY SELECT generate_series(start, fin);\n  ELSE\n    RETURN QUERY SELECT els;\n  END IF;\nEND$$ LANGUAGE plpgsql;\n\nSELECT x, case_generate_series(y &gt; 0, 1, z, 5) FROM tab;\n</pre>\n<p lang=\"zh\">\u8fd9\u79cd\u5199\u6cd5\u5728\u6240\u6709\u7248\u672c\u7684 <span class=\"productname\">PostgreSQL</span> \u4e2d\u7684\u884c\u4e3a\u90fd\u76f8\u540c\u3002</p>\n</div>\n</div>\n<div class=\"sect2\" id=\"XFUNC-SQL-FUNCTIONS-RETURNING-TABLE\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/17/xfunc-sql.html#XFUNC-SQL-FUNCTIONS-RETURNING-TABLE\">36.5.10. \u8fd4\u56de<code class=\"literal\">TABLE</code>\u7684<acronym class=\"acronym\">SQL</acronym>\u51fd\u6570</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\">\u8fd8\u6709\u53e6\u4e00\u79cd\u65b9\u6cd5\u53ef\u4ee5\u628a\u51fd\u6570\u58f0\u660e\u4e3a\u8fd4\u56de\u4e00\u4e2a\u96c6\u5408\uff0c\u5373\u4f7f\u7528 <code class=\"literal\">RETURNS TABLE(<em class=\"replaceable\"><code>columns</code></em>)</code>\u8bed\u6cd5\u3002\u8fd9\u7b49\u6548\u4e8e\u4f7f\u7528\u4e00\u4e2a\u6216\u8005\u591a\u4e2a<code class=\"literal\">OUT</code>\u53c2\u6570\u5916\u52a0\u628a\u51fd\u6570\u6807\u8bb0\u4e3a\u8fd4\u56de <code class=\"literal\">SETOF record</code>\uff08\u6216\u8005\u662f<code class=\"literal\">SETOF</code>\u5355\u4e2a\u8f93\u51fa\u53c2\u6570\u7684\u7c7b\u578b\uff09\u3002\u8fd9\u79cd\u5199\u6cd5\u662f\u5728\u6700\u8fd1\u7684 SQL \u6807\u51c6\u4e2d\u6307\u5b9a\u7684\uff0c\u56e0\u6b64\u53ef\u80fd\u6bd4\u4f7f\u7528 <code class=\"literal\">SETOF</code>\u7684\u79fb\u690d\u6027\u66f4\u597d\u3002</p>\n<p lang=\"zh\">\u4f8b\u5982\uff0c\u524d\u9762\u7684\u6c42\u548c\u5e76\u4e14\u76f8\u4e58\u7684\u793a\u4f8b\u4e5f\u53ef\u4ee5\u8fd9\u6837\u6765\u505a\uff1a</p>\n<pre class=\"programlisting\">CREATE FUNCTION sum_n_product_with_tab (x int)\nRETURNS TABLE(sum int, product int) AS $$\n    SELECT $1 + tab.y, $1 * tab.y FROM tab;\n$$ LANGUAGE SQL;\n</pre>\n<p lang=\"zh\">\u4e0d\u5141\u8bb8\u628a\u663e\u5f0f\u7684<code class=\"literal\">OUT</code>\u6216\u8005<code class=\"literal\">INOUT</code>\u53c2\u6570\u7528\u4e8e <code class=\"literal\">RETURNS TABLE</code>\u8bb0\u6cd5 \u2014 \u5fc5\u987b\u628a\u6240\u6709\u8f93\u51fa\u5217\u653e\u5728 <code class=\"literal\">TABLE</code>\u5217\u8868\u4e2d\u3002</p>\n</div>\n<div class=\"sect2\" id=\"XFUNC-SQL-POLYMORPHIC-FUNCTIONS\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/17/xfunc-sql.html#XFUNC-SQL-POLYMORPHIC-FUNCTIONS\">36.5.11. \u591a\u6001<acronym class=\"acronym\">SQL</acronym>\u51fd\u6570</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\"><acronym class=\"acronym\">SQL</acronym> \u51fd\u6570\u53ef\u4ee5\u88ab\u58f0\u660e\u4e3a\u63a5\u53d7\u5e76\u8fd4\u56de<a class=\"xref\" href=\"/docs/17/extend-type-system.html#EXTEND-TYPES-POLYMORPHIC\" title=\"36.2.5.\u00a0\u591a\u6001\u7c7b\u578b\">\u7b2c\u00a036.2.5\u00a0\u8282</a>\u4e2d\u63cf\u8ff0\u7684\u591a\u6001\u7c7b\u578b\u3002\u4e0b\u9762\u8fd9\u4e2a\u591a\u6001\u51fd\u6570 <code class=\"function\">make_array</code> \u4f1a\u6839\u636e\u4e24\u4e2a\u4efb\u610f\u6570\u636e\u7c7b\u578b\u7684\u5143\u7d20\u6784\u9020\u4e00\u4e2a\u6570\u7ec4\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION make_array(anyelement, anyelement) RETURNS anyarray AS $$\n    SELECT ARRAY[$1, $2];\n$$ LANGUAGE SQL;\n\nSELECT make_array(1, 2) AS intarray, make_array('a'::text, 'b') AS textarray;\n intarray | textarray\n----------+-----------\n {1,2}    | {a,b}\n(1 row)\n</pre>\n<p lang=\"zh\">\u6ce8\u610f\u7c7b\u578b\u8f6c\u6362<code class=\"literal\">'a'::text</code>\u7684\u4f7f\u7528\u662f\u4e3a\u4e86\u6307\u5b9a\u8be5\u53c2\u6570\u7684\u7c7b\u578b\u662f<code class=\"type\">text</code>\u3002\u5982\u679c\u8be5\u53c2\u6570\u53ea\u662f\u4e00\u4e2a\u5b57\u7b26\u4e32\u5b57\u9762\u91cf\uff0c\u8fd9\u5c31\u662f\u5fc5\u987b\u7684\uff0c\u56e0\u4e3a\u5426\u5219\u5b83\u4f1a\u88ab\u5f53\u4f5c<code class=\"type\">unknown</code>\u7c7b\u578b\uff0c\u5e76\u4e14 <code class=\"type\">unknown</code>\u7684\u6570\u7ec4\u4e5f\u4e0d\u662f\u4e00\u79cd\u5408\u6cd5\u7684\u7c7b\u578b\u3002\u5982\u679c\u6ca1\u6709\u8be5\u7c7b\u578b\u8f6c\u6362\uff0c\u5c06\u5f97\u5230\u8fd9\u6837\u7684\u9519\u8bef\uff1a</p>\n<pre class=\"screen\">ERROR:  could not determine polymorphic type because input has type unknown\n</pre>\n<p lang=\"zh\">\u6309\u7167\u4e0a\u9762\u7684\u65b9\u5f0f\u58f0\u660e <code class=\"function\">make_array</code> \u65f6\uff0c\u4f60\u5fc5\u987b\u63d0\u4f9b\u4e24\u4e2a\u6570\u636e\u7c7b\u578b\u5b8c\u5168\u76f8\u540c\u7684\u53c2\u6570\uff1b\u7cfb\u7edf\u4e0d\u4f1a\u5c1d\u8bd5\u89e3\u51b3\u5b83\u4eec\u4e4b\u95f4\u7684\u7c7b\u578b\u5dee\u5f02\u3002\u4f8b\u5982\uff0c\u4e0b\u9762\u8fd9\u6837\u662f\u4e0d\u884c\u7684\uff1a</p>\n<pre class=\"screen\">SELECT make_array(1, 2.5) AS numericarray;\nERROR:  function make_array(integer, numeric) does not exist\n</pre>\n<p lang=\"zh\">\u53e6\u4e00\u79cd\u65b9\u6cd5\u662f\u4f7f\u7528<span class=\"quote\">\u201c<span class=\"quote\">common</span>\u201d</span>\u8fd9\u4e00\u65cf\u591a\u6001\u7c7b\u578b\uff0c\u5b83\u5141\u8bb8\u7cfb\u7edf\u5c1d\u8bd5\u8bc6\u522b\u4e00\u4e2a\u5408\u9002\u7684\u516c\u5171\u7c7b\u578b\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION make_array2(anycompatible, anycompatible)\nRETURNS anycompatiblearray AS $$\n    SELECT ARRAY[$1, $2];\n$$ LANGUAGE SQL;\n\nSELECT make_array2(1, 2.5) AS numericarray;\n numericarray\n--------------\n {1,2.5}\n(1 row)\n</pre>\n<p lang=\"zh\">\u7531\u4e8e\u516c\u5171\u7c7b\u578b\u89e3\u6790\u89c4\u5219\u5728\u6240\u6709\u8f93\u5165\u90fd\u662f\u672a\u77e5\u7c7b\u578b\u65f6\u9ed8\u8ba4\u9009\u62e9 <code class=\"type\">text</code>\uff0c\u6240\u4ee5\u4e0b\u9762\u7684\u5199\u6cd5\u4e5f\u80fd\u5de5\u4f5c\uff1a</p>\n<pre class=\"screen\">SELECT make_array2('a', 'b') AS textarray;\n textarray\n-----------\n {a,b}\n(1 row)\n</pre>\n<p lang=\"zh\">\u5141\u8bb8\u5b58\u5728\u5177\u6709\u56fa\u5b9a\u8fd4\u56de\u7c7b\u578b\u7684\u591a\u6001\u53c2\u6570\uff0c\u4f46\u53cd\u8fc7\u6765\u5219\u4e0d\u5141\u8bb8\u3002\u4f8b\u5982\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION is_greater(anyelement, anyelement) RETURNS boolean AS $$\n    SELECT $1 &gt; $2;\n$$ LANGUAGE SQL;\n\nSELECT is_greater(1, 2);\n is_greater\n------------\n f\n(1 row)\n\nCREATE FUNCTION invalid_func() RETURNS anyelement AS $$\n    SELECT 1;\n$$ LANGUAGE SQL;\nERROR:  cannot determine result data type\nDETAIL:  A result of type anyelement requires at least one input of type anyelement, anyarray, anynonarray, anyenum, or anyrange.\n</pre>\n<p lang=\"zh\">\u591a\u6001\u4e5f\u53ef\u4ee5\u548c\u5e26\u8f93\u51fa\u53c2\u6570\u7684\u51fd\u6570\u4e00\u8d77\u4f7f\u7528\u3002\u4f8b\u5982\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION dup (f1 anyelement, OUT f2 anyelement, OUT f3 anyarray)\nAS 'select $1, array[$1,$1]' LANGUAGE SQL;\n\nSELECT * FROM dup(22);\n f2 |   f3\n----+---------\n 22 | {22,22}\n(1 row)\n</pre>\n<p lang=\"zh\">\u591a\u6001\u4e5f\u53ef\u4ee5\u7528\u4e8e\u53ef\u53d8\u53c2\u6570\u51fd\u6570\u3002\u4f8b\u5982\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION anyleast (VARIADIC anyarray) RETURNS anyelement AS $$\n    SELECT min($1[i]) FROM generate_subscripts($1, 1) g(i);\n$$ LANGUAGE SQL;\n\nSELECT anyleast(10, -1, 5, 4);\n anyleast\n----------\n       -1\n(1 row)\n\nSELECT anyleast('abc'::text, 'def');\n anyleast\n----------\n abc\n(1 row)\n\nCREATE FUNCTION concat_values(text, VARIADIC anyarray) RETURNS text AS $$\n    SELECT array_to_string($2, $1);\n$$ LANGUAGE SQL;\n\nSELECT concat_values('|', 1, 4, 2);\n concat_values\n---------------\n 1|4|2\n(1 row)\n</pre>\n</div>\n<div class=\"sect2\" id=\"XFUNC-SQL-COLLATIONS\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/17/xfunc-sql.html#XFUNC-SQL-COLLATIONS\">36.5.12. \u5e26\u6709\u6392\u5e8f\u89c4\u5219\u7684<acronym class=\"acronym\">SQL</acronym>\u51fd\u6570</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\">\u5f53\u4e00\u4e2a SQL \u51fd\u6570\u6709\u4e00\u4e2a\u6216\u591a\u4e2a\u652f\u6301\u6392\u5e8f\u89c4\u5219\u7684\u6570\u636e\u7c7b\u578b\u53c2\u6570\u65f6\uff0c\u4f1a\u6309<a class=\"xref\" href=\"/docs/17/collation.html\" title=\"23.2.\u00a0\u6392\u5e8f\u89c4\u5219\u652f\u6301\">\u7b2c\u00a023.2\u00a0\u8282</a>\u4e2d\u7684\u8bf4\u660e\uff0c\u6839\u636e\u5206\u914d\u7ed9\u5b9e\u53c2\u7684\u6392\u5e8f\u89c4\u5219\uff0c\u4e3a\u6bcf\u6b21\u51fd\u6570\u8c03\u7528\u786e\u5b9a\u4e00\u4e2a\u6392\u5e8f\u89c4\u5219\u3002\u5982\u679c\u80fd\u591f\u6210\u529f\u786e\u5b9a\uff08\u4e5f\u5c31\u662f\u8bf4\uff0c\u53c2\u6570\u4e4b\u95f4\u4e0d\u5b58\u5728\u9690\u5f0f\u6392\u5e8f\u89c4\u5219\u51b2\u7a81\uff09\uff0c\u90a3\u4e48\u6240\u6709\u652f\u6301\u6392\u5e8f\u89c4\u5219\u7684\u53c2\u6570\u90fd\u4f1a\u88ab\u89c6\u4e3a\u9690\u5f0f\u5e26\u6709\u8be5\u6392\u5e8f\u89c4\u5219\u3002\u8fd9\u4f1a\u5f71\u54cd\u51fd\u6570\u4e2d\u5bf9\u6392\u5e8f\u89c4\u5219\u654f\u611f\u7684\u64cd\u4f5c\u7684\u884c\u4e3a\u3002\u4f8b\u5982\uff0c\u4f7f\u7528\u4e0a\u6587\u7684 <code class=\"function\">anyleast</code> \u51fd\u6570\u65f6\uff0c</p>\n<pre class=\"programlisting\">SELECT anyleast('abc'::text, 'ABC');\n</pre>\n<p lang=\"zh\">\u5176\u7ed3\u679c\u5c06\u53d6\u51b3\u4e8e\u6570\u636e\u5e93\u7684\u9ed8\u8ba4\u6392\u5e8f\u89c4\u5219\u3002\u5728 <code class=\"literal\">C</code> \u533a\u57df\u8bbe\u7f6e\u4e0b\uff0c\u7ed3\u679c\u4f1a\u662f <code class=\"literal\">ABC</code>\uff0c\u4f46\u5728\u8bb8\u591a\u5176\u4ed6\u533a\u57df\u8bbe\u7f6e\u4e0b\u5219\u4f1a\u662f <code class=\"literal\">abc</code>\u3002\u53ef\u4ee5\u5728\u4efb\u610f\u53c2\u6570\u4e0a\u6dfb\u52a0 <code class=\"literal\">COLLATE</code> \u5b50\u53e5\u6765\u5f3a\u5236\u6307\u5b9a\u8981\u4f7f\u7528\u7684\u6392\u5e8f\u89c4\u5219\uff0c\u4f8b\u5982\uff1a</p>\n<pre class=\"programlisting\">SELECT anyleast('abc'::text, 'ABC' COLLATE \"C\");\n</pre>\n<p lang=\"zh\">\u53e6\u5916\uff0c\u5982\u679c\u4f60\u5e0c\u671b\u67d0\u4e2a\u51fd\u6570\u65e0\u8bba\u4ee5\u4ec0\u4e48\u6392\u5e8f\u89c4\u5219\u8c03\u7528\uff0c\u90fd\u59cb\u7ec8\u6309\u7279\u5b9a\u6392\u5e8f\u89c4\u5219\u5de5\u4f5c\uff0c\u53ef\u4ee5\u5728\u51fd\u6570\u5b9a\u4e49\u4e2d\u6309\u9700\u63d2\u5165 <code class=\"literal\">COLLATE</code> \u5b50\u53e5\u3002\u4e0b\u9762\u8fd9\u4e2a\u7248\u672c\u7684 <code class=\"function\">anyleast</code> \u5c06\u59cb\u7ec8\u4f7f\u7528 <code class=\"literal\">en_US</code> \u533a\u57df\u8bbe\u7f6e\u6765\u6bd4\u8f83\u5b57\u7b26\u4e32\uff1a</p>\n<pre class=\"programlisting\">CREATE FUNCTION anyleast (VARIADIC anyarray) RETURNS anyelement AS $$\n    SELECT min($1[i] COLLATE \"en_US\") FROM generate_subscripts($1, 1) g(i);\n$$ LANGUAGE SQL;\n</pre>\n<p lang=\"zh\">\u4f46\u8bf7\u6ce8\u610f\uff0c\u5982\u679c\u628a\u5b83\u7528\u4e8e\u4e0d\u652f\u6301\u6392\u5e8f\u89c4\u5219\u7684\u6570\u636e\u7c7b\u578b\uff0c\u5c31\u4f1a\u629b\u51fa\u9519\u8bef\u3002</p>\n<p lang=\"zh\">\u5982\u679c\u65e0\u6cd5\u5728\u5b9e\u53c2\u4e4b\u95f4\u786e\u5b9a\u5171\u540c\u7684\u6392\u5e8f\u89c4\u5219\uff0c\u90a3\u4e48 SQL \u51fd\u6570\u4f1a\u628a\u53c2\u6570\u89c6\u4e3a\u5e26\u6709\u5176\u6570\u636e\u7c7b\u578b\u7684\u9ed8\u8ba4\u6392\u5e8f\u89c4\u5219\uff08\u901a\u5e38\u662f\u6570\u636e\u5e93\u7684\u9ed8\u8ba4\u6392\u5e8f\u89c4\u5219\uff0c\u4f46\u5bf9\u57df\u7c7b\u578b\u53c2\u6570\u6765\u8bf4\u4e5f\u53ef\u80fd\u4e0d\u540c\uff09\u3002</p>\n<p lang=\"zh\">\u8fd9\u79cd\u652f\u6301\u6392\u5e8f\u89c4\u5219\u7684\u53c2\u6570\u7684\u884c\u4e3a\uff0c\u53ef\u4ee5\u770b\u4f5c\u662f\u4ec5\u9002\u7528\u4e8e\u6587\u672c\u6570\u636e\u7c7b\u578b\u7684\u4e00\u79cd\u53d7\u9650\u591a\u6001\u5f62\u5f0f\u3002</p>\n</div>\n</div>", "manual_path": "/docs/17/xfunc-sql.html", "localization": {"status": "complete", "sources": [{"url": "/docs/17/xfunc-sql.html", "method": "same-major semantic node", "sha256": "add7047da409d0c2187eee25796f446045cf7c4808ac263fc409849c67fc853f", "language": "zh", "matched_nodes": ["#XFUNC-SQL/div[11]/h3[0]", "#XFUNC-SQL/div[13]/p[2]", "#XFUNC-SQL/div[13]/p[3]", "#XFUNC-SQL/div[13]/p[4]", "#XFUNC-SQL/div[13]/p[5]", "#XFUNC-SQL/div[13]/p[6]", "#XFUNC-SQL/div[13]/p[8]", "#XFUNC-SQL/div[14]/p[10]", "#XFUNC-SQL/div[14]/p[12]", "#XFUNC-SQL/div[14]/p[13]", "#XFUNC-SQL/div[14]/p[15]", "#XFUNC-SQL/div[14]/p[17]", "#XFUNC-SQL/div[14]/p[19]", "#XFUNC-SQL/div[14]/p[1]", "#XFUNC-SQL/div[14]/p[3]", "#XFUNC-SQL/div[14]/p[4]", "#XFUNC-SQL/div[14]/p[6]", "#XFUNC-SQL/div[14]/p[8]", "#XFUNC-SQL/div[15]/div[12]/ul[0]/li[0]", "#XFUNC-SQL/div[15]/div[12]/ul[0]/li[1]", "#XFUNC-SQL/div[15]/p[10]", "#XFUNC-SQL/div[15]/p[11]", "#XFUNC-SQL/div[15]/p[13]", "#XFUNC-SQL/div[15]/p[15]", "#XFUNC-SQL/div[15]/p[16]", "#XFUNC-SQL/div[15]/p[18]", "#XFUNC-SQL/div[15]/p[1]", "#XFUNC-SQL/div[15]/p[20]", "#XFUNC-SQL/div[15]/p[21]", "#XFUNC-SQL/div[15]/p[23]", "#XFUNC-SQL/div[15]/p[25]", "#XFUNC-SQL/div[15]/p[27]", "#XFUNC-SQL/div[15]/p[28]", "#XFUNC-SQL/div[15]/p[3]", "#XFUNC-SQL/div[15]/p[5]", "#XFUNC-SQL/div[15]/p[6]", "#XFUNC-SQL/div[15]/p[8]", "#XFUNC-SQL/div[16]/p[11]", "#XFUNC-SQL/div[16]/p[2]", "#XFUNC-SQL/div[16]/p[4]", "#XFUNC-SQL/div[16]/p[6]", "#XFUNC-SQL/div[16]/p[8]", "#XFUNC-SQL/div[16]/p[9]", "#XFUNC-SQL/div[17]/p[2]", "#XFUNC-SQL/div[17]/p[4]", "#XFUNC-SQL/div[17]/p[6]", "#XFUNC-SQL/div[17]/p[7]", "#XFUNC-SQL/div[18]/p[10]", "#XFUNC-SQL/div[18]/p[11]", "#XFUNC-SQL/div[18]/p[13]", "#XFUNC-SQL/div[18]/p[14]", "#XFUNC-SQL/div[18]/p[16]", "#XFUNC-SQL/div[18]/p[3]", "#XFUNC-SQL/div[18]/p[5]", "#XFUNC-SQL/div[18]/p[7]", "#XFUNC-SQL/div[18]/p[8]", "#XFUNC-SQL/div[19]/p[2]", "#XFUNC-SQL/div[19]/p[3]", "#XFUNC-SQL/div[19]/p[5]", "#XFUNC-SQL/div[1]/dl[0]/dt[0]", "#XFUNC-SQL/div[1]/dl[0]/dt[10]", "#XFUNC-SQL/div[1]/dl[0]/dt[11]", "#XFUNC-SQL/div[1]/dl[0]/dt[1]", "#XFUNC-SQL/div[1]/dl[0]/dt[2]", "#XFUNC-SQL/div[1]/dl[0]/dt[3]", "#XFUNC-SQL/div[1]/dl[0]/dt[4]", "#XFUNC-SQL/div[1]/dl[0]/dt[5]", "#XFUNC-SQL/div[1]/dl[0]/dt[6]", "#XFUNC-SQL/div[1]/dl[0]/dt[7]", "#XFUNC-SQL/div[1]/dl[0]/dt[8]", "#XFUNC-SQL/div[1]/dl[0]/dt[9]", "#XFUNC-SQL/div[20]/p[1]", "#XFUNC-SQL/div[20]/p[2]", "#XFUNC-SQL/div[20]/p[4]", "#XFUNC-SQL/div[20]/p[5]", "#XFUNC-SQL/div[21]/div[29]/p[1]", "#XFUNC-SQL/div[21]/div[29]/p[3]", "#XFUNC-SQL/div[21]/div[29]/p[5]", "#XFUNC-SQL/div[21]/p[10]", "#XFUNC-SQL/div[21]/p[12]", "#XFUNC-SQL/div[21]/p[13]", "#XFUNC-SQL/div[21]/p[15]", "#XFUNC-SQL/div[21]/p[16]", "#XFUNC-SQL/div[21]/p[18]", "#XFUNC-SQL/div[21]/p[20]", "#XFUNC-SQL/div[21]/p[21]", "#XFUNC-SQL/div[21]/p[22]", "#XFUNC-SQL/div[21]/p[24]", "#XFUNC-SQL/div[21]/p[25]", "#XFUNC-SQL/div[21]/p[2]", "#XFUNC-SQL/div[21]/p[3]", "#XFUNC-SQL/div[21]/p[5]", "#XFUNC-SQL/div[21]/p[7]", "#XFUNC-SQL/div[21]/p[9]", "#XFUNC-SQL/div[22]/p[2]", "#XFUNC-SQL/div[22]/p[3]", "#XFUNC-SQL/div[22]/p[5]", "#XFUNC-SQL/div[23]/p[11]", "#XFUNC-SQL/div[23]/p[13]", "#XFUNC-SQL/div[23]/p[15]", "#XFUNC-SQL/div[23]/p[1]", "#XFUNC-SQL/div[23]/p[3]", "#XFUNC-SQL/div[23]/p[5]", "#XFUNC-SQL/div[23]/p[7]", "#XFUNC-SQL/div[23]/p[9]", "#XFUNC-SQL/div[24]/p[10]", "#XFUNC-SQL/div[24]/p[2]", "#XFUNC-SQL/div[24]/p[4]", "#XFUNC-SQL/div[24]/p[6]", "#XFUNC-SQL/div[24]/p[8]", "#XFUNC-SQL/div[24]/p[9]", "#XFUNC-SQL/p[10]", "#XFUNC-SQL/p[12]", "#XFUNC-SQL/p[3]", "#XFUNC-SQL/p[4]", "#XFUNC-SQL/p[6]", "#XFUNC-SQL/p[8]"]}], "language": "zh", "original_text": {"/versions/17/description/0": "SQL-language functions", "/versions/17/facts/0/label": "Kind", "/versions/17/facts/0/value": "Native function language", "/versions/17/facts/1/label": "Trusted", "/versions/17/facts/2/label": "Validator"}, "fallback_fields": [], "source_language": "en", "original_snapshot_sha256": "4fef56821c66bdc4ea97034b79dcea4c9fdd60d0c42b3784618f649ce59d8aab"}, "comparison_data": {"kind": "Native function language", "handler": "", "trusted": "t", "validator": "fmgr_sql_validator"}, "comparison_hash": "a4af9cf453d140d941e865b952c6a41e2b704a4b30cb77b61c1cdda8a77c5035", "manual_language": "zh"}, "18": {"facts": [{"label": "\u79cd\u7c7b", "value": "\u539f\u751f\u51fd\u6570\u8bed\u8a00"}, {"label": "\u53ef\u4fe1", "value": "t"}, {"label": "\u6821\u9a8c\u51fd\u6570", "value": "fmgr_sql_validator"}], "tables": [], "aliases": [], "catalog": {"oid": "14", "descr": "SQL-language functions", "lanacl": "_null_", "lanispl": "f", "lanname": "sql", "lanowner": "POSTGRES", "laninline": "0", "oid_symbol": "SQLlanguageId", "lanpltrusted": "t", "lanvalidator": "fmgr_sql_validator", "lanplcallfoid": "0"}, "related": [], "release": {"ref": "https://ftp.postgresql.org/pub/source/v18.6/postgresql-18.6.tar.bz2", "label": "18.6", "major": "18", "channel": "stable", "revision": "555610c24d53e4316da5b7d3fc25c279d96856d5e0e23ee308c328c5fa881d9f", "source_sha256": "555610c24d53e4316da5b7d3fc25c279d96856d5e0e23ee308c328c5fa881d9f", "catalog_fingerprint": "65c93d6048ef30e61023a84f9680fa6a92b1c383b7eb226741170077eb078502"}, "sources": [{"url": "https://ftp.postgresql.org/pub/source/v18.6/postgresql-18.6.tar.bz2", "label": "Matching PostgreSQL source archive", "sha256": "555610c24d53e4316da5b7d3fc25c279d96856d5e0e23ee308c328c5fa881d9f"}, {"url": "https://pg.center/docs/18/xfunc-sql.html", "path": "xfunc-sql.html", "label": "PostgreSQL 18 English manual", "sha256": "be6325441b9ed269d0566ef02c9e01bf4729ef7da9beef41463be00a7df3ad9c", "language": "en", "original_url": "/docs/18/xfunc-sql.html"}], "sections": [], "signature": "", "attributes": {"kind": "Native function language", "handler": "", "trusted": "t", "validator": "fmgr_sql_validator"}, "description": ["SQL \u8bed\u8a00\u51fd\u6570"], "manual_html": "<div class=\"sect1\" id=\"XFUNC-SQL\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h2 class=\"title\" lang=\"zh\">36.5. \u67e5\u8be2\u8bed\u8a00\uff08SQL\uff09\u51fd\u6570</h2>\n</div>\n</div>\n</div>\n<p lang=\"zh\">SQL \u51fd\u6570\u6267\u884c\u7531\u4efb\u610f SQL \u8bed\u53e5\u7ec4\u6210\u7684\u4e00\u4e2a\u5217\u8868\uff0c\u5e76\u8fd4\u56de\u5217\u8868\u4e2d\u6700\u540e\u4e00\u4e2a\u67e5\u8be2\u7684\u7ed3\u679c\u3002\u5728\u7b80\u5355\uff08\u975e\u96c6\u5408\uff09\u60c5\u51b5\u4e0b\uff0c\u5c06\u8fd4\u56de\u6700\u540e\u4e00\u4e2a\u67e5\u8be2\u7ed3\u679c\u7684\u7b2c\u4e00\u884c\u3002\uff08\u8bf7\u8bb0\u4f4f\uff0c\u9664\u975e\u4f7f\u7528 <code class=\"literal\">ORDER BY</code>\uff0c\u5426\u5219\u591a\u884c\u7ed3\u679c\u4e2d\u7684<span class=\"quote\">\u201c<span class=\"quote\">\u7b2c\u4e00\u884c</span>\u201d</span>\u5e76\u6ca1\u6709\u660e\u786e\u5b9a\u4e49\u3002\uff09\u5982\u679c\u6700\u540e\u4e00\u4e2a\u67e5\u8be2\u5b8c\u5168\u6ca1\u6709\u8fd4\u56de\u4efb\u4f55\u884c\uff0c\u5219\u8fd4\u56de\u7a7a\u503c\u3002</p>\n<p lang=\"zh\">\u6216\u8005\uff0c\u4e00\u4e2a SQL \u51fd\u6570\u53ef\u4ee5\u901a\u8fc7\u6307\u5b9a\u51fd\u6570\u7684\u8fd4\u56de\u7c7b\u578b\u4e3a<code class=\"literal\">SETOF <em class=\"replaceable\"><code>sometype</code></em></code>\u88ab\u58f0\u660e\u4e3a\u8fd4\u56de\u4e00\u4e2a\u96c6\u5408\uff08\u4e5f\u5c31\u662f\u591a\u4e2a\u884c\uff09\uff0c\u6216\u8005\u7b49\u6548\u5730\u58f0\u660e\u5b83\u4e3a<code class=\"literal\">RETURNS TABLE(<em class=\"replaceable\"><code>columns</code></em>)</code>\u3002\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b\uff0c\u6700\u540e\u4e00\u4e2a\u67e5\u8be2\u7684\u7ed3\u679c\u7684\u6240\u6709\u884c\u4f1a\u88ab\u8fd4\u56de\u3002\u4e0b\u6587\u5c06\u7ed9\u51fa\u8fdb\u4e00\u6b65\u7684\u7ec6\u8282\u3002</p>\n<p lang=\"zh\">SQL \u51fd\u6570\u4f53\u5fc5\u987b\u662f\u4e00\u7ec4\u7528\u5206\u53f7\u5206\u9694\u7684 SQL \u8bed\u53e5\uff0c\u6700\u540e\u4e00\u6761\u8bed\u53e5\u540e\u7684\u5206\u53f7\u53ef\u7701\u7565\u3002\u9664\u975e\u51fd\u6570\u58f0\u660e\u4e3a\u8fd4\u56de void\uff0c\u5426\u5219\u6700\u540e\u4e00\u6761\u8bed\u53e5\u5fc5\u987b\u662f SELECT\uff0c\u6216\u5305\u542b RETURNING \u5b50\u53e5\u7684 INSERT\u3001UPDATE\u3001DELETE \u6216 MERGE\u3002</p>\n<p lang=\"zh\">\u4efb\u610f\u4e00\u7ec4 <acronym class=\"acronym\">SQL</acronym> \u8bed\u8a00\u547d\u4ee4\u90fd\u53ef\u4ee5\u6253\u5305\u5e76\u5b9a\u4e49\u6210\u51fd\u6570\u3002\u9664 <code class=\"command\">SELECT</code> \u67e5\u8be2\u5916\uff0c\u8fd9\u4e9b\u547d\u4ee4\u8fd8\u53ef\u4ee5\u5305\u542b\u6570\u636e\u4fee\u6539\u67e5\u8be2\uff08<code class=\"command\">INSERT</code>\u3001<code class=\"command\">UPDATE</code>\u3001<code class=\"command\">DELETE</code> \u548c <code class=\"command\">MERGE</code>\uff09\uff0c\u4ee5\u53ca\u5176\u4ed6 SQL \u547d\u4ee4\u3002\uff08\u5728 <acronym class=\"acronym\">SQL</acronym> \u51fd\u6570\u4e2d\u4e0d\u80fd\u4f7f\u7528\u4e8b\u52a1\u63a7\u5236\u547d\u4ee4\uff0c\u4f8b\u5982 <code class=\"command\">COMMIT</code>\u3001<code class=\"command\">SAVEPOINT</code>\uff0c\u4e5f\u4e0d\u80fd\u4f7f\u7528\u67d0\u4e9b\u5de5\u5177\u547d\u4ee4\uff0c\u4f8b\u5982 <code class=\"literal\">VACUUM</code>\u3002\uff09\u4e0d\u8fc7\uff0c\u6700\u540e\u4e00\u6761\u547d\u4ee4\u5fc5\u987b\u662f <code class=\"command\">SELECT</code>\uff0c\u6216\u8005\u5e26\u6709 <code class=\"literal\">RETURNING</code> \u5b50\u53e5\uff0c\u5e76\u8fd4\u56de\u4e0e\u51fd\u6570\u58f0\u660e\u8fd4\u56de\u7c7b\u578b\u76f8\u7b26\u7684\u7ed3\u679c\u3002\u6216\u8005\uff0c\u5982\u679c\u4f60\u60f3\u5b9a\u4e49\u4e00\u4e2a\u6267\u884c\u52a8\u4f5c\u4f46\u6ca1\u6709\u6709\u7528\u8fd4\u56de\u503c\u7684 SQL \u51fd\u6570\uff0c\u4e5f\u53ef\u4ee5\u628a\u5b83\u5b9a\u4e49\u4e3a\u8fd4\u56de <code class=\"type\">void</code>\u3002\u4f8b\u5982\uff0c\u4e0b\u9762\u8fd9\u4e2a\u51fd\u6570\u4f1a\u4ece <code class=\"literal\">emp</code> \u8868\u4e2d\u5220\u9664\u85aa\u8d44\u4e3a\u8d1f\u7684\u884c\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION clean_emp() RETURNS void AS '\n    DELETE FROM emp\n        WHERE salary &lt; 0;\n' LANGUAGE SQL;\n\nSELECT clean_emp();\n\n clean_emp\n-----------\n\n(1 row)\n</pre>\n<p lang=\"zh\">\u4f60\u4e5f\u53ef\u4ee5\u628a\u8fd9\u4e2a\u5199\u4e3a\u4e00\u4e2a\u8fc7\u7a0b\uff0c\u90a3\u6837\u907f\u514d\u8fd4\u56de\u7c7b\u578b\u7684\u95ee\u9898\u3002\u4f8b\u5982\uff1a</p>\n<pre class=\"screen\">CREATE PROCEDURE clean_emp() AS '\n    DELETE FROM emp\n        WHERE salary &lt; 0;\n' LANGUAGE SQL;\n\nCALL clean_emp();\n</pre>\n<p lang=\"zh\">\u5728\u50cf\u8fd9\u6837\u7684\u7b80\u5355\u60c5\u51b5\u4e2d\uff0c\u8fd4\u56de<code class=\"type\">void</code>\u7684\u51fd\u6570\u4e0e\u8fc7\u7a0b\u4e4b\u95f4\u7684\u5dee\u5f02\u4e3b\u8981\u662f\u98ce\u683c\u4e0a\u9762\u7684\u3002\u4e0d\u8fc7\uff0c\u8fc7\u7a0b\u8fd8\u63d0\u4f9b\u4e86\u51fd\u6570\u6240\u6ca1\u6709\u7684\u989d\u5916\u80fd\u529b\uff0c\u4f8b\u5982\u4e8b\u52a1\u63a7\u5236\u3002\u6b64\u5916\uff0c\u8fc7\u7a0b\u662f SQL \u6807\u51c6\u7684\u4e00\u90e8\u5206\uff0c\u800c\u8fd4\u56de<code class=\"type\">void</code>\u5219\u662f PostgreSQL \u6269\u5c55\u3002</p>\n<p lang=\"zh\"><code class=\"command\">CREATE FUNCTION</code> \u547d\u4ee4\u7684\u8bed\u6cd5\u8981\u6c42\u628a\u51fd\u6570\u4f53\u5199\u6210\u4e00\u4e2a\u5b57\u7b26\u4e32\u5e38\u91cf\u3002\u5bf9\u4e8e\u5b57\u7b26\u4e32\u5e38\u91cf\uff0c\u901a\u5e38\u4f7f\u7528\u7f8e\u5143\u5f15\u7528\u6700\u65b9\u4fbf\uff08\u89c1<a class=\"xref\" href=\"/docs/18/sql-syntax-lexical.html#SQL-SYNTAX-DOLLAR-QUOTING\" title=\"4.1.2.4.\u00a0\u7f8e\u5143\u5f15\u7528\u7684\u5b57\u7b26\u4e32\u5e38\u91cf\">\u7b2c\u00a04.1.2.4\u00a0\u8282</a>\uff09\u3002\u5982\u679c\u4f60\u9009\u62e9\u4f7f\u7528\u5e38\u89c4\u7684\u5355\u5f15\u53f7\u5b57\u7b26\u4e32\u5e38\u91cf\u8bed\u6cd5\uff0c\u90a3\u4e48\u5fc5\u987b\u5728\u51fd\u6570\u4f53\u4e2d\u5c06\u5355\u5f15\u53f7\uff08<code class=\"literal\">'</code>\uff09\u548c\u53cd\u659c\u7ebf\uff08<code class=\"literal\">\\</code>\uff09\u5199\u6210\u53cc\u4efd\uff08\u5047\u5b9a\u4f7f\u7528\u8f6c\u4e49\u5b57\u7b26\u4e32\u8bed\u6cd5\uff0c\u89c1<a class=\"xref\" href=\"/docs/18/sql-syntax-lexical.html#SQL-SYNTAX-STRINGS\" title=\"4.1.2.1.\u00a0\u5b57\u7b26\u4e32\u5e38\u91cf\">\u7b2c\u00a04.1.2.1\u00a0\u8282</a>\uff09\u3002</p>\n<div class=\"sect2\" id=\"XFUNC-SQL-FUNCTION-ARGUMENTS\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/18/xfunc-sql.html#XFUNC-SQL-FUNCTION-ARGUMENTS\">36.5.1. <acronym class=\"acronym\">SQL</acronym>\u51fd\u6570\u7684\u53c2\u6570</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\">\u4e00\u4e2a SQL \u51fd\u6570\u7684\u53c2\u6570\u53ef\u4ee5\u5728\u51fd\u6570\u4f53\u4e2d\u7528\u540d\u79f0\u6216\u7f16\u53f7\u5f15\u7528\u3002\u4e0b\u9762\u4f1a\u6709\u4e24\u79cd\u65b9\u6cd5\u7684\u793a\u4f8b\u3002</p>\n<p lang=\"zh\">\u8981\u4f7f\u7528\u4e00\u4e2a\u540d\u79f0\uff0c\u5c06\u51fd\u6570\u53c2\u6570\u58f0\u660e\u4e3a\u5e26\u6709\u4e00\u4e2a\u540d\u79f0\uff0c\u7136\u540e\u5728\u51fd\u6570\u4f53\u4e2d\u53ea\u5199\u8be5\u540d\u79f0\u3002\u5982\u679c\u53c2\u6570\u540d\u79f0\u4e0e\u51fd\u6570\u5185\u5f53\u524d SQL \u547d\u4ee4\u4e2d\u7684\u4efb\u610f\u5217\u540d\u76f8\u540c\uff0c\u5217\u540d\u5c06\u4f18\u5148\u3002\u5982\u679c\u4e0d\u60f3\u8fd9\u6837\uff0c\u53ef\u4ee5\u7528\u51fd\u6570\u672c\u8eab\u7684\u540d\u79f0\u6765\u9650\u5b9a\u53c2\u6570\u540d\uff0c\u4e5f\u5c31\u662f<code class=\"literal\"><em class=\"replaceable\"><code>function_name</code></em>.<em class=\"replaceable\"><code>argument_name</code></em></code>\uff08\u5982\u679c\u8fd9\u4f1a\u4e0e\u4e00\u4e2a\u88ab\u9650\u5b9a\u7684\u5217\u540d\u51b2\u7a81\uff0c\u7167\u4f8b\u8fd8\u662f\u5217\u540d\u8d62\u5f97\u4f18\u5148\u3002\u4f60\u53ef\u4ee5\u901a\u8fc7\u4e3a SQL \u547d\u4ee4\u4e2d\u7684\u8868\u9009\u62e9\u4e00\u4e2a\u4e0d\u540c\u7684\u522b\u540d\u6765\u907f\u514d\u8fd9\u79cd\u6df7\u6dc6\uff09\u3002</p>\n<p lang=\"zh\">\u5728\u66f4\u65e7\u7684\u6570\u5b57\u65b9\u6cd5\u4e2d\uff0c\u53c2\u6570\u53ef\u4ee5\u7528\u8bed\u6cd5<code class=\"literal\">$<em class=\"replaceable\"><code>n</code></em></code>\u5f15\u7528\uff1a<code class=\"literal\">$1</code>\u6307\u7684\u662f\u7b2c\u4e00\u4e2a\u8f93\u5165\u53c2\u6570\uff0c<code class=\"literal\">$2</code>\u6307\u7684\u662f\u7b2c\u4e8c\u4e2a\uff0c\u4ee5\u6b64\u7c7b\u63a8\u3002\u4e0d\u7ba1\u7279\u5b9a\u7684\u53c2\u6570\u662f\u5426\u4f7f\u7528\u540d\u79f0\u58f0\u660e\uff0c\u8fd9\u79cd\u65b9\u6cd5\u90fd\u6709\u6548\u3002</p>\n<p lang=\"zh\">\u5982\u679c\u4e00\u4e2a\u53c2\u6570\u662f\u4e00\u79cd\u590d\u5408\u7c7b\u578b\uff0c\u90a3\u4e48\u70b9\u53f7\u8bb0\u6cd5\uff08\u5982 <code class=\"literal\"><em class=\"replaceable\"><code>argname</code></em>.<em class=\"replaceable\"><code>fieldname</code></em></code> \u6216<code class=\"literal\">$1.<em class=\"replaceable\"><code>fieldname</code></em></code>\uff09\u4e5f\u53ef\u4ee5\u88ab\u7528\u6765\u8bbf\u95ee\u8be5\u53c2\u6570\u7684\u5c5e\u6027\u3002\u540c\u6837\uff0c\u4f60\u53ef\u80fd\u9700\u8981\u7528\u51fd\u6570\u7684\u540d\u79f0\u6765\u9650\u5b9a\u53c2\u6570\u7684\u540d\u79f0\u4ee5\u907f\u514d\u6b67\u4e49\u3002</p>\n<p lang=\"zh\">SQL \u51fd\u6570\u53c2\u6570\u53ea\u80fd\u88ab\u7528\u4f5c\u6570\u636e\u503c\u800c\u4e0d\u80fd\u4f5c\u4e3a\u6807\u8bc6\u7b26\u3002\u4f8b\u5982\u8fd9\u662f\u5408\u7406\u7684\uff1a</p>\n<pre class=\"programlisting\">INSERT INTO mytable VALUES ($1);\n</pre>\n<p lang=\"zh\">\u4f46\u8fd9\u6837\u5c31\u4e0d\u884c\uff1a</p>\n<pre class=\"programlisting\">INSERT INTO $1 VALUES (42);\n</pre>\n<div class=\"note\">\n<h3 class=\"title\" lang=\"zh\">\u6ce8\u610f</h3>\n<p lang=\"zh\">PostgreSQL 9.2 \u5f00\u59cb\u652f\u6301\u901a\u8fc7\u540d\u79f0\u5f15\u7528 SQL \u51fd\u6570\u53c2\u6570\u3002\u9700\u8981\u7528\u4e8e\u66f4\u65e9\u7248\u672c\u670d\u52a1\u5668\u7684\u51fd\u6570\u5fc5\u987b\u4f7f\u7528 $n \u8bb0\u6cd5\u3002</p>\n</div>\n</div>\n<div class=\"sect2\" id=\"XFUNC-SQL-BASE-FUNCTIONS\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/18/xfunc-sql.html#XFUNC-SQL-BASE-FUNCTIONS\">36.5.2. \u57fa\u7840\u7c7b\u578b\u4e0a\u7684<acronym class=\"acronym\">SQL</acronym>\u51fd\u6570</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\">\u6700\u7b80\u5355\u7684 <acronym class=\"acronym\">SQL</acronym> \u51fd\u6570\u6ca1\u6709\u53c2\u6570\uff0c\u53ea\u662f\u8fd4\u56de\u4e00\u4e2a\u57fa\u7840\u7c7b\u578b\uff0c\u4f8b\u5982 <code class=\"type\">integer</code>\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION one() RETURNS integer AS $$\n    SELECT 1 AS result;\n$$ LANGUAGE SQL;\n\n-- Alternative syntax for string literal:\nCREATE FUNCTION one() RETURNS integer AS '\n    SELECT 1 AS result;\n' LANGUAGE SQL;\n\nSELECT one();\n\n one\n-----\n   1\n</pre>\n<p lang=\"zh\">\u6ce8\u610f\u6211\u4eec\u4e3a\u8be5\u51fd\u6570\u7684\u7ed3\u679c\u5728\u51fd\u6570\u4f53\u5185\u5b9a\u4e49\u4e86\u4e00\u4e2a\u5217\u522b\u540d\uff08\u540d\u4e3a<code class=\"literal\">result</code>\uff09\uff0c\u4f46\u662f\u8fd9\u4e2a\u5217\u522b\u540d\u5728\u51fd\u6570\u4ee5\u5916\u662f\u4e0d\u53ef\u89c1\u7684\u3002\u56e0\u6b64\uff0c\u7ed3\u679c\u88ab\u6807\u8bb0\u4e3a<code class=\"literal\">one</code>\u800c\u4e0d\u662f<code class=\"literal\">result</code>\u3002</p>\n<p lang=\"zh\">\u5b9a\u4e49\u63a5\u53d7\u57fa\u7840\u7c7b\u578b\u53c2\u6570\u7684 <acronym class=\"acronym\">SQL</acronym> \u51fd\u6570\u4e5f\u51e0\u4e4e\u540c\u6837\u5bb9\u6613\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION add_em(x integer, y integer) RETURNS integer AS $$\n    SELECT x + y;\n$$ LANGUAGE SQL;\n\nSELECT add_em(1, 2) AS answer;\n\n answer\n--------\n      3\n</pre>\n<p lang=\"zh\">\u6216\u8005\uff0c\u6211\u4eec\u4e5f\u53ef\u4ee5\u4e0d\u7528\u53c2\u6570\u540d\uff0c\u800c\u6539\u7528\u6570\u5b57\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION add_em(integer, integer) RETURNS integer AS $$\n    SELECT $1 + $2;\n$$ LANGUAGE SQL;\n\nSELECT add_em(1, 2) AS answer;\n\n answer\n--------\n      3\n</pre>\n<p lang=\"zh\">\u4e0b\u9762\u662f\u4e00\u4e2a\u66f4\u6709\u7528\u7684\u51fd\u6570\uff0c\u5b83\u53ef\u4ee5\u7528\u6765\u4ece\u94f6\u884c\u8d26\u6237\u4e2d\u6263\u6b3e\uff1a</p>\n<pre class=\"programlisting\">CREATE FUNCTION tf1 (accountno integer, debit numeric) RETURNS numeric AS $$\n    UPDATE bank\n        SET balance = balance - debit\n        WHERE accountno = tf1.accountno;\n    SELECT 1;\n$$ LANGUAGE SQL;\n</pre>\n<p lang=\"zh\">\u7528\u6237\u53ef\u4ee5\u8fd9\u6837\u6267\u884c\u8be5\u51fd\u6570\uff0c\u4ece 17 \u53f7\u8d26\u6237\u4e2d\u6263\u9664 $100.00\uff1a</p>\n<pre class=\"programlisting\">SELECT tf1(17, 100.0);\n</pre>\n<p lang=\"zh\">\u5728\u8fd9\u4e2a\u793a\u4f8b\u4e2d\uff0c\u6211\u4eec\u4e3a\u7b2c\u4e00\u4e2a\u53c2\u6570\u9009\u62e9\u4e86\u540d\u79f0<code class=\"literal\">accountno</code>\uff0c\u4f46\u662f\u8fd9\u548c\u8868<code class=\"literal\">bank</code>\u4e2d\u7684\u4e00\u4e2a\u5217\u540d\u76f8\u540c\u3002\u5728<code class=\"command\">UPDATE</code>\u547d\u4ee4\u4e2d\uff0c<code class=\"literal\">accountno</code>\u5f15\u7528\u5217<code class=\"literal\">bank.accountno</code>\uff0c\u56e0\u6b64 <code class=\"literal\">tf1.accountno</code>\u5fc5\u987b\u88ab\u7528\u6765\u5f15\u7528\u8be5\u53c2\u6570\u3002\u6211\u4eec\u5f53\u7136\u53ef\u4ee5\u901a\u8fc7\u4e3a\u8be5\u53c2\u6570\u4f7f\u7528\u4e00\u4e2a\u4e0d\u540c\u7684\u540d\u79f0\u6765\u907f\u514d\u8fd9\u6837\u7684\u95ee\u9898\u3002</p>\n<p lang=\"zh\">\u5b9e\u9645\u4e0a\u6211\u4eec\u53ef\u80fd\u559c\u6b22\u4ece\u8be5\u51fd\u6570\u5f97\u5230\u4e00\u4e2a\u66f4\u6709\u7528\u7684\u7ed3\u679c\u800c\u4e0d\u662f\u4e00\u4e2a\u5e38\u6570 1\uff0c\u56e0\u6b64\u4e00\u4e2a\u66f4\u53ef\u80fd\u7684\u5b9a\u4e49\u662f\uff1a</p>\n<pre class=\"programlisting\">CREATE FUNCTION tf1 (accountno integer, debit numeric) RETURNS numeric AS $$\n    UPDATE bank\n        SET balance = balance - debit\n        WHERE accountno = tf1.accountno;\n    SELECT balance FROM bank WHERE accountno = tf1.accountno;\n$$ LANGUAGE SQL;\n</pre>\n<p lang=\"zh\">\u5b83\u4f1a\u8c03\u6574\u4f59\u989d\u5e76\u4e14\u8fd4\u56de\u65b0\u7684\u4f59\u989d\u3002\u540c\u6837\u7684\u4e8b\u60c5\u4e5f\u53ef\u4ee5\u7528\u4e00\u4e2a\u4f7f\u7528<code class=\"literal\">RETURNING</code>\u7684\u547d\u4ee4\u5b9e\u73b0\uff1a</p>\n<pre class=\"programlisting\">CREATE FUNCTION tf1 (accountno integer, debit numeric) RETURNS numeric AS $$\n    UPDATE bank\n        SET balance = balance - debit\n        WHERE accountno = tf1.accountno\n    RETURNING balance;\n$$ LANGUAGE SQL;\n</pre>\n<p lang=\"zh\">\u5982\u679c\u5728<code class=\"literal\">SELECT</code>\u6216<code class=\"literal\">RETURNING</code>\u5b50\u53e5\u4e2d\uff0c<acronym class=\"acronym\">SQL</acronym>\u51fd\u6570\u7684\u6700\u7ec8\u8fd4\u56de\u503c\u7c7b\u578b\u4e0e\u51fd\u6570\u58f0\u660e\u7684\u7ed3\u679c\u7c7b\u578b\u4e0d\u5b8c\u5168\u5339\u914d\uff0c\u5982\u679c\u53ef\u4ee5\u4f7f\u7528\u9690\u5f0f\u6216\u8d4b\u503c\u8f6c\u6362\uff0c<span class=\"productname\">PostgreSQL</span>\u5c06\u81ea\u52a8\u5c06\u8be5\u503c\u8f6c\u6362\u4e3a\u6240\u9700\u7c7b\u578b\u3002\u5426\u5219\uff0c\u4f60\u5fc5\u987b\u5199\u51fa\u663e\u5f0f\u7c7b\u578b\u8f6c\u6362\u3002\u4f8b\u5982\uff0c\u5047\u8bbe\u6211\u4eec\u5e0c\u671b\u524d\u9762\u7684<code class=\"function\">add_em</code>\u51fd\u6570\u8fd4\u56de<code class=\"type\">float8</code>\u7c7b\u578b\u3002\u53ea\u9700\u7f16\u5199</p>\n<pre class=\"programlisting\">CREATE FUNCTION add_em(integer, integer) RETURNS float8 AS $$\n    SELECT $1 + $2;\n$$ LANGUAGE SQL;\n</pre>\n<p lang=\"zh\">\u56e0\u4e3a<code class=\"type\">integer</code>\u7684\u548c\u53ef\u4ee5\u9690\u5f0f\u8f6c\u6362\u4e3a<code class=\"type\">float8</code>\u3002\uff08\u6709\u5173\u8f6c\u6362\u7684\u66f4\u591a\u4fe1\u606f\uff0c\u8bf7\u53c2\u89c1<a class=\"xref\" href=\"/docs/18/typeconv.html\" title=\"\u7b2c\u00a010\u00a0\u7ae0\u00a0\u7c7b\u578b\u8f6c\u6362\">\u7b2c\u00a010\u00a0\u7ae0</a>\u6216<a class=\"xref\" href=\"/docs/18/sql-createcast.html\" title=\"CREATE CAST\"><span class=\"refentrytitle\">CREATE CAST</span></a>\u3002\uff09</p>\n</div>\n<div class=\"sect2\" id=\"XFUNC-SQL-COMPOSITE-FUNCTIONS\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/18/xfunc-sql.html#XFUNC-SQL-COMPOSITE-FUNCTIONS\">36.5.3. \u590d\u5408\u7c7b\u578b\u4e0a\u7684<acronym class=\"acronym\">SQL</acronym>\u51fd\u6570</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\">\u7f16\u5199\u63a5\u53d7\u590d\u5408\u7c7b\u578b\u53c2\u6570\u7684\u51fd\u6570\u65f6\uff0c\u6211\u4eec\u4e0d\u4ec5\u5fc5\u987b\u6307\u5b9a\u8981\u7528\u54ea\u4e2a\u53c2\u6570\uff0c\u8fd8\u5fc5\u987b\u6307\u5b9a\u8be5\u53c2\u6570\u7684\u54ea\u4e2a\u5c5e\u6027\uff08\u5b57\u6bb5\uff09\u3002\u4f8b\u5982\uff0c\u5047\u8bbe <code class=\"type\">emp</code> \u662f\u4e00\u4e2a\u5305\u542b\u96c7\u5458\u6570\u636e\u7684\u8868\uff0c\u56e0\u6b64\u5b83\u4e5f\u662f\u8be5\u8868\u6bcf\u4e00\u884c\u5bf9\u5e94\u7684\u590d\u5408\u7c7b\u578b\u540d\u79f0\u3002\u4e0b\u9762\u7684\u51fd\u6570 <code class=\"function\">double_salary</code> \u7528\u6765\u8ba1\u7b97\u67d0\u4eba\u7684\u5de5\u8d44\u7ffb\u500d\u540e\u4f1a\u662f\u591a\u5c11\uff1a</p>\n<pre class=\"screen\">CREATE TABLE emp (\n    name        text,\n    salary      numeric,\n    age         integer,\n    cubicle     point\n);\n\nINSERT INTO emp VALUES ('Bill', 4200, 45, '(2,1)');\n\nCREATE FUNCTION double_salary(emp) RETURNS numeric AS $$\n    SELECT $1.salary * 2 AS salary;\n$$ LANGUAGE SQL;\n\nSELECT name, double_salary(emp.*) AS dream\n    FROM emp\n    WHERE emp.cubicle ~= point '(2,1)';\n\n name | dream\n------+-------\n Bill |  8400\n</pre>\n<p lang=\"zh\">\u6ce8\u610f\u8fd9\u91cc\u7528 <code class=\"literal\">$1.salary</code> \u8bed\u6cd5\u6765\u9009\u53d6\u53c2\u6570\u884c\u503c\u4e2d\u7684\u4e00\u4e2a\u5b57\u6bb5\u3002\u8fd8\u8981\u6ce8\u610f\uff0c\u8c03\u7528\u65f6\u7684 <code class=\"command\">SELECT</code> \u547d\u4ee4\u4f7f\u7528 <em class=\"replaceable\"><code>table_name</code></em><code class=\"literal\">.*</code> \u5c06\u8868\u7684\u5f53\u524d\u6574\u884c\u53d6\u4f5c\u4e00\u4e2a\u590d\u5408\u503c\u3002\u8be5\u8868\u884c\u4e5f\u53ef\u4ee5\u4ec5\u7528\u8868\u540d\u6765\u5f15\u7528\uff1a</p>\n<pre class=\"screen\">SELECT name, double_salary(emp) AS dream\n    FROM emp\n    WHERE emp.cubicle ~= point '(2,1)';\n</pre>\n<p lang=\"zh\">\u4f46\u8fd9\u79cd\u7528\u6cd5\u5df2\u88ab\u5f03\u7528\uff0c\u56e0\u4e3a\u5b83\u5f88\u5bb9\u6613\u8ba9\u4eba\u6df7\u6dc6\uff08\u5173\u4e8e\u8868\u884c\u590d\u5408\u503c\u8fd9\u4e24\u79cd\u8bb0\u6cd5\u7684\u66f4\u591a\u7ec6\u8282\uff0c\u89c1<a class=\"xref\" href=\"/docs/18/rowtypes.html#ROWTYPES-USAGE\" title=\"8.16.5.\u00a0\u5728\u67e5\u8be2\u4e2d\u4f7f\u7528\u590d\u5408\u7c7b\u578b\">\u7b2c\u00a08.16.5\u00a0\u8282</a>\uff09\u3002</p>\n<p lang=\"zh\">\u6709\u65f6\u5019\u5373\u65f6\u6784\u9020\u4e00\u4e2a\u590d\u5408\u53c2\u6570\u503c\u4f1a\u5f88\u65b9\u4fbf\u3002\u8fd9\u53ef\u4ee5\u7528<code class=\"literal\">ROW</code>\u6784\u9020\u5668\u5b8c\u6210\u3002\u4f8b\u5982\uff0c\u6211\u4eec\u53ef\u4ee5\u8c03\u6574\u88ab\u4f20\u9012\u7ed9\u51fd\u6570\u7684\u6570\u636e\uff1a</p>\n<pre class=\"screen\">SELECT name, double_salary(ROW(name, salary*1.1, age, cubicle)) AS dream\n    FROM emp;\n</pre>\n<p lang=\"zh\">\u4e5f\u53ef\u4ee5\u6784\u5efa\u4e00\u4e2a\u8fd4\u56de\u590d\u5408\u7c7b\u578b\u7684\u51fd\u6570\u3002\u8fd9\u662f\u4e00\u4e2a\u8fd4\u56de\u5355\u4e00<code class=\"type\">emp</code>\u884c\u7684\u51fd\u6570\u793a\u4f8b\uff1a</p>\n<pre class=\"programlisting\">CREATE FUNCTION new_emp() RETURNS emp AS $$\n    SELECT text 'None' AS name,\n        1000.0 AS salary,\n        25 AS age,\n        point '(2,2)' AS cubicle;\n$$ LANGUAGE SQL;\n</pre>\n<p lang=\"zh\">\u5728\u8fd9\u4e2a\u793a\u4f8b\u4e2d\uff0c\u6211\u4eec\u4e3a\u6bcf\u4e00\u4e2a\u5c5e\u6027\u6307\u5b9a\u4e86\u4e00\u4e2a\u5e38\u91cf\u503c\uff0c\u4f46\u662f\u53ef\u4ee5\u7528\u4efb\u4f55\u8ba1\u7b97\u6765\u66ff\u6362\u8fd9\u4e9b\u5e38\u91cf\u3002</p>\n<p lang=\"zh\">\u5b9a\u4e49\u8be5\u51fd\u6570\u65f6\u6709\u4e24\u70b9\u91cd\u8981\u6ce8\u610f\u4e8b\u9879\uff1a</p>\n<div class=\"itemizedlist\">\n<ul class=\"itemizedlist\">\n<li class=\"listitem\" lang=\"zh\">\n<p>\u67e5\u8be2\u4e2d\u7684\u9009\u62e9\u5217\u8868\u987a\u5e8f\u5fc5\u987b\u4e0e\u5217\u5728\u590d\u5408\u7c7b\u578b\u4e2d\u51fa\u73b0\u7684\u987a\u5e8f\u5b8c\u5168\u76f8\u540c\u3002\uff08\u7cfb\u7edf\u4e0d\u8003\u8651\u50cf\u4e0a\u9762\u8fd9\u6837\u6307\u5b9a\u7684\u5217\u540d\u3002\uff09</p>\n</li>\n<li class=\"listitem\" lang=\"zh\">\n<p>\u6211\u4eec\u5fc5\u987b\u786e\u4fdd\u6bcf\u4e2a\u8868\u8fbe\u5f0f\u7684\u7c7b\u578b\u90fd\u53ef\u4ee5\u8f6c\u6362\u4e3a\u590d\u5408\u7c7b\u578b\u7684\u76f8\u5e94\u5217\u7684\u7c7b\u578b\u3002\u5426\u5219\u6211\u4eec\u4f1a\u5f97\u5230\u8fd9\u6837\u7684\u9519\u8bef\uff1a</p>\n<pre class=\"screen\">\n<code class=\"computeroutput\">\nERROR:  return type mismatch in function declared to return emp\nDETAIL:  Final statement returns text instead of point at column 4.\n</code>\n</pre>\n<p>\u4e0e\u57fa\u7840\u7c7b\u578b\u7684\u60c5\u51b5\u4e00\u6837\uff0c\u7cfb\u7edf\u4e0d\u4f1a\u81ea\u52a8\u63d2\u5165\u663e\u5f0f\u8f6c\u6362\uff0c\u53ea\u4f1a\u63d2\u5165\u9690\u5f0f\u6216\u8d4b\u503c\u8f6c\u6362\u3002</p>\n</li>\n</ul>\n</div>\n<p lang=\"zh\">\u5b9a\u4e49\u540c\u6837\u7684\u51fd\u6570\u7684\u4e00\u79cd\u4e0d\u540c\u7684\u65b9\u6cd5\u662f\uff1a</p>\n<pre class=\"programlisting\">CREATE FUNCTION new_emp() RETURNS emp AS $$\n    SELECT ROW('None', 1000.0, 25, '(2,2)')::emp;\n$$ LANGUAGE SQL;\n</pre>\n<p lang=\"zh\">\u8fd9\u91cc\u6211\u4eec\u5199\u4e86\u4e00\u4e2a\u53ea\u8fd4\u56de\u5355\u5217\u3001\u4e14\u8be5\u5217\u5177\u6709\u6b63\u786e\u590d\u5408\u7c7b\u578b\u7684 <code class=\"command\">SELECT</code>\u3002\u5728\u8fd9\u79cd\u573a\u666f\u4e0b\uff0c\u8fd9\u6837\u5199\u5e76\u4e0d\u89c1\u5f97\u66f4\u597d\uff0c\u4f46\u5728\u67d0\u4e9b\u60c5\u51b5\u4e0b\u4f1a\u5f88\u65b9\u4fbf \u2014 \u4f8b\u5982\uff0c\u9700\u8981\u901a\u8fc7\u8c03\u7528\u53e6\u4e00\u4e2a\u8fd4\u56de\u76ee\u6807\u590d\u5408\u503c\u7684\u51fd\u6570\u6765\u8ba1\u7b97\u7ed3\u679c\u65f6\u3002\u8fd8\u6709\u4e00\u79cd\u60c5\u51b5\u662f\uff0c\u5982\u679c\u6211\u4eec\u8981\u7f16\u5199\u7684\u51fd\u6570\u8fd4\u56de\u7684\u662f\u57fa\u4e8e\u590d\u5408\u7c7b\u578b\u7684\u57df\uff0c\u800c\u4e0d\u662f\u666e\u901a\u590d\u5408\u7c7b\u578b\uff0c\u90a3\u4e48\u5c31\u5fc5\u987b\u5199\u6210\u8fd4\u56de\u5355\u5217\u7684\u5f62\u5f0f\uff0c\u56e0\u4e3a\u6ca1\u6709\u529e\u6cd5\u8ba9\u6574\u884c\u7ed3\u679c\u53d1\u751f\u6240\u9700\u7684\u5f3a\u5236\u8f6c\u6362\u3002</p>\n<p lang=\"zh\">\u6211\u4eec\u65e2\u53ef\u4ee5\u628a\u8fd9\u4e2a\u51fd\u6570\u76f4\u63a5\u5f53\u4f5c\u503c\u8868\u8fbe\u5f0f\u8c03\u7528\uff1a</p>\n<pre class=\"screen\">SELECT new_emp();\n\n         new_emp\n--------------------------\n (None,1000.0,25,\"(2,2)\")\n</pre>\n<p lang=\"zh\">\u4e5f\u53ef\u4ee5\u628a\u5b83\u5f53\u4f5c\u8868\u51fd\u6570\u6765\u8c03\u7528\uff1a</p>\n<pre class=\"screen\">SELECT * FROM new_emp();\n\n name | salary | age | cubicle\n------+--------+-----+---------\n None | 1000.0 |  25 | (2,2)\n</pre>\n<p lang=\"zh\">\u7b2c\u4e8c\u79cd\u65b9\u5f0f\u4f1a\u5728<a class=\"xref\" href=\"/docs/18/xfunc-sql.html#XFUNC-SQL-TABLE-FUNCTIONS\" title=\"36.5.8.\u00a0SQL \u51fd\u6570\u4f5c\u4e3a\u8868\u6765\u6e90\">\u7b2c\u00a036.5.8\u00a0\u8282</a>\u4e2d\u8fdb\u4e00\u6b65\u8bf4\u660e\u3002</p>\n<p lang=\"zh\">\u5f53\u4f60\u4f7f\u7528\u8fd4\u56de\u590d\u5408\u7c7b\u578b\u7684\u51fd\u6570\u65f6\uff0c\u53ef\u80fd\u53ea\u9700\u8981\u53d6\u5176\u7ed3\u679c\u4e2d\u7684\u4e00\u4e2a\u5b57\u6bb5\uff08\u5c5e\u6027\uff09\u3002\u53ef\u4ee5\u4f7f\u7528\u4e0b\u9762\u8fd9\u6837\u7684\u8bed\u6cd5\uff1a</p>\n<pre class=\"screen\">SELECT (new_emp()).name;\n\n name\n------\n None\n</pre>\n<p lang=\"zh\">\u8fd9\u91cc\u9700\u8981\u989d\u5916\u7684\u62ec\u53f7\uff0c\u4ee5\u514d\u89e3\u6790\u5668\u4ea7\u751f\u6b67\u4e49\u3002\u5982\u679c\u4e0d\u52a0\u62ec\u53f7\uff0c\u7ed3\u679c\u4f1a\u662f\u8fd9\u6837\uff1a</p>\n<pre class=\"screen\">SELECT new_emp().name;\nERROR:  syntax error at or near \".\"\nLINE 1: SELECT new_emp().name;\n                        ^\n</pre>\n<p lang=\"zh\">\u53e6\u4e00\u79cd\u9009\u62e9\u662f\u4f7f\u7528\u51fd\u6570\u8bb0\u6cd5\u6765\u63d0\u53d6\u5c5e\u6027\uff1a</p>\n<pre class=\"screen\">SELECT name(new_emp());\n\n name\n------\n None\n</pre>\n<p lang=\"zh\">\u5982<a class=\"xref\" href=\"/docs/18/rowtypes.html#ROWTYPES-USAGE\" title=\"8.16.5.\u00a0\u5728\u67e5\u8be2\u4e2d\u4f7f\u7528\u590d\u5408\u7c7b\u578b\">\u7b2c\u00a08.16.5\u00a0\u8282</a>\u6240\u8ff0\uff0c\u5b57\u6bb5\u8bb0\u6cd5\u548c\u51fd\u6570\u8bb0\u6cd5\u662f\u7b49\u4ef7\u7684\u3002</p>\n<p lang=\"zh\">\u53e6\u4e00\u79cd\u4f7f\u7528\u51fd\u6570\u8fd4\u56de\u590d\u5408\u7c7b\u578b\u7684\u65b9\u6cd5\u662f\u5c06\u7ed3\u679c\u4f20\u9012\u7ed9\u53e6\u4e00\u4e2a\u63a5\u53d7\u6b63\u786e\u884c\u7c7b\u578b\u4f5c\u4e3a\u8f93\u5165\u7684\u51fd\u6570\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION getname(emp) RETURNS text AS $$\n    SELECT $1.name;\n$$ LANGUAGE SQL;\n\nSELECT getname(new_emp());\n getname\n---------\n None\n(1 row)\n</pre>\n</div>\n<div class=\"sect2\" id=\"XFUNC-OUTPUT-PARAMETERS\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/18/xfunc-sql.html#XFUNC-OUTPUT-PARAMETERS\">36.5.4. \u5e26\u6709\u8f93\u51fa\u53c2\u6570\u7684<acronym class=\"acronym\">SQL</acronym>\u51fd\u6570</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\">\u63cf\u8ff0\u51fd\u6570\u7ed3\u679c\u7684\u53e6\u4e00\u79cd\u65b9\u6cd5\u662f\u4f7f\u7528<em class=\"firstterm\">\u8f93\u51fa\u53c2\u6570</em>\uff0c\u4f8b\u5982\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION add_em (IN x int, IN y int, OUT sum int)\nAS 'SELECT x + y'\nLANGUAGE SQL;\n\nSELECT add_em(3,7);\n add_em\n--------\n     10\n(1 row)\n</pre>\n<p lang=\"zh\">\u8fd9\u4e0e<a class=\"xref\" href=\"/docs/18/xfunc-sql.html#XFUNC-SQL-BASE-FUNCTIONS\" title=\"36.5.2.\u00a0\u57fa\u7840\u7c7b\u578b\u4e0a\u7684SQL\u51fd\u6570\">\u7b2c\u00a036.5.2\u00a0\u8282</a>\u4e2d\u5c55\u793a\u7684 <code class=\"literal\">add_em</code> \u7248\u672c\u672c\u8d28\u4e0a\u5e76\u65e0\u4e0d\u540c\u3002\u8f93\u51fa\u53c2\u6570\u7684\u771f\u6b63\u4ef7\u503c\u5728\u4e8e\uff0c\u5b83\u4eec\u4e3a\u5b9a\u4e49\u8fd4\u56de\u591a\u5217\u7684\u51fd\u6570\u63d0\u4f9b\u4e86\u4e00\u79cd\u65b9\u4fbf\u7684\u65b9\u6cd5\u3002\u4f8b\u5982\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION sum_n_product (x int, y int, OUT sum int, OUT product int)\nAS 'SELECT x + y, x * y'\nLANGUAGE SQL;\n\n SELECT * FROM sum_n_product(11,42);\n sum | product\n-----+---------\n  53 |     462\n(1 row)\n</pre>\n<p lang=\"zh\">\u8fd9\u91cc\u672c\u8d28\u4e0a\u53d1\u751f\u7684\u4e8b\u60c5\u662f\uff1a\u6211\u4eec\u4e3a\u8be5\u51fd\u6570\u7684\u7ed3\u679c\u521b\u5efa\u4e86\u4e00\u4e2a\u533f\u540d\u590d\u5408\u7c7b\u578b\u3002\u4e0a\u9762\u7684\u793a\u4f8b\u4e0e\u4e0b\u9762\u8fd9\u79cd\u5199\u6cd5\u7684\u6700\u7ec8\u6548\u679c\u76f8\u540c\uff1a</p>\n<pre class=\"screen\">CREATE TYPE sum_prod AS (sum int, product int);\n\nCREATE FUNCTION sum_n_product (int, int) RETURNS sum_prod\nAS 'SELECT $1 + $2, $1 * $2'\nLANGUAGE SQL;\n</pre>\n<p lang=\"zh\">\u4f46\u901a\u5e38\u4e0d\u5fc5\u989d\u5916\u5b9a\u4e49\u4e00\u4e2a\u72ec\u7acb\u7684\u590d\u5408\u7c7b\u578b\u4f1a\u66f4\u65b9\u4fbf\u3002\u6ce8\u610f\uff0c\u9644\u5728\u8f93\u51fa\u53c2\u6570\u4e0a\u7684\u540d\u79f0\u5e76\u975e\u53ea\u662f\u88c5\u9970\uff0c\u5b83\u4eec\u51b3\u5b9a\u4e86\u8fd9\u4e2a\u533f\u540d\u590d\u5408\u7c7b\u578b\u7684\u5217\u540d\u3002\uff08\u5982\u679c\u7701\u7565\u8f93\u51fa\u53c2\u6570\u540d\u79f0\uff0c\u7cfb\u7edf\u4f1a\u81ea\u884c\u9009\u62e9\u4e00\u4e2a\u540d\u79f0\u3002\uff09</p>\n<p lang=\"zh\">\u5728\u4ece SQL \u8c03\u7528\u8fd9\u6837\u4e00\u4e2a\u51fd\u6570\u65f6\uff0c\u8f93\u51fa\u53c2\u6570\u4e0d\u4f1a\u88ab\u5305\u62ec\u5728\u8c03\u7528\u53c2\u6570\u5217\u8868\u4e2d\u3002\u8fd9\u662f\u56e0\u4e3a<span class=\"productname\">PostgreSQL</span>\u53ea\u8003\u8651\u8f93\u5165\u53c2\u6570\u6765\u5b9a\u4e49\u51fd\u6570\u7684\u8c03\u7528\u7b7e\u540d\u3002\u8fd9\u4e5f\u610f\u5473\u7740\u5728\u4e3a\u8bf8\u5982\u5220\u9664\u51fd\u6570\u7b49\u76ee\u7684\u5f15\u7528\u8be5\u51fd\u6570\u65f6\u53ea\u6709\u8f93\u5165\u53c2\u6570\u6709\u5173\u7cfb\u3002\u6211\u4eec\u53ef\u4ee5\u7528\u4e0b\u9762\u7684\u547d\u4ee4\u4e4b\u4e00\u5220\u9664\u4e0a\u8ff0\u51fd\u6570</p>\n<pre class=\"screen\">DROP FUNCTION sum_n_product (x int, y int, OUT sum int, OUT product int);\nDROP FUNCTION sum_n_product (int, int);\n</pre>\n<p lang=\"zh\">\u53c2\u6570\u53ef\u4ee5\u88ab\u6807\u8bb0\u4e3a<code class=\"literal\">IN</code>\uff08\u9ed8\u8ba4\uff09\u3001<code class=\"literal\">OUT</code>\u3001<code class=\"literal\">INOUT</code>\u6216\u8005<code class=\"literal\">VARIADIC</code>\u3002\u4e00\u4e2a<code class=\"literal\">INOUT</code>\u53c2\u6570\u65e2\u4f5c\u4e3a\u4e00\u4e2a\u8f93\u5165\u53c2\u6570\uff08\u8c03\u7528\u53c2\u6570\u5217\u8868\u7684\u4e00\u90e8\u5206\uff09\u53c8\u4f5c\u4e3a\u4e00\u4e2a\u8f93\u51fa\u53c2\u6570\uff08\u7ed3\u679c\u8bb0\u5f55\u7c7b\u578b\u7684\u4e00\u90e8\u5206\uff09\u3002<code class=\"literal\">VARIADIC</code>\u53c2\u6570\u662f\u8f93\u5165\u53c2\u6570\uff0c\u4f46\u88ab\u6309\u7167\u4e0b\u6587\u6240\u8ff0\u7279\u6b8a\u5bf9\u5f85\u3002</p>\n</div>\n<div class=\"sect2\" id=\"XFUNC-OUTPUT-PARAMETERS-PROC\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/18/xfunc-sql.html#XFUNC-OUTPUT-PARAMETERS-PROC\">36.5.5. \u5e26\u6709\u8f93\u51fa\u53c2\u6570\u7684<acronym class=\"acronym\">SQL</acronym>\u8fc7\u7a0b</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\">\u8fc7\u7a0b\u4e5f\u652f\u6301\u8f93\u51fa\u53c2\u6570\uff0c\u4f46\u662f\u5b83\u4eec\u7684\u5de5\u4f5c\u65b9\u5f0f\u4e0e\u51fd\u6570\u7565\u6709\u4e0d\u540c\u3002\u5728<code class=\"command\">CALL</code>\u547d\u4ee4\u4e2d\uff0c\u8f93\u51fa\u53c2\u6570\u5fc5\u987b\u5305\u62ec\u5728\u53c2\u6570\u5217\u8868\u4e2d\u3002\u4f8b\u5982\uff0c\u524d\u9762\u7684\u94f6\u884c\u8d26\u6237\u501f\u8bb0\u4f8b\u7a0b\u53ef\u4ee5\u50cf\u8fd9\u6837\u5199\uff1a</p>\n<pre class=\"programlisting\">CREATE PROCEDURE tp1 (accountno integer, debit numeric, OUT new_balance numeric) AS $$\n    UPDATE bank\n        SET balance = balance - debit\n        WHERE accountno = tp1.accountno\n    RETURNING balance;\n$$ LANGUAGE SQL;\n</pre>\n<p lang=\"zh\">\u8981\u8c03\u7528\u8fd9\u4e2a\u4f8b\u7a0b\uff0c\u5fc5\u987b\u5305\u62ec\u5339\u914d<code class=\"literal\">OUT</code>\u53c2\u6570\u7684\u53c2\u6570\u3002\u901a\u5e38\u5199\u6210<code class=\"literal\">NULL</code>\uff1a</p>\n<pre class=\"programlisting\">CALL tp1(17, 100.0, NULL);\n</pre>\n<p lang=\"zh\">\u5982\u679c\u4f60\u5199\u7684\u662f\u5176\u4ed6\u5185\u5bb9\uff0c\u5b83\u5fc5\u987b\u662f\u4e00\u4e2a\u80fd\u591f\u50cf\u8f93\u5165\u53c2\u6570\u90a3\u6837\u88ab\u9690\u5f0f\u5f3a\u5236\u8f6c\u6362\u6210\u8be5\u53c2\u6570\u58f0\u660e\u7c7b\u578b\u7684\u8868\u8fbe\u5f0f\u3002\u4e0d\u8fc7\u8981\u6ce8\u610f\uff0c\u8fd9\u6837\u7684\u8868\u8fbe\u5f0f\u4e0d\u4f1a\u88ab\u6c42\u503c\u3002</p>\n<p lang=\"zh\">\u5f53\u4ece<span class=\"application\">PL/pgSQL</span>\u8c03\u7528\u8fc7\u7a0b\u65f6\uff0c\u4f60\u4e0d\u80fd\u5199<code class=\"literal\">NULL</code>\uff0c\u800c\u5fc5\u987b\u5199\u4e00\u4e2a\u7528\u4e8e\u63a5\u6536\u8fc7\u7a0b\u8f93\u51fa\u7684\u53d8\u91cf\u3002\u8be6\u89c1<a class=\"xref\" href=\"/docs/18/plpgsql-control-structures.html#PLPGSQL-STATEMENTS-CALLING-PROCEDURE\" title=\"41.6.3.\u00a0\u8c03\u7528\u8fc7\u7a0b\">\u7b2c\u00a041.6.3\u00a0\u8282</a>\u3002</p>\n</div>\n<div class=\"sect2\" id=\"XFUNC-SQL-VARIADIC-FUNCTIONS\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/18/xfunc-sql.html#XFUNC-SQL-VARIADIC-FUNCTIONS\">36.5.6. \u5e26\u6709\u53ef\u53d8\u6570\u91cf\u53c2\u6570\u7684<acronym class=\"acronym\">SQL</acronym>\u51fd\u6570</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\"><acronym class=\"acronym\">SQL</acronym> \u51fd\u6570\u53ef\u4ee5\u88ab\u58f0\u660e\u4e3a\u63a5\u53d7\u53ef\u53d8\u6570\u91cf\u7684\u53c2\u6570\uff0c\u53ea\u8981\u6240\u6709<span class=\"quote\">\u201c<span class=\"quote\">\u53ef\u9009</span>\u201d</span>\u53c2\u6570\u90fd\u5c5e\u4e8e\u540c\u4e00\u79cd\u6570\u636e\u7c7b\u578b\u3002\u53ef\u9009\u53c2\u6570\u4f1a\u4ee5\u6570\u7ec4\u5f62\u5f0f\u4f20\u9012\u7ed9\u51fd\u6570\u3002\u5b9a\u4e49\u8fd9\u7c7b\u51fd\u6570\u65f6\uff0c\u9700\u8981\u628a\u6700\u540e\u4e00\u4e2a\u53c2\u6570\u6807\u8bb0\u4e3a <code class=\"literal\">VARIADIC</code>\uff1b\u8be5\u53c2\u6570\u5fc5\u987b\u88ab\u58f0\u660e\u4e3a\u6570\u7ec4\u7c7b\u578b\u3002\u4f8b\u5982\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION mleast(VARIADIC arr numeric[]) RETURNS numeric AS $$\n    SELECT min($1[i]) FROM generate_subscripts($1, 1) g(i);\n$$ LANGUAGE SQL;\n\nSELECT mleast(10, -1, 5, 4.4);\n mleast\n--------\n     -1\n(1 row)\n</pre>\n<p lang=\"zh\">\u5b9e\u9645\u4e0a\uff0c\u4f4d\u4e8e <code class=\"literal\">VARIADIC</code> \u4f4d\u7f6e\u53ca\u4e4b\u540e\u7684\u6240\u6709\u5b9e\u53c2\u90fd\u4f1a\u88ab\u6536\u96c6\u6210\u4e00\u4e2a\u4e00\u7ef4\u6570\u7ec4\uff0c\u5c31\u50cf\u4f60\u5199\u6210\u4e86\uff1a</p>\n<pre class=\"screen\">SELECT mleast(ARRAY[10, -1, 5, 4.4]);    -- doesn't work\n</pre>\n<p lang=\"zh\">\u4e0d\u8fc7\u4f60\u5b9e\u9645\u4e0a\u4e0d\u80fd\u8fd9\u6837\u5199\uff0c\u81f3\u5c11\u5b83\u4e0d\u4f1a\u5339\u914d\u8fd9\u4e2a\u51fd\u6570\u5b9a\u4e49\u3002\u88ab\u6807\u8bb0\u4e3a <code class=\"literal\">VARIADIC</code> \u7684\u53c2\u6570\u5339\u914d\u7684\u662f\u5176\u5143\u7d20\u7c7b\u578b\u51fa\u73b0\u4e00\u6b21\u6216\u591a\u6b21\uff0c\u800c\u4e0d\u662f\u5b83\u81ea\u8eab\u7684\u6570\u7ec4\u7c7b\u578b\u3002</p>\n<p lang=\"zh\">\u6709\u65f6\u5019\uff0c\u80fd\u591f\u628a\u4e00\u4e2a\u5df2\u7ecf\u6784\u9020\u597d\u7684\u6570\u7ec4\u4f20\u7ed9\u53ef\u53d8\u53c2\u6570\u51fd\u6570\u4f1a\u5f88\u6709\u7528\uff0c\u5c24\u5176\u662f\u5f53\u4e00\u4e2a\u53ef\u53d8\u53c2\u6570\u51fd\u6570\u60f3\u628a\u5b83\u7684\u6570\u7ec4\u53c2\u6570\u518d\u4f20\u7ed9\u53e6\u4e00\u4e2a\u51fd\u6570\u65f6\u3002\u6b64\u5916\uff0c\u5728\u5141\u8bb8\u4e0d\u53d7\u4fe1\u4efb\u7528\u6237\u521b\u5efa\u5bf9\u8c61\u7684\u6a21\u5f0f\u4e2d\u8c03\u7528\u53ef\u53d8\u53c2\u6570\u51fd\u6570\u65f6\uff0c\u8fd9\u662f\u552f\u4e00\u5b89\u5168\u7684\u65b9\u5f0f\uff0c\u89c1<a class=\"xref\" href=\"/docs/18/typeconv-func.html\" title=\"10.3.\u00a0\u51fd\u6570\">\u7b2c\u00a010.3\u00a0\u8282</a>\u3002\u4f60\u53ef\u4ee5\u5728\u8c03\u7528\u4e2d\u6307\u5b9a<code class=\"literal\">VARIADIC</code>\u6765\u505a\u5230\u8fd9\u4e00\u70b9\uff1a</p>\n<pre class=\"screen\">SELECT mleast(VARIADIC ARRAY[10, -1, 5, 4.4]);\n</pre>\n<p lang=\"zh\">\u8fd9\u6837\u4f1a\u963b\u6b62\u51fd\u6570\u7684\u53ef\u53d8\u53c2\u6570\u6309\u5176\u5143\u7d20\u7c7b\u578b\u5c55\u5f00\uff0c\u4ece\u800c\u8ba9\u6570\u7ec4\u5b9e\u53c2\u80fd\u591f\u6309\u5e38\u89c4\u65b9\u5f0f\u5339\u914d\u3002<code class=\"literal\">VARIADIC</code> \u53ea\u80fd\u9644\u52a0\u5728\u51fd\u6570\u8c03\u7528\u7684\u6700\u540e\u4e00\u4e2a\u5b9e\u53c2\u4e0a\u3002</p>\n<p lang=\"zh\">\u5728\u8c03\u7528\u4e2d\u6307\u5b9a<code class=\"literal\">VARIADIC</code>\u4e5f\u662f\u5411\u53ef\u53d8\u53c2\u6570\u51fd\u6570\u4f20\u9012\u7a7a\u6570\u7ec4\u7684\u552f\u4e00\u65b9\u5f0f\uff0c\u4f8b\u5982\uff1a</p>\n<pre class=\"screen\">SELECT mleast(VARIADIC ARRAY[]::numeric[]);\n</pre>\n<p lang=\"zh\">\u4ec5\u4ec5\u5199\u6210<code class=\"literal\">SELECT mleast()</code>\u662f\u884c\u4e0d\u901a\u7684\uff0c\u56e0\u4e3a\u53ef\u53d8\u53c2\u6570\u5fc5\u987b\u5339\u914d\u81f3\u5c11\u4e00\u4e2a\u5b9e\u53c2\u3002\uff08\u5982\u679c\u4f60\u5e0c\u671b\u5141\u8bb8\u8fd9\u79cd\u8c03\u7528\uff0c\u53ef\u4ee5\u518d\u5b9a\u4e49\u4e00\u4e2a\u540c\u540d\u4e14\u4e0d\u5e26\u53c2\u6570\u7684\u51fd\u6570<code class=\"literal\">mleast</code>\u3002\uff09</p>\n<p lang=\"zh\">\u4ece\u53ef\u53d8\u53c2\u6570\u6d3e\u751f\u51fa\u7684\u6570\u7ec4\u5143\u7d20\u53c2\u6570\u4f1a\u88ab\u89c6\u4e3a\u6ca1\u6709\u81ea\u5df1\u7684\u540d\u5b57\u3002\u8fd9\u610f\u5473\u7740\u9664\u975e\u4f60\u6307\u5b9a\u4e86 <code class=\"literal\">VARIADIC</code>\uff0c\u5426\u5219\u4e0d\u80fd\u4f7f\u7528\u547d\u540d\u53c2\u6570\u6765\u8c03\u7528\u53ef\u53d8\u53c2\u6570\u51fd\u6570\uff08<a class=\"xref\" href=\"/docs/18/sql-syntax-calling-funcs.html\" title=\"4.3.\u00a0\u8c03\u7528\u51fd\u6570\">\u7b2c\u00a04.3\u00a0\u8282</a>\uff09\u3002\u4f8b\u5982\uff0c\u4e0b\u9762\u7684\u8c03\u7528\u662f\u53ef\u884c\u7684\uff1a</p>\n<pre class=\"screen\">SELECT mleast(VARIADIC arr =&gt; ARRAY[10, -1, 5, 4.4]);\n</pre>\n<p lang=\"zh\">\u4f46\u8fd9\u4e9b\u5c31\u4e0d\u884c\uff1a</p>\n<pre class=\"screen\">SELECT mleast(arr =&gt; 10);\nSELECT mleast(arr =&gt; ARRAY[10, -1, 5, 4.4]);\n</pre>\n</div>\n<div class=\"sect2\" id=\"XFUNC-SQL-PARAMETER-DEFAULTS\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/18/xfunc-sql.html#XFUNC-SQL-PARAMETER-DEFAULTS\">36.5.7. \u5e26\u6709\u53c2\u6570\u9ed8\u8ba4\u503c\u7684<acronym class=\"acronym\">SQL</acronym>\u51fd\u6570</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\">\u51fd\u6570\u53ef\u4ee5\u88ab\u58f0\u660e\u4e3a\u5bf9\u4e00\u4e9b\u6216\u8005\u6240\u6709\u8f93\u5165\u53c2\u6570\u5177\u6709\u9ed8\u8ba4\u503c\u3002\u53ea\u8981\u8c03\u7528\u51fd\u6570\u65f6\u6ca1\u6709\u7ed9\u51fa\u8db3\u591f\u591a\u7684\u5b9e\u53c2\uff0c\u5c31\u4f1a\u63d2\u5165\u9ed8\u8ba4\u503c\u6765\u5f25\u8865\u7f3a\u5931\u7684\u5b9e\u53c2\u3002\u7531\u4e8e\u53c2\u6570\u53ea\u80fd\u4ece\u5b9e\u53c2\u5217\u8868\u7684\u5c3e\u90e8\u5f00\u59cb\u88ab\u7701\u7565\uff0c\u5728\u4e00\u4e2a\u6709\u9ed8\u8ba4\u503c\u7684\u53c2\u6570\u4e4b\u540e\u7684\u6240\u6709\u53c2\u6570\u90fd\u4e0d\u5f97\u4e0d\u4e5f\u5177\u6709\u9ed8\u8ba4\u503c\uff08\u5c3d\u7ba1\u4f7f\u7528\u547d\u540d\u53c2\u6570\u8bb0\u6cd5\u53ef\u4ee5\u5141\u8bb8\u653e\u677e\u8fd9\u79cd\u9650\u5236\uff0c\u8fd9\u79cd\u9650\u5236\u4ecd\u7136\u4f1a\u88ab\u5f3a\u5236\u4ee5\u4fbf\u4f4d\u7f6e\u53c2\u6570\u8bb0\u6cd5\u80fd\u5de5\u4f5c\uff09\u3002\u4e0d\u7ba1\u4f60\u662f\u5426\u4f7f\u7528\u5b83\uff0c\u8fd9\u79cd\u80fd\u529b\u90fd\u8981\u6c42\u5728\u67d0\u4e9b\u7528\u6237\u4e0d\u4fe1\u4efb\u5176\u4ed6\u7528\u6237\u7684\u6570\u636e\u5e93\u4e2d\u8c03\u7528\u51fd\u6570\u65f6\u91c7\u53d6\u4e00\u4e9b\u9884\u9632\u63aa\u65bd\uff0c\u89c1<a class=\"xref\" href=\"/docs/18/typeconv-func.html\" title=\"10.3.\u00a0\u51fd\u6570\">\u7b2c\u00a010.3\u00a0\u8282</a>\u3002</p>\n<p lang=\"zh\">\u4f8b\u5982\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION foo(a int, b int DEFAULT 2, c int DEFAULT 3)\nRETURNS int\nLANGUAGE SQL\nAS $$\n    SELECT $1 + $2 + $3;\n$$;\n\nSELECT foo(10, 20, 30);\n foo\n-----\n  60\n(1 row)\n\nSELECT foo(10, 20);\n foo\n-----\n  33\n(1 row)\n\nSELECT foo(10);\n foo\n-----\n  15\n(1 row)\n\nSELECT foo();  -- fails since there is no default for the first argument\nERROR:  function foo() does not exist\n</pre>\n<p lang=\"zh\">\u4e5f\u53ef\u4ee5\u7528 <code class=\"literal\">=</code> \u7b26\u53f7\u4ee3\u66ff\u5173\u952e\u5b57 <code class=\"literal\">DEFAULT</code>\u3002</p>\n</div>\n<div class=\"sect2\" id=\"XFUNC-SQL-TABLE-FUNCTIONS\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/18/xfunc-sql.html#XFUNC-SQL-TABLE-FUNCTIONS\">36.5.8. <acronym class=\"acronym\">SQL</acronym> \u51fd\u6570\u4f5c\u4e3a\u8868\u6765\u6e90</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\">\u6240\u6709\u7684 SQL \u51fd\u6570\u90fd\u53ef\u4ee5\u88ab\u7528\u5728\u67e5\u8be2\u7684<code class=\"literal\">FROM</code>\u5b50\u53e5\u4e2d\uff0c\u4f46\u662f\u5bf9\u4e8e\u8fd4\u56de\u590d\u5408\u7c7b\u578b\u7684\u51fd\u6570\u7279\u522b\u6709\u7528\u3002\u5982\u679c\u51fd\u6570\u88ab\u5b9a\u4e49\u4e3a\u8fd4\u56de\u4e00\u79cd\u57fa\u7840\u7c7b\u578b\uff0c\u8be5\u8868\u51fd\u6570\u4f1a\u4ea7\u751f\u4e00\u4e2a\u5355\u5217\u8868\u3002\u5982\u679c\u8be5\u51fd\u6570\u88ab\u5b9a\u4e49\u4e3a\u8fd4\u56de\u4e00\u79cd\u590d\u5408\u7c7b\u578b\uff0c\u8be5\u8868\u51fd\u6570\u4f1a\u4e3a\u8be5\u590d\u5408\u7c7b\u578b\u7684\u6bcf\u4e00\u4e2a\u5c5e\u6027\u4ea7\u751f\u4e00\u5217\u3002</p>\n<p lang=\"zh\">\u4ee5\u4e0b\u662f\u4e00\u4e2a\u793a\u4f8b\uff1a</p>\n<pre class=\"screen\">CREATE TABLE foo (fooid int, foosubid int, fooname text);\nINSERT INTO foo VALUES (1, 1, 'Joe');\nINSERT INTO foo VALUES (1, 2, 'Ed');\nINSERT INTO foo VALUES (2, 1, 'Mary');\n\nCREATE FUNCTION getfoo(int) RETURNS foo AS $$\n    SELECT * FROM foo WHERE fooid = $1;\n$$ LANGUAGE SQL;\n\nSELECT *, upper(fooname) FROM getfoo(1) AS t1;\n\n fooid | foosubid | fooname | upper\n-------+----------+---------+-------\n     1 |        1 | Joe     | JOE\n(1 row)\n</pre>\n<p lang=\"zh\">\u5982\u793a\u4f8b\u6240\u793a\uff0c\u6211\u4eec\u53ef\u4ee5\u50cf\u64cd\u4f5c\u666e\u901a\u8868\u7684\u5217\u4e00\u6837\u64cd\u4f5c\u51fd\u6570\u7ed3\u679c\u4e2d\u7684\u5217\u3002</p>\n<p lang=\"zh\">\u6ce8\u610f\u6211\u4eec\u53ea\u4ece\u51fd\u6570\u5f97\u5230\u4e86\u4e00\u884c\u3002\u8fd9\u662f\u56e0\u4e3a\u6211\u4eec\u6ca1\u6709\u4f7f\u7528<code class=\"literal\">SETOF</code>\u3002\u8fd9\u4f1a\u5728\u4e0b\u4e00\u8282\u4e2d\u4ecb\u7ecd\u3002</p>\n</div>\n<div class=\"sect2\" id=\"XFUNC-SQL-FUNCTIONS-RETURNING-SET\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/18/xfunc-sql.html#XFUNC-SQL-FUNCTIONS-RETURNING-SET\">36.5.9. \u8fd4\u56de\u96c6\u5408\u7684<acronym class=\"acronym\">SQL</acronym>\u51fd\u6570</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\">\u5f53\u4e00\u4e2a SQL \u51fd\u6570\u88ab\u58f0\u660e\u4e3a\u8fd4\u56de<code class=\"literal\">SETOF <em class=\"replaceable\"><code>sometype</code></em></code>\u65f6\uff0c\u8be5\u51fd\u6570\u7684\u6700\u540e\u4e00\u4e2a\u67e5\u8be2\u4f1a\u88ab\u6267\u884c\u5b8c\uff0c\u5e76\u4e14\u5b83\u8f93\u51fa\u7684\u6bcf\u4e00\u884c\u90fd\u4f1a\u88ab\u4f5c\u4e3a\u7ed3\u679c\u96c6\u7684\u4e00\u4e2a\u5143\u7d20\u8fd4\u56de\u3002</p>\n<p lang=\"zh\">\u8fd9\u4e00\u7279\u6027\u901a\u5e38\u662f\u5728\u67e5\u8be2\u7684 <code class=\"literal\">FROM</code> \u5b50\u53e5\u4e2d\u8c03\u7528\u51fd\u6570\u65f6\u4f7f\u7528\u7684\u3002\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b\uff0c\u51fd\u6570\u8fd4\u56de\u7684\u6bcf\u4e00\u884c\u90fd\u4f1a\u6210\u4e3a\u67e5\u8be2\u6240\u89c1\u8868\u4e2d\u7684\u4e00\u884c\u3002\u4f8b\u5982\uff0c\u5047\u8bbe\u8868 <code class=\"literal\">foo</code> \u4e0e\u4e0a\u6587\u76f8\u540c\uff0c\u6211\u4eec\u5199\uff1a</p>\n<pre class=\"programlisting\">CREATE FUNCTION getfoo(int) RETURNS SETOF foo AS $$\n    SELECT * FROM foo WHERE fooid = $1;\n$$ LANGUAGE SQL;\n\nSELECT * FROM getfoo(1) AS t1;\n</pre>\n<p lang=\"zh\">\u90a3\u4e48\u4f1a\u5f97\u5230\uff1a</p>\n<pre class=\"screen\"> fooid | foosubid | fooname\n-------+----------+---------\n     1 |        1 | Joe\n     1 |        2 | Ed\n(2 rows)\n</pre>\n<p lang=\"zh\">\u4e5f\u53ef\u4ee5\u901a\u8fc7\u8f93\u51fa\u53c2\u6570\u5b9a\u4e49\u7684\u5217\u6765\u8fd4\u56de\u591a\u884c\uff0c\u4f8b\u5982\uff1a</p>\n<pre class=\"programlisting\">CREATE TABLE tab (y int, z int);\nINSERT INTO tab VALUES (1, 2), (3, 4), (5, 6), (7, 8);\n\nCREATE FUNCTION sum_n_product_with_tab (x int, OUT sum int, OUT product int)\nRETURNS SETOF record\nAS $$\n    SELECT $1 + tab.y, $1 * tab.y FROM tab;\n$$ LANGUAGE SQL;\n\nSELECT * FROM sum_n_product_with_tab(10);\n sum | product\n-----+---------\n  11 |      10\n  13 |      30\n  15 |      50\n  17 |      70\n(4 rows)\n</pre>\n<p lang=\"zh\">\u8fd9\u91cc\u7684\u5173\u952e\u70b9\u662f\uff1a\u4f60\u5fc5\u987b\u5199\u6210 <code class=\"literal\">RETURNS SETOF record</code>\uff0c\u4ee5\u8868\u660e\u8be5\u51fd\u6570\u8fd4\u56de\u7684\u662f\u591a\u884c\u800c\u4e0d\u662f\u5355\u884c\u3002\u5982\u679c\u53ea\u6709\u4e00\u4e2a\u8f93\u51fa\u53c2\u6570\uff0c\u5219\u5199\u8be5\u53c2\u6570\u7684\u7c7b\u578b\uff0c\u800c\u4e0d\u662f <code class=\"type\">record</code>\u3002</p>\n<p lang=\"zh\">\u901a\u8fc7\u591a\u6b21\u8c03\u7528\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u6765\u6784\u9020\u67e5\u8be2\u7ed3\u679c\u901a\u5e38\u5f88\u6709\u7528\uff0c\u5176\u4e2d\u6bcf\u6b21\u8c03\u7528\u7684\u53c2\u6570\u90fd\u6765\u81ea\u8868\u6216\u5b50\u67e5\u8be2\u7684\u8fde\u7eed\u884c\u3002\u9996\u9009\u65b9\u5f0f\u662f\u4f7f\u7528 <code class=\"literal\">LATERAL</code> \u5173\u952e\u5b57\uff0c\u8be6\u89c1<a class=\"xref\" href=\"/docs/18/queries-table-expressions.html#QUERIES-LATERAL\" title=\"7.2.1.5.\u00a0LATERAL\u5b50\u67e5\u8be2\">\u7b2c\u00a07.2.1.5\u00a0\u8282</a>\u3002\u4e0b\u9762\u662f\u4e00\u4e2a\u4f7f\u7528\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u679a\u4e3e\u6811\u7ed3\u6784\u5143\u7d20\u7684\u793a\u4f8b\uff1a</p>\n<pre class=\"screen\">SELECT * FROM nodes;\n   name    | parent\n-----------+--------\n Top       |\n Child1    | Top\n Child2    | Top\n Child3    | Top\n SubChild1 | Child1\n SubChild2 | Child1\n(6 rows)\n\nCREATE FUNCTION listchildren(text) RETURNS SETOF text AS $$\n    SELECT name FROM nodes WHERE parent = $1\n$$ LANGUAGE SQL STABLE;\n\nSELECT * FROM listchildren('Top');\n listchildren\n--------------\n Child1\n Child2\n Child3\n(3 rows)\n\nSELECT name, child FROM nodes, LATERAL listchildren(name) AS child;\n  name  |   child\n--------+-----------\n Top    | Child1\n Top    | Child2\n Top    | Child3\n Child1 | SubChild1\n Child1 | SubChild2\n(5 rows)\n</pre>\n<p lang=\"zh\">\u8fd9\u4e2a\u4f8b\u5b50\u5e76\u6ca1\u6709\u505a\u51fa\u4efb\u4f55\u65e0\u6cd5\u7528\u7b80\u5355\u8fde\u63a5\u5b9e\u73b0\u7684\u4e8b\uff0c\u4f46\u5728\u66f4\u590d\u6742\u7684\u8ba1\u7b97\u4e2d\uff0c\u628a\u4e00\u90e8\u5206\u5de5\u4f5c\u653e\u8fdb\u51fd\u6570\u91cc\u901a\u5e38\u4f1a\u975e\u5e38\u65b9\u4fbf\u3002</p>\n<p lang=\"zh\">\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u4e5f\u53ef\u4ee5\u51fa\u73b0\u5728\u67e5\u8be2\u7684\u9009\u62e9\u5217\u8868\u4e2d\u3002\u5bf9\u4e8e\u67e5\u8be2\u672c\u8eab\u751f\u6210\u7684\u6bcf\u4e00\u884c\uff0c\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u90fd\u4f1a\u88ab\u8c03\u7528\uff0c\u5e76\u4e3a\u5176\u7ed3\u679c\u96c6\u4e2d\u7684\u6bcf\u4e00\u4e2a\u5143\u7d20\u751f\u6210\u4e00\u884c\u8f93\u51fa\u3002\u524d\u9762\u7684\u4f8b\u5b50\u4e5f\u53ef\u4ee5\u5199\u6210\u8fd9\u6837\uff1a</p>\n<pre class=\"screen\">SELECT listchildren('Top');\n listchildren\n--------------\n Child1\n Child2\n Child3\n(3 rows)\n\nSELECT name, listchildren(name) FROM nodes;\n  name  | listchildren\n--------+--------------\n Top    | Child1\n Top    | Child2\n Top    | Child3\n Child1 | SubChild1\n Child1 | SubChild2\n(5 rows)\n</pre>\n<p lang=\"zh\">\u5728\u6700\u540e\u4e00\u4e2a <code class=\"command\">SELECT</code> \u4e2d\uff0c\u6ce8\u610f\u6ca1\u6709\u4e3a <code class=\"literal\">Child2</code>\u3001<code class=\"literal\">Child3</code> \u7b49\u663e\u793a\u4efb\u4f55\u8f93\u51fa\u884c\u3002\u8fd9\u662f\u56e0\u4e3a <code class=\"function\">listchildren</code> \u5bf9\u8fd9\u4e9b\u53c2\u6570\u8fd4\u56de\u7684\u662f\u7a7a\u96c6\uff0c\u56e0\u6b64\u4e0d\u4f1a\u751f\u6210\u7ed3\u679c\u884c\u3002\u8fd9\u4e0e\u4f7f\u7528 <code class=\"literal\">LATERAL</code> \u8bed\u6cd5\u628a\u51fd\u6570\u7ed3\u679c\u505a\u5185\u8fde\u63a5\u65f6\u5f97\u5230\u7684\u884c\u4e3a\u76f8\u540c\u3002</p>\n<p lang=\"zh\"><span class=\"productname\">PostgreSQL</span>\u4e2d\uff0c\u5199\u5728\u67e5\u8be2\u7684\u9009\u62e9\u5217\u8868\u4e2d\u7684\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u7684\u884c\u4e3a\u51e0\u4e4e\u548c\u5199\u5728<code class=\"literal\">LATERAL FROM</code>\u5b50\u53e5\u9879\u4e2d\u7684\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u5b8c\u5168\u4e00\u6837\u3002\u4f8b\u5982\uff1a</p>\n<pre class=\"programlisting\">SELECT x, generate_series(1,5) AS g FROM tab;\n</pre>\n<p lang=\"zh\">\u51e0\u4e4e\u7b49\u6548\u4e8e</p>\n<pre class=\"programlisting\">SELECT x, g FROM tab, LATERAL generate_series(1,5) AS g;\n</pre>\n<p lang=\"zh\">\u8fd9\u4f1a\u662f\u5b8c\u5168\u4e00\u6837\u7684\uff0c\u9664\u4e86\u5728\u8fd9\u4e2a\u7279\u522b\u7684\u793a\u4f8b\u4e2d\uff0c\u89c4\u5212\u5668\u53ef\u4ee5\u9009\u62e9\u628a<code class=\"structname\">g</code>\u653e\u5728\u5d4c\u5957\u5faa\u73af\u8fde\u63a5\u7684\u5916\u4fa7\uff0c\u56e0\u4e3a<code class=\"structname\">g</code>\u5bf9<code class=\"structname\">tab</code>\u6ca1\u6709\u5b9e\u9645\u7684\u6a2a\u5411\u4f9d\u8d56\u3002\u90a3\u4f1a\u5bfc\u81f4\u4e00\u79cd\u4e0d\u540c\u7684\u8f93\u51fa\u884c\u987a\u5e8f\u3002\u9009\u62e9\u5217\u8868\u4e2d\u7684\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u603b\u662f\u4f1a\u88ab\u8ba1\u7b97\uff0c\u5c31\u597d\u50cf\u5b83\u4eec\u5728<code class=\"literal\">FROM</code>\u5b50\u53e5\u5269\u4f59\u90e8\u5206\u7684\u5d4c\u5957\u5faa\u73af\u8fde\u63a5\u7684\u5185\u4fa7\u4e00\u6837\uff0c\u56e0\u6b64\u5728\u8003\u8651\u6765\u81ea<code class=\"literal\">FROM</code>\u5b50\u53e5\u7684\u4e0b\u4e00\u884c\u4e4b\u524d\uff0c\u8fd9\u4e9b\u51fd\u6570\u4f1a\u8fd0\u884c\u5230\u5b8c\u6210\u3002</p>\n<p lang=\"zh\">\u5982\u679c\u5728\u67e5\u8be2\u7684\u9009\u62e9\u5217\u8868\u4e2d\u6709\u4e0d\u6b62\u4e00\u4e2a\u96c6\u5408\u8fd4\u56de\u51fd\u6570\uff0c\u5219\u884c\u4e3a\u7c7b\u4f3c\u4e8e\u628a\u90a3\u4e9b\u51fd\u6570\u653e\u5230\u4e00\u4e2a\u5355\u4e00\u7684<code class=\"literal\">LATERAL ROWS FROM( ... )</code> <code class=\"literal\">FROM</code>\u5b50\u53e5\u9879\u4e2d\u7684\u884c\u4e3a\u3002\u5bf9\u4e8e\u6765\u81ea\u5e95\u5c42\u67e5\u8be2\u7684\u6bcf\u4e00\u884c\uff0c\u90fd\u6709\u4e00\u4e2a\u7528\u5230\u6bcf\u4e2a\u51fd\u6570\u9996\u4e2a\u7ed3\u679c\u7684\u8f93\u51fa\u884c\uff0c\u7136\u540e\u662f\u4e00\u4e2a\u4f7f\u7528\u6bcf\u4e2a\u51fd\u6570\u7b2c\u4e8c\u4e2a\u7ed3\u679c\u7684\u8f93\u51fa\u884c\uff0c\u4ee5\u6b64\u7c7b\u63a8\u3002\u5982\u679c\u67d0\u4e9b\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u4ea7\u751f\u7684\u8f93\u51fa\u6bd4\u5176\u4ed6\u51fd\u6570\u5c11\uff0c\u4f1a\u7528\u7a7a\u503c\u4ee3\u66ff\u7f3a\u5931\u7684\u6570\u636e\uff0c\u56e0\u6b64\u4e3a\u4e00\u4e2a\u5e95\u5c42\u884c\u5f62\u6210\u7684\u603b\u884c\u6570\u7b49\u4e8e\u4ea7\u751f\u6700\u591a\u8f93\u51fa\u7684\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u7684\u8f93\u51fa\u884c\u6570\u3002\u56e0\u6b64\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u4f1a<span class=\"quote\">\u201c<span class=\"quote\">\u6b65\u8c03\u4e00\u81f4</span>\u201d</span>\u5730\u8fd0\u884c\u76f4\u5230\u5b83\u4eec\u7684\u8f93\u51fa\u88ab\u8017\u5c3d\uff0c\u7136\u540e\u7528\u4e0b\u4e00\u4e2a\u5e95\u5c42\u884c\u7ee7\u7eed\u6267\u884c\u3002</p>\n<p lang=\"zh\">\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u53ef\u4ee5\u88ab\u5d4c\u5957\u5728\u4e00\u4e2a\u9009\u62e9\u5217\u8868\u4e2d\uff0c\u4e0d\u8fc7\u5728<code class=\"literal\">FROM</code>\u5b50\u53e5\u9879\u4e2d\u4e0d\u5141\u8bb8\u8fd9\u6837\u505a\u3002\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b\uff0c\u5d4c\u5957\u7684\u6bcf\u4e00\u5c42\u4f1a\u88ab\u5355\u72ec\u5bf9\u5f85\uff0c\u5c31\u50cf\u5b83\u662f\u4e00\u4e2a\u5355\u72ec\u7684<code class=\"literal\">LATERAL ROWS FROM( ... )</code>\u9879\u4e00\u6837\u3002\u4f8b\u5982\uff0c\u5728</p>\n<pre class=\"programlisting\">SELECT srf1(srf2(x), srf3(y)), srf4(srf5(z)) FROM tab;\n</pre>\n<p lang=\"zh\">\u4e2d\uff0c\u96c6\u5408\u8fd4\u56de\u51fd\u6570<code class=\"function\">srf2</code>\u3001<code class=\"function\">srf3</code>\u548c<code class=\"function\">srf5</code>\u5c06\u4e3a<code class=\"structname\">tab</code>\u7684\u6bcf\u4e00\u884c\u6b65\u8c03\u4e00\u81f4\u5730\u8fd0\u884c\uff0c\u7136\u540e\u4f1a\u5bf9\u8f83\u4f4e\u5c42\u7684\u51fd\u6570\u4ea7\u751f\u7684\u6bcf\u4e00\u884c\u4ee5\u6b65\u8c03\u4e00\u81f4\u7684\u5f62\u5f0f\u5e94\u7528<code class=\"function\">srf1</code>\u548c<code class=\"function\">srf4</code>\u3002</p>\n<p lang=\"zh\">\u5728<code class=\"literal\">CASE</code>\u6216<code class=\"literal\">COALESCE</code>\u8fd9\u6837\u7684\u6761\u4ef6\u8ba1\u7b97\u7ed3\u6784\u4e2d\uff0c\u4e0d\u80fd\u4f7f\u7528\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u3002\u4f8b\u5982\uff0c\u8003\u8651</p>\n<pre class=\"programlisting\">SELECT x, CASE WHEN x &gt; 0 THEN generate_series(1, 5) ELSE 0 END FROM tab;\n</pre>\n<p lang=\"zh\">\u8868\u9762\u4e0a\u770b\uff0c\u8fd9\u5e94\u5f53\u8ba9 x &gt; 0 \u7684\u8f93\u5165\u884c\u91cd\u590d\u4e94\u6b21\uff0c\u5176\u4f59\u884c\u53ea\u51fa\u73b0\u4e00\u6b21\uff1b\u4f46\u5b9e\u9645\u4e0a\uff0cgenerate_series(1, 5) \u4f1a\u5728 CASE \u8868\u8fbe\u5f0f\u6c42\u503c\u4e4b\u524d\uff0c\u4f5c\u4e3a\u9690\u5f0f LATERAL FROM \u9879\u6267\u884c\uff0c\u56e0\u6b64\u6bcf\u4e2a\u8f93\u5165\u884c\u90fd\u4f1a\u91cd\u590d\u4e94\u6b21\u3002\u4e3a\u907f\u514d\u6df7\u6dc6\uff0c\u6b64\u7c7b\u5199\u6cd5\u4f1a\u5728\u89e3\u6790\u9636\u6bb5\u62a5\u9519\u3002</p>\n<div class=\"note\">\n<h3 class=\"title\" lang=\"zh\">\u6ce8\u610f</h3>\n<p lang=\"zh\">\u5982\u679c\u51fd\u6570\u7684\u6700\u540e\u4e00\u6761\u547d\u4ee4\u662f\u5e26 RETURNING \u7684 INSERT\u3001UPDATE\u3001DELETE \u6216 MERGE\uff0c\u8be5\u547d\u4ee4\u59cb\u7ec8\u6267\u884c\u5230\u5b8c\u6210\uff0c\u5373\u4f7f\u51fd\u6570\u672a\u58f0\u660e SETOF\uff0c\u6216\u8c03\u7528\u67e5\u8be2\u672a\u83b7\u53d6\u5168\u90e8\u7ed3\u679c\u884c\u4e5f\u662f\u5982\u6b64\u3002RETURNING \u5b50\u53e5\u4ea7\u751f\u7684\u989d\u5916\u884c\u4f1a\u88ab\u9759\u9ed8\u4e22\u5f03\uff0c\u4f46\u6307\u5b9a\u7684\u8868\u4fee\u6539\u4ecd\u4f1a\u53d1\u751f\uff0c\u5e76\u5728\u51fd\u6570\u8fd4\u56de\u4e4b\u524d\u5168\u90e8\u5b8c\u6210\u3002</p>\n</div>\n<div class=\"note\">\n<h3 class=\"title\" lang=\"zh\">\u6ce8\u610f</h3>\n<p lang=\"zh\">\u5728 <span class=\"productname\">PostgreSQL</span> 10 \u4e4b\u524d\uff0c\u9664\u975e\u591a\u4e2a\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u59cb\u7ec8\u4ea7\u751f\u76f8\u540c\u6570\u91cf\u7684\u884c\uff0c\u5426\u5219\u628a\u5b83\u4eec\u653e\u5728\u540c\u4e00\u4e2a\u9009\u62e9\u5217\u8868\u4e2d\u7684\u884c\u4e3a\u5e76\u4e0d\u5408\u7406\u3002\u5426\u5219\uff0c\u5f97\u5230\u7684\u8f93\u51fa\u884c\u6570\u4f1a\u662f\u8fd9\u4e9b\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u5404\u81ea\u4ea7\u751f\u884c\u6570\u7684\u6700\u5c0f\u516c\u500d\u6570\u3002\u6b64\u5916\uff0c\u5d4c\u5957\u7684\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u4e5f\u4e0d\u50cf\u4e0a\u6587\u6240\u63cf\u8ff0\u7684\u90a3\u6837\u5de5\u4f5c\uff1b\u76f8\u53cd\uff0c\u4e00\u4e2a\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u81f3\u591a\u53ea\u80fd\u6709\u4e00\u4e2a\u96c6\u5408\u8fd4\u56de\u53c2\u6570\uff0c\u5e76\u4e14\u6bcf\u4e00\u7ec4\u5d4c\u5957\u7684\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u90fd\u4f1a\u72ec\u7acb\u8fd0\u884c\u3002\u518d\u52a0\u4e0a\u8fc7\u53bb\u8fd8\u5141\u8bb8\u6761\u4ef6\u6267\u884c\uff08\u5373\u5728 <code class=\"literal\">CASE</code> \u7b49\u7ed3\u6784\u5185\u90e8\u4f7f\u7528\u96c6\u5408\u8fd4\u56de\u51fd\u6570\uff09\uff0c\u4e8b\u60c5\u5c31\u66f4\u52a0\u590d\u6742\u4e86\u3002\u5982\u679c\u4f60\u8981\u7f16\u5199\u9700\u8981\u5728\u65e7\u7248 <span class=\"productname\">PostgreSQL</span> \u4e0a\u8fd0\u884c\u7684\u67e5\u8be2\uff0c\u5efa\u8bae\u4f7f\u7528 <code class=\"literal\">LATERAL</code> \u8bed\u6cd5\uff0c\u56e0\u4e3a\u8fd9\u6837\u5728\u4e0d\u540c\u7248\u672c\u4e4b\u95f4\u80fd\u591f\u5f97\u5230\u4e00\u81f4\u7684\u7ed3\u679c\u3002\u5982\u679c\u4f60\u7684\u67e5\u8be2\u4f9d\u8d56\u4e8e\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u7684\u6761\u4ef6\u6267\u884c\uff0c\u6216\u8bb8\u53ef\u4ee5\u628a\u6761\u4ef6\u5224\u65ad\u79fb\u52a8\u5230\u81ea\u5b9a\u4e49\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u5185\u90e8\u6765\u4fee\u590d\u3002\u4f8b\u5982\uff0c</p>\n<pre class=\"programlisting\">SELECT x, CASE WHEN y &gt; 0 THEN generate_series(1, z) ELSE 5 END FROM tab;\n</pre>\n<p lang=\"zh\">\u53ef\u4ee5\u53d8\u6210</p>\n<pre class=\"programlisting\">CREATE FUNCTION case_generate_series(cond bool, start int, fin int, els int)\n  RETURNS SETOF int AS $$\nBEGIN\n  IF cond THEN\n    RETURN QUERY SELECT generate_series(start, fin);\n  ELSE\n    RETURN QUERY SELECT els;\n  END IF;\nEND$$ LANGUAGE plpgsql;\n\nSELECT x, case_generate_series(y &gt; 0, 1, z, 5) FROM tab;\n</pre>\n<p lang=\"zh\">\u8fd9\u79cd\u5199\u6cd5\u5728\u6240\u6709\u7248\u672c\u7684 <span class=\"productname\">PostgreSQL</span> \u4e2d\u7684\u884c\u4e3a\u90fd\u76f8\u540c\u3002</p>\n</div>\n</div>\n<div class=\"sect2\" id=\"XFUNC-SQL-FUNCTIONS-RETURNING-TABLE\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/18/xfunc-sql.html#XFUNC-SQL-FUNCTIONS-RETURNING-TABLE\">36.5.10. \u8fd4\u56de<code class=\"literal\">TABLE</code>\u7684<acronym class=\"acronym\">SQL</acronym>\u51fd\u6570</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\">\u8fd8\u6709\u53e6\u4e00\u79cd\u65b9\u6cd5\u53ef\u4ee5\u628a\u51fd\u6570\u58f0\u660e\u4e3a\u8fd4\u56de\u4e00\u4e2a\u96c6\u5408\uff0c\u5373\u4f7f\u7528 <code class=\"literal\">RETURNS TABLE(<em class=\"replaceable\"><code>columns</code></em>)</code>\u8bed\u6cd5\u3002\u8fd9\u7b49\u6548\u4e8e\u4f7f\u7528\u4e00\u4e2a\u6216\u8005\u591a\u4e2a<code class=\"literal\">OUT</code>\u53c2\u6570\u5916\u52a0\u628a\u51fd\u6570\u6807\u8bb0\u4e3a\u8fd4\u56de <code class=\"literal\">SETOF record</code>\uff08\u6216\u8005\u662f<code class=\"literal\">SETOF</code>\u5355\u4e2a\u8f93\u51fa\u53c2\u6570\u7684\u7c7b\u578b\uff09\u3002\u8fd9\u79cd\u5199\u6cd5\u662f\u5728\u6700\u8fd1\u7684 SQL \u6807\u51c6\u4e2d\u6307\u5b9a\u7684\uff0c\u56e0\u6b64\u53ef\u80fd\u6bd4\u4f7f\u7528 <code class=\"literal\">SETOF</code>\u7684\u79fb\u690d\u6027\u66f4\u597d\u3002</p>\n<p lang=\"zh\">\u4f8b\u5982\uff0c\u524d\u9762\u7684\u6c42\u548c\u5e76\u4e14\u76f8\u4e58\u7684\u793a\u4f8b\u4e5f\u53ef\u4ee5\u8fd9\u6837\u6765\u505a\uff1a</p>\n<pre class=\"programlisting\">CREATE FUNCTION sum_n_product_with_tab (x int)\nRETURNS TABLE(sum int, product int) AS $$\n    SELECT $1 + tab.y, $1 * tab.y FROM tab;\n$$ LANGUAGE SQL;\n</pre>\n<p lang=\"zh\">\u4e0d\u5141\u8bb8\u628a\u663e\u5f0f\u7684<code class=\"literal\">OUT</code>\u6216\u8005<code class=\"literal\">INOUT</code>\u53c2\u6570\u7528\u4e8e <code class=\"literal\">RETURNS TABLE</code>\u8bb0\u6cd5 \u2014 \u5fc5\u987b\u628a\u6240\u6709\u8f93\u51fa\u5217\u653e\u5728 <code class=\"literal\">TABLE</code>\u5217\u8868\u4e2d\u3002</p>\n</div>\n<div class=\"sect2\" id=\"XFUNC-SQL-POLYMORPHIC-FUNCTIONS\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/18/xfunc-sql.html#XFUNC-SQL-POLYMORPHIC-FUNCTIONS\">36.5.11. \u591a\u6001<acronym class=\"acronym\">SQL</acronym>\u51fd\u6570</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\"><acronym class=\"acronym\">SQL</acronym> \u51fd\u6570\u53ef\u4ee5\u88ab\u58f0\u660e\u4e3a\u63a5\u53d7\u5e76\u8fd4\u56de<a class=\"xref\" href=\"/docs/18/extend-type-system.html#EXTEND-TYPES-POLYMORPHIC\" title=\"36.2.5.\u00a0\u591a\u6001\u7c7b\u578b\">\u7b2c\u00a036.2.5\u00a0\u8282</a>\u4e2d\u63cf\u8ff0\u7684\u591a\u6001\u7c7b\u578b\u3002\u4e0b\u9762\u8fd9\u4e2a\u591a\u6001\u51fd\u6570 <code class=\"function\">make_array</code> \u4f1a\u6839\u636e\u4e24\u4e2a\u4efb\u610f\u6570\u636e\u7c7b\u578b\u7684\u5143\u7d20\u6784\u9020\u4e00\u4e2a\u6570\u7ec4\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION make_array(anyelement, anyelement) RETURNS anyarray AS $$\n    SELECT ARRAY[$1, $2];\n$$ LANGUAGE SQL;\n\nSELECT make_array(1, 2) AS intarray, make_array('a'::text, 'b') AS textarray;\n intarray | textarray\n----------+-----------\n {1,2}    | {a,b}\n(1 row)\n</pre>\n<p lang=\"zh\">\u6ce8\u610f\u7c7b\u578b\u8f6c\u6362<code class=\"literal\">'a'::text</code>\u7684\u4f7f\u7528\u662f\u4e3a\u4e86\u6307\u5b9a\u8be5\u53c2\u6570\u7684\u7c7b\u578b\u662f<code class=\"type\">text</code>\u3002\u5982\u679c\u8be5\u53c2\u6570\u53ea\u662f\u4e00\u4e2a\u5b57\u7b26\u4e32\u5b57\u9762\u91cf\uff0c\u8fd9\u5c31\u662f\u5fc5\u987b\u7684\uff0c\u56e0\u4e3a\u5426\u5219\u5b83\u4f1a\u88ab\u5f53\u4f5c<code class=\"type\">unknown</code>\u7c7b\u578b\uff0c\u5e76\u4e14 <code class=\"type\">unknown</code>\u7684\u6570\u7ec4\u4e5f\u4e0d\u662f\u4e00\u79cd\u5408\u6cd5\u7684\u7c7b\u578b\u3002\u5982\u679c\u6ca1\u6709\u8be5\u7c7b\u578b\u8f6c\u6362\uff0c\u5c06\u5f97\u5230\u8fd9\u6837\u7684\u9519\u8bef\uff1a</p>\n<pre class=\"screen\">ERROR:  could not determine polymorphic type because input has type unknown\n</pre>\n<p lang=\"zh\">\u6309\u7167\u4e0a\u9762\u7684\u65b9\u5f0f\u58f0\u660e <code class=\"function\">make_array</code> \u65f6\uff0c\u4f60\u5fc5\u987b\u63d0\u4f9b\u4e24\u4e2a\u6570\u636e\u7c7b\u578b\u5b8c\u5168\u76f8\u540c\u7684\u53c2\u6570\uff1b\u7cfb\u7edf\u4e0d\u4f1a\u5c1d\u8bd5\u89e3\u51b3\u5b83\u4eec\u4e4b\u95f4\u7684\u7c7b\u578b\u5dee\u5f02\u3002\u4f8b\u5982\uff0c\u4e0b\u9762\u8fd9\u6837\u662f\u4e0d\u884c\u7684\uff1a</p>\n<pre class=\"screen\">SELECT make_array(1, 2.5) AS numericarray;\nERROR:  function make_array(integer, numeric) does not exist\n</pre>\n<p lang=\"zh\">\u53e6\u4e00\u79cd\u65b9\u6cd5\u662f\u4f7f\u7528<span class=\"quote\">\u201c<span class=\"quote\">common</span>\u201d</span>\u8fd9\u4e00\u65cf\u591a\u6001\u7c7b\u578b\uff0c\u5b83\u5141\u8bb8\u7cfb\u7edf\u5c1d\u8bd5\u8bc6\u522b\u4e00\u4e2a\u5408\u9002\u7684\u516c\u5171\u7c7b\u578b\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION make_array2(anycompatible, anycompatible)\nRETURNS anycompatiblearray AS $$\n    SELECT ARRAY[$1, $2];\n$$ LANGUAGE SQL;\n\nSELECT make_array2(1, 2.5) AS numericarray;\n numericarray\n--------------\n {1,2.5}\n(1 row)\n</pre>\n<p lang=\"zh\">\u7531\u4e8e\u516c\u5171\u7c7b\u578b\u89e3\u6790\u89c4\u5219\u5728\u6240\u6709\u8f93\u5165\u90fd\u662f\u672a\u77e5\u7c7b\u578b\u65f6\u9ed8\u8ba4\u9009\u62e9 <code class=\"type\">text</code>\uff0c\u6240\u4ee5\u4e0b\u9762\u7684\u5199\u6cd5\u4e5f\u80fd\u5de5\u4f5c\uff1a</p>\n<pre class=\"screen\">SELECT make_array2('a', 'b') AS textarray;\n textarray\n-----------\n {a,b}\n(1 row)\n</pre>\n<p lang=\"zh\">\u5141\u8bb8\u5b58\u5728\u5177\u6709\u56fa\u5b9a\u8fd4\u56de\u7c7b\u578b\u7684\u591a\u6001\u53c2\u6570\uff0c\u4f46\u53cd\u8fc7\u6765\u5219\u4e0d\u5141\u8bb8\u3002\u4f8b\u5982\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION is_greater(anyelement, anyelement) RETURNS boolean AS $$\n    SELECT $1 &gt; $2;\n$$ LANGUAGE SQL;\n\nSELECT is_greater(1, 2);\n is_greater\n------------\n f\n(1 row)\n\nCREATE FUNCTION invalid_func() RETURNS anyelement AS $$\n    SELECT 1;\n$$ LANGUAGE SQL;\nERROR:  cannot determine result data type\nDETAIL:  A result of type anyelement requires at least one input of type anyelement, anyarray, anynonarray, anyenum, or anyrange.\n</pre>\n<p lang=\"zh\">\u591a\u6001\u4e5f\u53ef\u4ee5\u548c\u5e26\u8f93\u51fa\u53c2\u6570\u7684\u51fd\u6570\u4e00\u8d77\u4f7f\u7528\u3002\u4f8b\u5982\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION dup (f1 anyelement, OUT f2 anyelement, OUT f3 anyarray)\nAS 'select $1, array[$1,$1]' LANGUAGE SQL;\n\nSELECT * FROM dup(22);\n f2 |   f3\n----+---------\n 22 | {22,22}\n(1 row)\n</pre>\n<p lang=\"zh\">\u591a\u6001\u4e5f\u53ef\u4ee5\u7528\u4e8e\u53ef\u53d8\u53c2\u6570\u51fd\u6570\u3002\u4f8b\u5982\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION anyleast (VARIADIC anyarray) RETURNS anyelement AS $$\n    SELECT min($1[i]) FROM generate_subscripts($1, 1) g(i);\n$$ LANGUAGE SQL;\n\nSELECT anyleast(10, -1, 5, 4);\n anyleast\n----------\n       -1\n(1 row)\n\nSELECT anyleast('abc'::text, 'def');\n anyleast\n----------\n abc\n(1 row)\n\nCREATE FUNCTION concat_values(text, VARIADIC anyarray) RETURNS text AS $$\n    SELECT array_to_string($2, $1);\n$$ LANGUAGE SQL;\n\nSELECT concat_values('|', 1, 4, 2);\n concat_values\n---------------\n 1|4|2\n(1 row)\n</pre>\n</div>\n<div class=\"sect2\" id=\"XFUNC-SQL-COLLATIONS\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/18/xfunc-sql.html#XFUNC-SQL-COLLATIONS\">36.5.12. \u5e26\u6709\u6392\u5e8f\u89c4\u5219\u7684<acronym class=\"acronym\">SQL</acronym>\u51fd\u6570</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\">\u5f53\u4e00\u4e2a SQL \u51fd\u6570\u6709\u4e00\u4e2a\u6216\u591a\u4e2a\u652f\u6301\u6392\u5e8f\u89c4\u5219\u7684\u6570\u636e\u7c7b\u578b\u53c2\u6570\u65f6\uff0c\u4f1a\u6309<a class=\"xref\" href=\"/docs/18/collation.html\" title=\"23.2.\u00a0\u6392\u5e8f\u89c4\u5219\u652f\u6301\">\u7b2c\u00a023.2\u00a0\u8282</a>\u4e2d\u7684\u8bf4\u660e\uff0c\u6839\u636e\u5206\u914d\u7ed9\u5b9e\u53c2\u7684\u6392\u5e8f\u89c4\u5219\uff0c\u4e3a\u6bcf\u6b21\u51fd\u6570\u8c03\u7528\u786e\u5b9a\u4e00\u4e2a\u6392\u5e8f\u89c4\u5219\u3002\u5982\u679c\u80fd\u591f\u6210\u529f\u786e\u5b9a\uff08\u4e5f\u5c31\u662f\u8bf4\uff0c\u53c2\u6570\u4e4b\u95f4\u4e0d\u5b58\u5728\u9690\u5f0f\u6392\u5e8f\u89c4\u5219\u51b2\u7a81\uff09\uff0c\u90a3\u4e48\u6240\u6709\u652f\u6301\u6392\u5e8f\u89c4\u5219\u7684\u53c2\u6570\u90fd\u4f1a\u88ab\u89c6\u4e3a\u9690\u5f0f\u5e26\u6709\u8be5\u6392\u5e8f\u89c4\u5219\u3002\u8fd9\u4f1a\u5f71\u54cd\u51fd\u6570\u4e2d\u5bf9\u6392\u5e8f\u89c4\u5219\u654f\u611f\u7684\u64cd\u4f5c\u7684\u884c\u4e3a\u3002\u4f8b\u5982\uff0c\u4f7f\u7528\u4e0a\u6587\u7684 <code class=\"function\">anyleast</code> \u51fd\u6570\u65f6\uff0c</p>\n<pre class=\"programlisting\">SELECT anyleast('abc'::text, 'ABC');\n</pre>\n<p lang=\"zh\">\u5176\u7ed3\u679c\u5c06\u53d6\u51b3\u4e8e\u6570\u636e\u5e93\u7684\u9ed8\u8ba4\u6392\u5e8f\u89c4\u5219\u3002\u5728 <code class=\"literal\">C</code> \u533a\u57df\u8bbe\u7f6e\u4e0b\uff0c\u7ed3\u679c\u4f1a\u662f <code class=\"literal\">ABC</code>\uff0c\u4f46\u5728\u8bb8\u591a\u5176\u4ed6\u533a\u57df\u8bbe\u7f6e\u4e0b\u5219\u4f1a\u662f <code class=\"literal\">abc</code>\u3002\u53ef\u4ee5\u5728\u4efb\u610f\u53c2\u6570\u4e0a\u6dfb\u52a0 <code class=\"literal\">COLLATE</code> \u5b50\u53e5\u6765\u5f3a\u5236\u6307\u5b9a\u8981\u4f7f\u7528\u7684\u6392\u5e8f\u89c4\u5219\uff0c\u4f8b\u5982\uff1a</p>\n<pre class=\"programlisting\">SELECT anyleast('abc'::text, 'ABC' COLLATE \"C\");\n</pre>\n<p lang=\"zh\">\u53e6\u5916\uff0c\u5982\u679c\u4f60\u5e0c\u671b\u67d0\u4e2a\u51fd\u6570\u65e0\u8bba\u4ee5\u4ec0\u4e48\u6392\u5e8f\u89c4\u5219\u8c03\u7528\uff0c\u90fd\u59cb\u7ec8\u6309\u7279\u5b9a\u6392\u5e8f\u89c4\u5219\u5de5\u4f5c\uff0c\u53ef\u4ee5\u5728\u51fd\u6570\u5b9a\u4e49\u4e2d\u6309\u9700\u63d2\u5165 <code class=\"literal\">COLLATE</code> \u5b50\u53e5\u3002\u4e0b\u9762\u8fd9\u4e2a\u7248\u672c\u7684 <code class=\"function\">anyleast</code> \u5c06\u59cb\u7ec8\u4f7f\u7528 <code class=\"literal\">en_US</code> \u533a\u57df\u8bbe\u7f6e\u6765\u6bd4\u8f83\u5b57\u7b26\u4e32\uff1a</p>\n<pre class=\"programlisting\">CREATE FUNCTION anyleast (VARIADIC anyarray) RETURNS anyelement AS $$\n    SELECT min($1[i] COLLATE \"en_US\") FROM generate_subscripts($1, 1) g(i);\n$$ LANGUAGE SQL;\n</pre>\n<p lang=\"zh\">\u4f46\u8bf7\u6ce8\u610f\uff0c\u5982\u679c\u628a\u5b83\u7528\u4e8e\u4e0d\u652f\u6301\u6392\u5e8f\u89c4\u5219\u7684\u6570\u636e\u7c7b\u578b\uff0c\u5c31\u4f1a\u629b\u51fa\u9519\u8bef\u3002</p>\n<p lang=\"zh\">\u5982\u679c\u65e0\u6cd5\u5728\u5b9e\u53c2\u4e4b\u95f4\u786e\u5b9a\u5171\u540c\u7684\u6392\u5e8f\u89c4\u5219\uff0c\u90a3\u4e48 SQL \u51fd\u6570\u4f1a\u628a\u53c2\u6570\u89c6\u4e3a\u5e26\u6709\u5176\u6570\u636e\u7c7b\u578b\u7684\u9ed8\u8ba4\u6392\u5e8f\u89c4\u5219\uff08\u901a\u5e38\u662f\u6570\u636e\u5e93\u7684\u9ed8\u8ba4\u6392\u5e8f\u89c4\u5219\uff0c\u4f46\u5bf9\u57df\u7c7b\u578b\u53c2\u6570\u6765\u8bf4\u4e5f\u53ef\u80fd\u4e0d\u540c\uff09\u3002</p>\n<p lang=\"zh\">\u8fd9\u79cd\u652f\u6301\u6392\u5e8f\u89c4\u5219\u7684\u53c2\u6570\u7684\u884c\u4e3a\uff0c\u53ef\u4ee5\u770b\u4f5c\u662f\u4ec5\u9002\u7528\u4e8e\u6587\u672c\u6570\u636e\u7c7b\u578b\u7684\u4e00\u79cd\u53d7\u9650\u591a\u6001\u5f62\u5f0f\u3002</p>\n</div>\n</div>", "manual_path": "/docs/18/xfunc-sql.html", "localization": {"status": "complete", "sources": [{"url": "/docs/18/xfunc-sql.html", "method": "same-major semantic node", "sha256": "60b2418e84c338cf6ad7405b672cb84df094f1298945bf222fdc7c2645afde07", "language": "zh", "matched_nodes": ["#XFUNC-SQL/div[12]/div[10]/h3[0]", "#XFUNC-SQL/div[12]/p[2]", "#XFUNC-SQL/div[12]/p[3]", "#XFUNC-SQL/div[12]/p[4]", "#XFUNC-SQL/div[12]/p[5]", "#XFUNC-SQL/div[12]/p[6]", "#XFUNC-SQL/div[12]/p[8]", "#XFUNC-SQL/div[13]/p[10]", "#XFUNC-SQL/div[13]/p[12]", "#XFUNC-SQL/div[13]/p[13]", "#XFUNC-SQL/div[13]/p[15]", "#XFUNC-SQL/div[13]/p[17]", "#XFUNC-SQL/div[13]/p[19]", "#XFUNC-SQL/div[13]/p[1]", "#XFUNC-SQL/div[13]/p[3]", "#XFUNC-SQL/div[13]/p[4]", "#XFUNC-SQL/div[13]/p[6]", "#XFUNC-SQL/div[13]/p[8]", "#XFUNC-SQL/div[14]/div[12]/ul[0]/li[0]", "#XFUNC-SQL/div[14]/div[12]/ul[0]/li[1]", "#XFUNC-SQL/div[14]/p[10]", "#XFUNC-SQL/div[14]/p[11]", "#XFUNC-SQL/div[14]/p[13]", "#XFUNC-SQL/div[14]/p[15]", "#XFUNC-SQL/div[14]/p[16]", "#XFUNC-SQL/div[14]/p[18]", "#XFUNC-SQL/div[14]/p[1]", "#XFUNC-SQL/div[14]/p[20]", "#XFUNC-SQL/div[14]/p[21]", "#XFUNC-SQL/div[14]/p[23]", "#XFUNC-SQL/div[14]/p[25]", "#XFUNC-SQL/div[14]/p[27]", "#XFUNC-SQL/div[14]/p[28]", "#XFUNC-SQL/div[14]/p[3]", "#XFUNC-SQL/div[14]/p[5]", "#XFUNC-SQL/div[14]/p[6]", "#XFUNC-SQL/div[14]/p[8]", "#XFUNC-SQL/div[15]/p[11]", "#XFUNC-SQL/div[15]/p[2]", "#XFUNC-SQL/div[15]/p[4]", "#XFUNC-SQL/div[15]/p[6]", "#XFUNC-SQL/div[15]/p[8]", "#XFUNC-SQL/div[15]/p[9]", "#XFUNC-SQL/div[16]/p[2]", "#XFUNC-SQL/div[16]/p[4]", "#XFUNC-SQL/div[16]/p[6]", "#XFUNC-SQL/div[16]/p[7]", "#XFUNC-SQL/div[17]/p[10]", "#XFUNC-SQL/div[17]/p[11]", "#XFUNC-SQL/div[17]/p[13]", "#XFUNC-SQL/div[17]/p[14]", "#XFUNC-SQL/div[17]/p[16]", "#XFUNC-SQL/div[17]/p[3]", "#XFUNC-SQL/div[17]/p[5]", "#XFUNC-SQL/div[17]/p[7]", "#XFUNC-SQL/div[17]/p[8]", "#XFUNC-SQL/div[18]/p[2]", "#XFUNC-SQL/div[18]/p[3]", "#XFUNC-SQL/div[18]/p[5]", "#XFUNC-SQL/div[19]/p[1]", "#XFUNC-SQL/div[19]/p[2]", "#XFUNC-SQL/div[19]/p[4]", "#XFUNC-SQL/div[19]/p[5]", "#XFUNC-SQL/div[1]/dl[0]/dt[0]", "#XFUNC-SQL/div[1]/dl[0]/dt[10]", "#XFUNC-SQL/div[1]/dl[0]/dt[11]", "#XFUNC-SQL/div[1]/dl[0]/dt[1]", "#XFUNC-SQL/div[1]/dl[0]/dt[2]", "#XFUNC-SQL/div[1]/dl[0]/dt[3]", "#XFUNC-SQL/div[1]/dl[0]/dt[4]", "#XFUNC-SQL/div[1]/dl[0]/dt[5]", "#XFUNC-SQL/div[1]/dl[0]/dt[6]", "#XFUNC-SQL/div[1]/dl[0]/dt[7]", "#XFUNC-SQL/div[1]/dl[0]/dt[8]", "#XFUNC-SQL/div[1]/dl[0]/dt[9]", "#XFUNC-SQL/div[20]/div[29]/p[1]", "#XFUNC-SQL/div[20]/div[29]/p[3]", "#XFUNC-SQL/div[20]/div[29]/p[5]", "#XFUNC-SQL/div[20]/p[10]", "#XFUNC-SQL/div[20]/p[12]", "#XFUNC-SQL/div[20]/p[13]", "#XFUNC-SQL/div[20]/p[15]", "#XFUNC-SQL/div[20]/p[16]", "#XFUNC-SQL/div[20]/p[18]", "#XFUNC-SQL/div[20]/p[20]", "#XFUNC-SQL/div[20]/p[21]", "#XFUNC-SQL/div[20]/p[22]", "#XFUNC-SQL/div[20]/p[24]", "#XFUNC-SQL/div[20]/p[25]", "#XFUNC-SQL/div[20]/p[2]", "#XFUNC-SQL/div[20]/p[3]", "#XFUNC-SQL/div[20]/p[5]", "#XFUNC-SQL/div[20]/p[7]", "#XFUNC-SQL/div[20]/p[9]", "#XFUNC-SQL/div[21]/p[2]", "#XFUNC-SQL/div[21]/p[3]", "#XFUNC-SQL/div[21]/p[5]", "#XFUNC-SQL/div[22]/p[11]", "#XFUNC-SQL/div[22]/p[13]", "#XFUNC-SQL/div[22]/p[15]", "#XFUNC-SQL/div[22]/p[1]", "#XFUNC-SQL/div[22]/p[3]", "#XFUNC-SQL/div[22]/p[5]", "#XFUNC-SQL/div[22]/p[7]", "#XFUNC-SQL/div[22]/p[9]", "#XFUNC-SQL/div[23]/p[10]", "#XFUNC-SQL/div[23]/p[2]", "#XFUNC-SQL/div[23]/p[4]", "#XFUNC-SQL/div[23]/p[6]", "#XFUNC-SQL/div[23]/p[8]", "#XFUNC-SQL/div[23]/p[9]", "#XFUNC-SQL/p[10]", "#XFUNC-SQL/p[11]", "#XFUNC-SQL/p[3]", "#XFUNC-SQL/p[4]", "#XFUNC-SQL/p[6]", "#XFUNC-SQL/p[8]"]}], "language": "zh", "original_text": {"/versions/18/description/0": "SQL-language functions", "/versions/18/facts/0/label": "Kind", "/versions/18/facts/0/value": "Native function language", "/versions/18/facts/1/label": "Trusted", "/versions/18/facts/2/label": "Validator"}, "fallback_fields": [], "source_language": "en", "original_snapshot_sha256": "2c71c51328a44a8e6a88cade6bc94ac82db6db5e702fc7ca7993cc6bee524eb0"}, "comparison_data": {"kind": "Native function language", "handler": "", "trusted": "t", "validator": "fmgr_sql_validator"}, "comparison_hash": "a4af9cf453d140d941e865b952c6a41e2b704a4b30cb77b61c1cdda8a77c5035", "manual_language": "zh"}, "19": {"facts": [{"label": "\u79cd\u7c7b", "value": "\u539f\u751f\u51fd\u6570\u8bed\u8a00"}, {"label": "\u53ef\u4fe1", "value": "t"}, {"label": "\u6821\u9a8c\u51fd\u6570", "value": "fmgr_sql_validator"}], "tables": [], "aliases": [], "catalog": {"oid": "14", "descr": "SQL-language functions", "lanacl": "_null_", "lanispl": "f", "lanname": "sql", "lanowner": "POSTGRES", "laninline": "0", "oid_symbol": "SQLlanguageId", "lanpltrusted": "t", "lanvalidator": "fmgr_sql_validator", "lanplcallfoid": "0"}, "related": [], "release": {"ref": "https://ftp.postgresql.org/pub/source/v19beta4/postgresql-19beta4.tar.bz2", "label": "19beta4", "major": "19", "channel": "preview", "revision": "83157ee9c599d03b2f7a3d73ef3a56ec24e0e79cc2b3501a64d1364f56398c86", "source_sha256": "83157ee9c599d03b2f7a3d73ef3a56ec24e0e79cc2b3501a64d1364f56398c86", "catalog_fingerprint": "62fbf1a3689dbe8bf7e6b3372cfe6fbf867581427b3858a94c8419b77a4d2d1d"}, "sources": [{"url": "https://ftp.postgresql.org/pub/source/v19beta4/postgresql-19beta4.tar.bz2", "label": "Matching PostgreSQL source archive", "sha256": "83157ee9c599d03b2f7a3d73ef3a56ec24e0e79cc2b3501a64d1364f56398c86"}, {"url": "https://pg.center/docs/19/xfunc-sql.html", "path": "xfunc-sql.html", "label": "PostgreSQL 19 English manual", "sha256": "4c772898f734264fe5a0580ce7606a0fb53ba096bd619651737fe8bffd47987f", "language": "en", "original_url": "/docs/19/xfunc-sql.html"}], "sections": [], "signature": "", "attributes": {"kind": "Native function language", "handler": "", "trusted": "t", "validator": "fmgr_sql_validator"}, "description": ["SQL \u8bed\u8a00\u51fd\u6570"], "manual_html": "<div class=\"sect1\" id=\"XFUNC-SQL\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h2 class=\"title\" lang=\"zh\">36.5. \u67e5\u8be2\u8bed\u8a00\uff08SQL\uff09\u51fd\u6570</h2>\n</div>\n</div>\n</div>\n<p lang=\"zh\">SQL \u51fd\u6570\u6267\u884c\u7531\u4efb\u610f SQL \u8bed\u53e5\u7ec4\u6210\u7684\u4e00\u4e2a\u5217\u8868\uff0c\u5e76\u8fd4\u56de\u5217\u8868\u4e2d\u6700\u540e\u4e00\u4e2a\u67e5\u8be2\u7684\u7ed3\u679c\u3002\u5728\u7b80\u5355\uff08\u975e\u96c6\u5408\uff09\u60c5\u51b5\u4e0b\uff0c\u5c06\u8fd4\u56de\u6700\u540e\u4e00\u4e2a\u67e5\u8be2\u7ed3\u679c\u7684\u7b2c\u4e00\u884c\u3002\uff08\u8bf7\u8bb0\u4f4f\uff0c\u9664\u975e\u4f7f\u7528 <code class=\"literal\">ORDER BY</code>\uff0c\u5426\u5219\u591a\u884c\u7ed3\u679c\u4e2d\u7684<span class=\"quote\">\u201c<span class=\"quote\">\u7b2c\u4e00\u884c</span>\u201d</span>\u5e76\u6ca1\u6709\u660e\u786e\u5b9a\u4e49\u3002\uff09\u5982\u679c\u6700\u540e\u4e00\u4e2a\u67e5\u8be2\u5b8c\u5168\u6ca1\u6709\u8fd4\u56de\u4efb\u4f55\u884c\uff0c\u5219\u8fd4\u56de\u7a7a\u503c\u3002</p>\n<p lang=\"zh\">\u6216\u8005\uff0c\u4e00\u4e2a SQL \u51fd\u6570\u53ef\u4ee5\u901a\u8fc7\u6307\u5b9a\u51fd\u6570\u7684\u8fd4\u56de\u7c7b\u578b\u4e3a<code class=\"literal\">SETOF <em class=\"replaceable\"><code>sometype</code></em></code>\u88ab\u58f0\u660e\u4e3a\u8fd4\u56de\u4e00\u4e2a\u96c6\u5408\uff08\u4e5f\u5c31\u662f\u591a\u4e2a\u884c\uff09\uff0c\u6216\u8005\u7b49\u6548\u5730\u58f0\u660e\u5b83\u4e3a<code class=\"literal\">RETURNS TABLE(<em class=\"replaceable\"><code>columns</code></em>)</code>\u3002\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b\uff0c\u6700\u540e\u4e00\u4e2a\u67e5\u8be2\u7684\u7ed3\u679c\u7684\u6240\u6709\u884c\u4f1a\u88ab\u8fd4\u56de\u3002\u4e0b\u6587\u5c06\u7ed9\u51fa\u8fdb\u4e00\u6b65\u7684\u7ec6\u8282\u3002</p>\n<p lang=\"zh\">SQL \u51fd\u6570\u4f53\u5fc5\u987b\u662f\u4e00\u7ec4\u7528\u5206\u53f7\u5206\u9694\u7684 SQL \u8bed\u53e5\uff0c\u6700\u540e\u4e00\u6761\u8bed\u53e5\u540e\u7684\u5206\u53f7\u53ef\u7701\u7565\u3002\u9664\u975e\u51fd\u6570\u58f0\u660e\u4e3a\u8fd4\u56de void\uff0c\u5426\u5219\u6700\u540e\u4e00\u6761\u8bed\u53e5\u5fc5\u987b\u662f SELECT\uff0c\u6216\u5305\u542b RETURNING \u5b50\u53e5\u7684 INSERT\u3001UPDATE\u3001DELETE \u6216 MERGE\u3002</p>\n<p lang=\"zh\">\u4efb\u610f\u4e00\u7ec4 <acronym class=\"acronym\">SQL</acronym> \u8bed\u8a00\u547d\u4ee4\u90fd\u53ef\u4ee5\u6253\u5305\u5e76\u5b9a\u4e49\u6210\u51fd\u6570\u3002\u9664 <code class=\"command\">SELECT</code> \u67e5\u8be2\u5916\uff0c\u8fd9\u4e9b\u547d\u4ee4\u8fd8\u53ef\u4ee5\u5305\u542b\u6570\u636e\u4fee\u6539\u67e5\u8be2\uff08<code class=\"command\">INSERT</code>\u3001<code class=\"command\">UPDATE</code>\u3001<code class=\"command\">DELETE</code> \u548c <code class=\"command\">MERGE</code>\uff09\uff0c\u4ee5\u53ca\u5176\u4ed6 SQL \u547d\u4ee4\u3002\uff08\u5728 <acronym class=\"acronym\">SQL</acronym> \u51fd\u6570\u4e2d\u4e0d\u80fd\u4f7f\u7528\u4e8b\u52a1\u63a7\u5236\u547d\u4ee4\uff0c\u4f8b\u5982 <code class=\"command\">COMMIT</code>\u3001<code class=\"command\">SAVEPOINT</code>\uff0c\u4e5f\u4e0d\u80fd\u4f7f\u7528\u67d0\u4e9b\u5de5\u5177\u547d\u4ee4\uff0c\u4f8b\u5982 <code class=\"literal\">VACUUM</code>\u3002\uff09\u4e0d\u8fc7\uff0c\u6700\u540e\u4e00\u6761\u547d\u4ee4\u5fc5\u987b\u662f <code class=\"command\">SELECT</code>\uff0c\u6216\u8005\u5e26\u6709 <code class=\"literal\">RETURNING</code> \u5b50\u53e5\uff0c\u5e76\u8fd4\u56de\u4e0e\u51fd\u6570\u58f0\u660e\u8fd4\u56de\u7c7b\u578b\u76f8\u7b26\u7684\u7ed3\u679c\u3002\u6216\u8005\uff0c\u5982\u679c\u4f60\u60f3\u5b9a\u4e49\u4e00\u4e2a\u6267\u884c\u52a8\u4f5c\u4f46\u6ca1\u6709\u6709\u7528\u8fd4\u56de\u503c\u7684 SQL \u51fd\u6570\uff0c\u4e5f\u53ef\u4ee5\u628a\u5b83\u5b9a\u4e49\u4e3a\u8fd4\u56de <code class=\"type\">void</code>\u3002\u4f8b\u5982\uff0c\u4e0b\u9762\u8fd9\u4e2a\u51fd\u6570\u4f1a\u4ece <code class=\"literal\">emp</code> \u8868\u4e2d\u5220\u9664\u85aa\u8d44\u4e3a\u8d1f\u7684\u884c\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION clean_emp() RETURNS void AS '\n    DELETE FROM emp\n        WHERE salary &lt; 0;\n' LANGUAGE SQL;\n\nSELECT clean_emp();\n\n clean_emp\n-----------\n\n(1 row)\n</pre>\n<p lang=\"zh\">\u4f60\u4e5f\u53ef\u4ee5\u628a\u8fd9\u4e2a\u5199\u4e3a\u4e00\u4e2a\u8fc7\u7a0b\uff0c\u90a3\u6837\u907f\u514d\u8fd4\u56de\u7c7b\u578b\u7684\u95ee\u9898\u3002\u4f8b\u5982\uff1a</p>\n<pre class=\"screen\">CREATE PROCEDURE clean_emp() AS '\n    DELETE FROM emp\n        WHERE salary &lt; 0;\n' LANGUAGE SQL;\n\nCALL clean_emp();\n</pre>\n<p lang=\"zh\">\u5728\u50cf\u8fd9\u6837\u7684\u7b80\u5355\u60c5\u51b5\u4e2d\uff0c\u8fd4\u56de<code class=\"type\">void</code>\u7684\u51fd\u6570\u4e0e\u8fc7\u7a0b\u4e4b\u95f4\u7684\u5dee\u5f02\u4e3b\u8981\u662f\u98ce\u683c\u4e0a\u9762\u7684\u3002\u4e0d\u8fc7\uff0c\u8fc7\u7a0b\u8fd8\u63d0\u4f9b\u4e86\u51fd\u6570\u6240\u6ca1\u6709\u7684\u989d\u5916\u80fd\u529b\uff0c\u4f8b\u5982\u4e8b\u52a1\u63a7\u5236\u3002\u6b64\u5916\uff0c\u8fc7\u7a0b\u662f SQL \u6807\u51c6\u7684\u4e00\u90e8\u5206\uff0c\u800c\u8fd4\u56de<code class=\"type\">void</code>\u5219\u662f PostgreSQL \u6269\u5c55\u3002</p>\n<p lang=\"zh\"><code class=\"command\">CREATE FUNCTION</code> \u547d\u4ee4\u7684\u8bed\u6cd5\u8981\u6c42\u628a\u51fd\u6570\u4f53\u5199\u6210\u4e00\u4e2a\u5b57\u7b26\u4e32\u5e38\u91cf\u3002\u5bf9\u4e8e\u5b57\u7b26\u4e32\u5e38\u91cf\uff0c\u901a\u5e38\u4f7f\u7528\u7f8e\u5143\u5f15\u7528\u6700\u65b9\u4fbf\uff08\u89c1<a class=\"xref\" href=\"/docs/19/sql-syntax-lexical.html#SQL-SYNTAX-DOLLAR-QUOTING\" title=\"4.1.2.4.\u00a0\u7f8e\u5143\u5f15\u7528\u7684\u5b57\u7b26\u4e32\u5e38\u91cf\">\u7b2c\u00a04.1.2.4\u00a0\u8282</a>\uff09\u3002\u5982\u679c\u4f60\u9009\u62e9\u4f7f\u7528\u5e38\u89c4\u7684\u5355\u5f15\u53f7\u5b57\u7b26\u4e32\u5e38\u91cf\u8bed\u6cd5\uff0c\u90a3\u4e48\u5fc5\u987b\u5728\u51fd\u6570\u4f53\u4e2d\u5c06\u5355\u5f15\u53f7\uff08<code class=\"literal\">'</code>\uff09\u548c\u53cd\u659c\u7ebf\uff08<code class=\"literal\">\\</code>\uff09\u5199\u6210\u53cc\u4efd\uff08\u5047\u5b9a\u4f7f\u7528\u8f6c\u4e49\u5b57\u7b26\u4e32\u8bed\u6cd5\uff0c\u89c1<a class=\"xref\" href=\"/docs/19/sql-syntax-lexical.html#SQL-SYNTAX-STRINGS\" title=\"4.1.2.1.\u00a0\u5b57\u7b26\u4e32\u5e38\u91cf\">\u7b2c\u00a04.1.2.1\u00a0\u8282</a>\uff09\u3002</p>\n<div class=\"sect2\" id=\"XFUNC-SQL-FUNCTION-ARGUMENTS\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/19/xfunc-sql.html#XFUNC-SQL-FUNCTION-ARGUMENTS\">36.5.1. <acronym class=\"acronym\">SQL</acronym>\u51fd\u6570\u7684\u53c2\u6570</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\">\u4e00\u4e2a SQL \u51fd\u6570\u7684\u53c2\u6570\u53ef\u4ee5\u5728\u51fd\u6570\u4f53\u4e2d\u7528\u540d\u79f0\u6216\u7f16\u53f7\u5f15\u7528\u3002\u4e0b\u9762\u4f1a\u6709\u4e24\u79cd\u65b9\u6cd5\u7684\u793a\u4f8b\u3002</p>\n<p lang=\"zh\">\u8981\u4f7f\u7528\u4e00\u4e2a\u540d\u79f0\uff0c\u5c06\u51fd\u6570\u53c2\u6570\u58f0\u660e\u4e3a\u5e26\u6709\u4e00\u4e2a\u540d\u79f0\uff0c\u7136\u540e\u5728\u51fd\u6570\u4f53\u4e2d\u53ea\u5199\u8be5\u540d\u79f0\u3002\u5982\u679c\u53c2\u6570\u540d\u79f0\u4e0e\u51fd\u6570\u5185\u5f53\u524d SQL \u547d\u4ee4\u4e2d\u7684\u4efb\u610f\u5217\u540d\u76f8\u540c\uff0c\u5217\u540d\u5c06\u4f18\u5148\u3002\u5982\u679c\u4e0d\u60f3\u8fd9\u6837\uff0c\u53ef\u4ee5\u7528\u51fd\u6570\u672c\u8eab\u7684\u540d\u79f0\u6765\u9650\u5b9a\u53c2\u6570\u540d\uff0c\u4e5f\u5c31\u662f<code class=\"literal\"><em class=\"replaceable\"><code>function_name</code></em>.<em class=\"replaceable\"><code>argument_name</code></em></code>\uff08\u5982\u679c\u8fd9\u4f1a\u4e0e\u4e00\u4e2a\u88ab\u9650\u5b9a\u7684\u5217\u540d\u51b2\u7a81\uff0c\u7167\u4f8b\u8fd8\u662f\u5217\u540d\u8d62\u5f97\u4f18\u5148\u3002\u4f60\u53ef\u4ee5\u901a\u8fc7\u4e3a SQL \u547d\u4ee4\u4e2d\u7684\u8868\u9009\u62e9\u4e00\u4e2a\u4e0d\u540c\u7684\u522b\u540d\u6765\u907f\u514d\u8fd9\u79cd\u6df7\u6dc6\uff09\u3002</p>\n<p lang=\"zh\">\u5728\u66f4\u65e7\u7684\u6570\u5b57\u65b9\u6cd5\u4e2d\uff0c\u53c2\u6570\u53ef\u4ee5\u7528\u8bed\u6cd5<code class=\"literal\">$<em class=\"replaceable\"><code>n</code></em></code>\u5f15\u7528\uff1a<code class=\"literal\">$1</code>\u6307\u7684\u662f\u7b2c\u4e00\u4e2a\u8f93\u5165\u53c2\u6570\uff0c<code class=\"literal\">$2</code>\u6307\u7684\u662f\u7b2c\u4e8c\u4e2a\uff0c\u4ee5\u6b64\u7c7b\u63a8\u3002\u4e0d\u7ba1\u7279\u5b9a\u7684\u53c2\u6570\u662f\u5426\u4f7f\u7528\u540d\u79f0\u58f0\u660e\uff0c\u8fd9\u79cd\u65b9\u6cd5\u90fd\u6709\u6548\u3002</p>\n<p lang=\"zh\">\u5982\u679c\u4e00\u4e2a\u53c2\u6570\u662f\u4e00\u79cd\u590d\u5408\u7c7b\u578b\uff0c\u90a3\u4e48\u70b9\u53f7\u8bb0\u6cd5\uff08\u5982 <code class=\"literal\"><em class=\"replaceable\"><code>argname</code></em>.<em class=\"replaceable\"><code>fieldname</code></em></code> \u6216<code class=\"literal\">$1.<em class=\"replaceable\"><code>fieldname</code></em></code>\uff09\u4e5f\u53ef\u4ee5\u88ab\u7528\u6765\u8bbf\u95ee\u8be5\u53c2\u6570\u7684\u5c5e\u6027\u3002\u540c\u6837\uff0c\u4f60\u53ef\u80fd\u9700\u8981\u7528\u51fd\u6570\u7684\u540d\u79f0\u6765\u9650\u5b9a\u53c2\u6570\u7684\u540d\u79f0\u4ee5\u907f\u514d\u6b67\u4e49\u3002</p>\n<p lang=\"zh\">SQL \u51fd\u6570\u53c2\u6570\u53ea\u80fd\u88ab\u7528\u4f5c\u6570\u636e\u503c\u800c\u4e0d\u80fd\u4f5c\u4e3a\u6807\u8bc6\u7b26\u3002\u4f8b\u5982\u8fd9\u662f\u5408\u7406\u7684\uff1a</p>\n<pre class=\"programlisting\">INSERT INTO mytable VALUES ($1);\n</pre>\n<p lang=\"zh\">\u4f46\u8fd9\u6837\u5c31\u4e0d\u884c\uff1a</p>\n<pre class=\"programlisting\">INSERT INTO $1 VALUES (42);\n</pre>\n<div class=\"note\">\n<h3 class=\"title\" lang=\"zh\">\u6ce8\u610f</h3>\n<p lang=\"zh\">PostgreSQL 9.2 \u5f00\u59cb\u652f\u6301\u901a\u8fc7\u540d\u79f0\u5f15\u7528 SQL \u51fd\u6570\u53c2\u6570\u3002\u9700\u8981\u7528\u4e8e\u66f4\u65e9\u7248\u672c\u670d\u52a1\u5668\u7684\u51fd\u6570\u5fc5\u987b\u4f7f\u7528 $n \u8bb0\u6cd5\u3002</p>\n</div>\n</div>\n<div class=\"sect2\" id=\"XFUNC-SQL-BASE-FUNCTIONS\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/19/xfunc-sql.html#XFUNC-SQL-BASE-FUNCTIONS\">36.5.2. \u57fa\u7840\u7c7b\u578b\u4e0a\u7684<acronym class=\"acronym\">SQL</acronym>\u51fd\u6570</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\">\u6700\u7b80\u5355\u7684 <acronym class=\"acronym\">SQL</acronym> \u51fd\u6570\u6ca1\u6709\u53c2\u6570\uff0c\u53ea\u662f\u8fd4\u56de\u4e00\u4e2a\u57fa\u7840\u7c7b\u578b\uff0c\u4f8b\u5982 <code class=\"type\">integer</code>\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION one() RETURNS integer AS $$\n    SELECT 1 AS result;\n$$ LANGUAGE SQL;\n\n-- Alternative syntax for string literal:\nCREATE FUNCTION one() RETURNS integer AS '\n    SELECT 1 AS result;\n' LANGUAGE SQL;\n\nSELECT one();\n\n one\n-----\n   1\n</pre>\n<p lang=\"zh\">\u6ce8\u610f\u6211\u4eec\u4e3a\u8be5\u51fd\u6570\u7684\u7ed3\u679c\u5728\u51fd\u6570\u4f53\u5185\u5b9a\u4e49\u4e86\u4e00\u4e2a\u5217\u522b\u540d\uff08\u540d\u4e3a<code class=\"literal\">result</code>\uff09\uff0c\u4f46\u662f\u8fd9\u4e2a\u5217\u522b\u540d\u5728\u51fd\u6570\u4ee5\u5916\u662f\u4e0d\u53ef\u89c1\u7684\u3002\u56e0\u6b64\uff0c\u7ed3\u679c\u88ab\u6807\u8bb0\u4e3a<code class=\"literal\">one</code>\u800c\u4e0d\u662f<code class=\"literal\">result</code>\u3002</p>\n<p lang=\"zh\">\u5b9a\u4e49\u63a5\u53d7\u57fa\u7840\u7c7b\u578b\u53c2\u6570\u7684 <acronym class=\"acronym\">SQL</acronym> \u51fd\u6570\u4e5f\u51e0\u4e4e\u540c\u6837\u5bb9\u6613\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION add_em(x integer, y integer) RETURNS integer AS $$\n    SELECT x + y;\n$$ LANGUAGE SQL;\n\nSELECT add_em(1, 2) AS answer;\n\n answer\n--------\n      3\n</pre>\n<p lang=\"zh\">\u6216\u8005\uff0c\u6211\u4eec\u4e5f\u53ef\u4ee5\u4e0d\u7528\u53c2\u6570\u540d\uff0c\u800c\u6539\u7528\u6570\u5b57\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION add_em(integer, integer) RETURNS integer AS $$\n    SELECT $1 + $2;\n$$ LANGUAGE SQL;\n\nSELECT add_em(1, 2) AS answer;\n\n answer\n--------\n      3\n</pre>\n<p lang=\"zh\">\u4e0b\u9762\u662f\u4e00\u4e2a\u66f4\u6709\u7528\u7684\u51fd\u6570\uff0c\u5b83\u53ef\u4ee5\u7528\u6765\u4ece\u94f6\u884c\u8d26\u6237\u4e2d\u6263\u6b3e\uff1a</p>\n<pre class=\"programlisting\">CREATE FUNCTION tf1 (accountno integer, debit numeric) RETURNS numeric AS $$\n    UPDATE bank\n        SET balance = balance - debit\n        WHERE accountno = tf1.accountno;\n    SELECT 1;\n$$ LANGUAGE SQL;\n</pre>\n<p lang=\"zh\">\u7528\u6237\u53ef\u4ee5\u8fd9\u6837\u6267\u884c\u8be5\u51fd\u6570\uff0c\u4ece 17 \u53f7\u8d26\u6237\u4e2d\u6263\u9664 $100.00\uff1a</p>\n<pre class=\"programlisting\">SELECT tf1(17, 100.0);\n</pre>\n<p lang=\"zh\">\u5728\u8fd9\u4e2a\u793a\u4f8b\u4e2d\uff0c\u6211\u4eec\u4e3a\u7b2c\u4e00\u4e2a\u53c2\u6570\u9009\u62e9\u4e86\u540d\u79f0<code class=\"literal\">accountno</code>\uff0c\u4f46\u662f\u8fd9\u548c\u8868<code class=\"structname\">bank</code>\u4e2d\u7684\u4e00\u4e2a\u5217\u540d\u76f8\u540c\u3002\u5728<code class=\"command\">UPDATE</code>\u547d\u4ee4\u4e2d\uff0c<code class=\"literal\">accountno</code>\u5f15\u7528\u5217<code class=\"structfield\">bank.accountno</code>\uff0c\u56e0\u6b64 <code class=\"literal\">tf1.accountno</code>\u5fc5\u987b\u88ab\u7528\u6765\u5f15\u7528\u8be5\u53c2\u6570\u3002\u6211\u4eec\u5f53\u7136\u53ef\u4ee5\u901a\u8fc7\u4e3a\u8be5\u53c2\u6570\u4f7f\u7528\u4e00\u4e2a\u4e0d\u540c\u7684\u540d\u79f0\u6765\u907f\u514d\u8fd9\u6837\u7684\u95ee\u9898\u3002</p>\n<p lang=\"zh\">\u5b9e\u9645\u4e0a\u6211\u4eec\u53ef\u80fd\u559c\u6b22\u4ece\u8be5\u51fd\u6570\u5f97\u5230\u4e00\u4e2a\u66f4\u6709\u7528\u7684\u7ed3\u679c\u800c\u4e0d\u662f\u4e00\u4e2a\u5e38\u6570 1\uff0c\u56e0\u6b64\u4e00\u4e2a\u66f4\u53ef\u80fd\u7684\u5b9a\u4e49\u662f\uff1a</p>\n<pre class=\"programlisting\">CREATE FUNCTION tf1 (accountno integer, debit numeric) RETURNS numeric AS $$\n    UPDATE bank\n        SET balance = balance - debit\n        WHERE accountno = tf1.accountno;\n    SELECT balance FROM bank WHERE accountno = tf1.accountno;\n$$ LANGUAGE SQL;\n</pre>\n<p lang=\"zh\">\u5b83\u4f1a\u8c03\u6574\u4f59\u989d\u5e76\u4e14\u8fd4\u56de\u65b0\u7684\u4f59\u989d\u3002\u540c\u6837\u7684\u4e8b\u60c5\u4e5f\u53ef\u4ee5\u7528\u4e00\u4e2a\u4f7f\u7528<code class=\"literal\">RETURNING</code>\u7684\u547d\u4ee4\u5b9e\u73b0\uff1a</p>\n<pre class=\"programlisting\">CREATE FUNCTION tf1 (accountno integer, debit numeric) RETURNS numeric AS $$\n    UPDATE bank\n        SET balance = balance - debit\n        WHERE accountno = tf1.accountno\n    RETURNING balance;\n$$ LANGUAGE SQL;\n</pre>\n<p lang=\"zh\">\u5982\u679c\u5728<code class=\"literal\">SELECT</code>\u6216<code class=\"literal\">RETURNING</code>\u5b50\u53e5\u4e2d\uff0c<acronym class=\"acronym\">SQL</acronym>\u51fd\u6570\u7684\u6700\u7ec8\u8fd4\u56de\u503c\u7c7b\u578b\u4e0e\u51fd\u6570\u58f0\u660e\u7684\u7ed3\u679c\u7c7b\u578b\u4e0d\u5b8c\u5168\u5339\u914d\uff0c\u5982\u679c\u53ef\u4ee5\u4f7f\u7528\u9690\u5f0f\u6216\u8d4b\u503c\u8f6c\u6362\uff0c<span class=\"productname\">PostgreSQL</span>\u5c06\u81ea\u52a8\u5c06\u8be5\u503c\u8f6c\u6362\u4e3a\u6240\u9700\u7c7b\u578b\u3002\u5426\u5219\uff0c\u4f60\u5fc5\u987b\u5199\u51fa\u663e\u5f0f\u7c7b\u578b\u8f6c\u6362\u3002\u4f8b\u5982\uff0c\u5047\u8bbe\u6211\u4eec\u5e0c\u671b\u524d\u9762\u7684<code class=\"function\">add_em</code>\u51fd\u6570\u8fd4\u56de<code class=\"type\">float8</code>\u7c7b\u578b\u3002\u53ea\u9700\u7f16\u5199</p>\n<pre class=\"programlisting\">CREATE FUNCTION add_em(integer, integer) RETURNS float8 AS $$\n    SELECT $1 + $2;\n$$ LANGUAGE SQL;\n</pre>\n<p lang=\"zh\">\u56e0\u4e3a<code class=\"type\">integer</code>\u7684\u548c\u53ef\u4ee5\u9690\u5f0f\u8f6c\u6362\u4e3a<code class=\"type\">float8</code>\u3002\uff08\u6709\u5173\u8f6c\u6362\u7684\u66f4\u591a\u4fe1\u606f\uff0c\u8bf7\u53c2\u89c1<a class=\"xref\" href=\"/docs/19/typeconv.html\" title=\"\u7b2c\u00a010\u00a0\u7ae0\u00a0\u7c7b\u578b\u8f6c\u6362\">\u7b2c\u00a010\u00a0\u7ae0</a>\u6216<a class=\"xref\" href=\"/docs/19/sql-createcast.html\" title=\"CREATE CAST\"><span class=\"refentrytitle\">CREATE CAST</span></a>\u3002\uff09</p>\n</div>\n<div class=\"sect2\" id=\"XFUNC-SQL-COMPOSITE-FUNCTIONS\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/19/xfunc-sql.html#XFUNC-SQL-COMPOSITE-FUNCTIONS\">36.5.3. \u590d\u5408\u7c7b\u578b\u4e0a\u7684<acronym class=\"acronym\">SQL</acronym>\u51fd\u6570</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\">\u7f16\u5199\u63a5\u53d7\u590d\u5408\u7c7b\u578b\u53c2\u6570\u7684\u51fd\u6570\u65f6\uff0c\u6211\u4eec\u4e0d\u4ec5\u5fc5\u987b\u6307\u5b9a\u8981\u7528\u54ea\u4e2a\u53c2\u6570\uff0c\u8fd8\u5fc5\u987b\u6307\u5b9a\u8be5\u53c2\u6570\u7684\u54ea\u4e2a\u5c5e\u6027\uff08\u5b57\u6bb5\uff09\u3002\u4f8b\u5982\uff0c\u5047\u8bbe <code class=\"type\">emp</code> \u662f\u4e00\u4e2a\u5305\u542b\u96c7\u5458\u6570\u636e\u7684\u8868\uff0c\u56e0\u6b64\u5b83\u4e5f\u662f\u8be5\u8868\u6bcf\u4e00\u884c\u5bf9\u5e94\u7684\u590d\u5408\u7c7b\u578b\u540d\u79f0\u3002\u4e0b\u9762\u7684\u51fd\u6570 <code class=\"function\">double_salary</code> \u7528\u6765\u8ba1\u7b97\u67d0\u4eba\u7684\u5de5\u8d44\u7ffb\u500d\u540e\u4f1a\u662f\u591a\u5c11\uff1a</p>\n<pre class=\"screen\">CREATE TABLE emp (\n    name        text,\n    salary      numeric,\n    age         integer,\n    cubicle     point\n);\n\nINSERT INTO emp VALUES ('Bill', 4200, 45, '(2,1)');\n\nCREATE FUNCTION double_salary(emp) RETURNS numeric AS $$\n    SELECT $1.salary * 2 AS salary;\n$$ LANGUAGE SQL;\n\nSELECT name, double_salary(emp.*) AS dream\n    FROM emp\n    WHERE emp.cubicle ~= point '(2,1)';\n\n name | dream\n------+-------\n Bill |  8400\n</pre>\n<p lang=\"zh\">\u6ce8\u610f\u8fd9\u91cc\u7528 <code class=\"literal\">$1.salary</code> \u8bed\u6cd5\u6765\u9009\u53d6\u53c2\u6570\u884c\u503c\u4e2d\u7684\u4e00\u4e2a\u5b57\u6bb5\u3002\u8fd8\u8981\u6ce8\u610f\uff0c\u8c03\u7528\u65f6\u7684 <code class=\"command\">SELECT</code> \u547d\u4ee4\u4f7f\u7528 <em class=\"replaceable\"><code>table_name</code></em><code class=\"literal\">.*</code> \u5c06\u8868\u7684\u5f53\u524d\u6574\u884c\u53d6\u4f5c\u4e00\u4e2a\u590d\u5408\u503c\u3002\u8be5\u8868\u884c\u4e5f\u53ef\u4ee5\u4ec5\u7528\u8868\u540d\u6765\u5f15\u7528\uff1a</p>\n<pre class=\"screen\">SELECT name, double_salary(emp) AS dream\n    FROM emp\n    WHERE emp.cubicle ~= point '(2,1)';\n</pre>\n<p lang=\"zh\">\u4f46\u8fd9\u79cd\u7528\u6cd5\u5df2\u88ab\u5f03\u7528\uff0c\u56e0\u4e3a\u5b83\u5f88\u5bb9\u6613\u8ba9\u4eba\u6df7\u6dc6\uff08\u5173\u4e8e\u8868\u884c\u590d\u5408\u503c\u8fd9\u4e24\u79cd\u8bb0\u6cd5\u7684\u66f4\u591a\u7ec6\u8282\uff0c\u89c1<a class=\"xref\" href=\"/docs/19/rowtypes.html#ROWTYPES-USAGE\" title=\"8.16.5.\u00a0\u5728\u67e5\u8be2\u4e2d\u4f7f\u7528\u590d\u5408\u7c7b\u578b\">\u7b2c\u00a08.16.5\u00a0\u8282</a>\uff09\u3002</p>\n<p lang=\"zh\">\u6709\u65f6\u5019\u5373\u65f6\u6784\u9020\u4e00\u4e2a\u590d\u5408\u53c2\u6570\u503c\u4f1a\u5f88\u65b9\u4fbf\u3002\u8fd9\u53ef\u4ee5\u7528<code class=\"literal\">ROW</code>\u6784\u9020\u5668\u5b8c\u6210\u3002\u4f8b\u5982\uff0c\u6211\u4eec\u53ef\u4ee5\u8c03\u6574\u88ab\u4f20\u9012\u7ed9\u51fd\u6570\u7684\u6570\u636e\uff1a</p>\n<pre class=\"screen\">SELECT name, double_salary(ROW(name, salary*1.1, age, cubicle)) AS dream\n    FROM emp;\n</pre>\n<p lang=\"zh\">\u4e5f\u53ef\u4ee5\u6784\u5efa\u4e00\u4e2a\u8fd4\u56de\u590d\u5408\u7c7b\u578b\u7684\u51fd\u6570\u3002\u8fd9\u662f\u4e00\u4e2a\u8fd4\u56de\u5355\u4e00<code class=\"type\">emp</code>\u884c\u7684\u51fd\u6570\u793a\u4f8b\uff1a</p>\n<pre class=\"programlisting\">CREATE FUNCTION new_emp() RETURNS emp AS $$\n    SELECT text 'None' AS name,\n        1000.0 AS salary,\n        25 AS age,\n        point '(2,2)' AS cubicle;\n$$ LANGUAGE SQL;\n</pre>\n<p lang=\"zh\">\u5728\u8fd9\u4e2a\u793a\u4f8b\u4e2d\uff0c\u6211\u4eec\u4e3a\u6bcf\u4e00\u4e2a\u5c5e\u6027\u6307\u5b9a\u4e86\u4e00\u4e2a\u5e38\u91cf\u503c\uff0c\u4f46\u662f\u53ef\u4ee5\u7528\u4efb\u4f55\u8ba1\u7b97\u6765\u66ff\u6362\u8fd9\u4e9b\u5e38\u91cf\u3002</p>\n<p lang=\"zh\">\u5b9a\u4e49\u8be5\u51fd\u6570\u65f6\u6709\u4e24\u70b9\u91cd\u8981\u6ce8\u610f\u4e8b\u9879\uff1a</p>\n<div class=\"itemizedlist\">\n<ul class=\"itemizedlist\">\n<li class=\"listitem\" lang=\"zh\">\n<p>\u67e5\u8be2\u4e2d\u7684\u9009\u62e9\u5217\u8868\u987a\u5e8f\u5fc5\u987b\u4e0e\u5217\u5728\u590d\u5408\u7c7b\u578b\u4e2d\u51fa\u73b0\u7684\u987a\u5e8f\u5b8c\u5168\u76f8\u540c\u3002\uff08\u7cfb\u7edf\u4e0d\u8003\u8651\u50cf\u4e0a\u9762\u8fd9\u6837\u6307\u5b9a\u7684\u5217\u540d\u3002\uff09</p>\n</li>\n<li class=\"listitem\" lang=\"zh\">\n<p>\u6211\u4eec\u5fc5\u987b\u786e\u4fdd\u6bcf\u4e2a\u8868\u8fbe\u5f0f\u7684\u7c7b\u578b\u90fd\u53ef\u4ee5\u8f6c\u6362\u4e3a\u590d\u5408\u7c7b\u578b\u7684\u76f8\u5e94\u5217\u7684\u7c7b\u578b\u3002\u5426\u5219\u6211\u4eec\u4f1a\u5f97\u5230\u8fd9\u6837\u7684\u9519\u8bef\uff1a</p>\n<pre class=\"screen\">\n<code class=\"computeroutput\">\nERROR:  return type mismatch in function declared to return emp\nDETAIL:  Final statement returns text instead of point at column 4.\n</code>\n</pre>\n<p>\u4e0e\u57fa\u7840\u7c7b\u578b\u7684\u60c5\u51b5\u4e00\u6837\uff0c\u7cfb\u7edf\u4e0d\u4f1a\u81ea\u52a8\u63d2\u5165\u663e\u5f0f\u8f6c\u6362\uff0c\u53ea\u4f1a\u63d2\u5165\u9690\u5f0f\u6216\u8d4b\u503c\u8f6c\u6362\u3002</p>\n</li>\n</ul>\n</div>\n<p lang=\"zh\">\u5b9a\u4e49\u540c\u6837\u7684\u51fd\u6570\u7684\u4e00\u79cd\u4e0d\u540c\u7684\u65b9\u6cd5\u662f\uff1a</p>\n<pre class=\"programlisting\">CREATE FUNCTION new_emp() RETURNS emp AS $$\n    SELECT ROW('None', 1000.0, 25, '(2,2)')::emp;\n$$ LANGUAGE SQL;\n</pre>\n<p lang=\"zh\">\u8fd9\u91cc\u6211\u4eec\u5199\u4e86\u4e00\u4e2a\u53ea\u8fd4\u56de\u5355\u5217\u3001\u4e14\u8be5\u5217\u5177\u6709\u6b63\u786e\u590d\u5408\u7c7b\u578b\u7684 <code class=\"command\">SELECT</code>\u3002\u5728\u8fd9\u79cd\u573a\u666f\u4e0b\uff0c\u8fd9\u6837\u5199\u5e76\u4e0d\u89c1\u5f97\u66f4\u597d\uff0c\u4f46\u5728\u67d0\u4e9b\u60c5\u51b5\u4e0b\u4f1a\u5f88\u65b9\u4fbf \u2014 \u4f8b\u5982\uff0c\u9700\u8981\u901a\u8fc7\u8c03\u7528\u53e6\u4e00\u4e2a\u8fd4\u56de\u76ee\u6807\u590d\u5408\u503c\u7684\u51fd\u6570\u6765\u8ba1\u7b97\u7ed3\u679c\u65f6\u3002\u8fd8\u6709\u4e00\u79cd\u60c5\u51b5\u662f\uff0c\u5982\u679c\u6211\u4eec\u8981\u7f16\u5199\u7684\u51fd\u6570\u8fd4\u56de\u7684\u662f\u57fa\u4e8e\u590d\u5408\u7c7b\u578b\u7684\u57df\uff0c\u800c\u4e0d\u662f\u666e\u901a\u590d\u5408\u7c7b\u578b\uff0c\u90a3\u4e48\u5c31\u5fc5\u987b\u5199\u6210\u8fd4\u56de\u5355\u5217\u7684\u5f62\u5f0f\uff0c\u56e0\u4e3a\u6ca1\u6709\u529e\u6cd5\u8ba9\u6574\u884c\u7ed3\u679c\u53d1\u751f\u6240\u9700\u7684\u5f3a\u5236\u8f6c\u6362\u3002</p>\n<p lang=\"zh\">\u6211\u4eec\u65e2\u53ef\u4ee5\u628a\u8fd9\u4e2a\u51fd\u6570\u76f4\u63a5\u5f53\u4f5c\u503c\u8868\u8fbe\u5f0f\u8c03\u7528\uff1a</p>\n<pre class=\"screen\">SELECT new_emp();\n\n         new_emp\n--------------------------\n (None,1000.0,25,\"(2,2)\")\n</pre>\n<p lang=\"zh\">\u4e5f\u53ef\u4ee5\u628a\u5b83\u5f53\u4f5c\u8868\u51fd\u6570\u6765\u8c03\u7528\uff1a</p>\n<pre class=\"screen\">SELECT * FROM new_emp();\n\n name | salary | age | cubicle\n------+--------+-----+---------\n None | 1000.0 |  25 | (2,2)\n</pre>\n<p lang=\"zh\">\u7b2c\u4e8c\u79cd\u65b9\u5f0f\u4f1a\u5728<a class=\"xref\" href=\"/docs/19/xfunc-sql.html#XFUNC-SQL-TABLE-FUNCTIONS\" title=\"36.5.8.\u00a0SQL \u51fd\u6570\u4f5c\u4e3a\u8868\u6765\u6e90\">\u7b2c\u00a036.5.8\u00a0\u8282</a>\u4e2d\u8fdb\u4e00\u6b65\u8bf4\u660e\u3002</p>\n<p lang=\"zh\">\u5f53\u4f60\u4f7f\u7528\u8fd4\u56de\u590d\u5408\u7c7b\u578b\u7684\u51fd\u6570\u65f6\uff0c\u53ef\u80fd\u53ea\u9700\u8981\u53d6\u5176\u7ed3\u679c\u4e2d\u7684\u4e00\u4e2a\u5b57\u6bb5\uff08\u5c5e\u6027\uff09\u3002\u53ef\u4ee5\u4f7f\u7528\u4e0b\u9762\u8fd9\u6837\u7684\u8bed\u6cd5\uff1a</p>\n<pre class=\"screen\">SELECT (new_emp()).name;\n\n name\n------\n None\n</pre>\n<p lang=\"zh\">\u8fd9\u91cc\u9700\u8981\u989d\u5916\u7684\u62ec\u53f7\uff0c\u4ee5\u514d\u89e3\u6790\u5668\u4ea7\u751f\u6b67\u4e49\u3002\u5982\u679c\u4e0d\u52a0\u62ec\u53f7\uff0c\u7ed3\u679c\u4f1a\u662f\u8fd9\u6837\uff1a</p>\n<pre class=\"screen\">SELECT new_emp().name;\nERROR:  syntax error at or near \".\"\nLINE 1: SELECT new_emp().name;\n                        ^\n</pre>\n<p lang=\"zh\">\u53e6\u4e00\u79cd\u9009\u62e9\u662f\u4f7f\u7528\u51fd\u6570\u8bb0\u6cd5\u6765\u63d0\u53d6\u5c5e\u6027\uff1a</p>\n<pre class=\"screen\">SELECT name(new_emp());\n\n name\n------\n None\n</pre>\n<p lang=\"zh\">\u5982<a class=\"xref\" href=\"/docs/19/rowtypes.html#ROWTYPES-USAGE\" title=\"8.16.5.\u00a0\u5728\u67e5\u8be2\u4e2d\u4f7f\u7528\u590d\u5408\u7c7b\u578b\">\u7b2c\u00a08.16.5\u00a0\u8282</a>\u6240\u8ff0\uff0c\u5b57\u6bb5\u8bb0\u6cd5\u548c\u51fd\u6570\u8bb0\u6cd5\u662f\u7b49\u4ef7\u7684\u3002</p>\n<p lang=\"zh\">\u53e6\u4e00\u79cd\u4f7f\u7528\u51fd\u6570\u8fd4\u56de\u590d\u5408\u7c7b\u578b\u7684\u65b9\u6cd5\u662f\u5c06\u7ed3\u679c\u4f20\u9012\u7ed9\u53e6\u4e00\u4e2a\u63a5\u53d7\u6b63\u786e\u884c\u7c7b\u578b\u4f5c\u4e3a\u8f93\u5165\u7684\u51fd\u6570\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION getname(emp) RETURNS text AS $$\n    SELECT $1.name;\n$$ LANGUAGE SQL;\n\nSELECT getname(new_emp());\n getname\n---------\n None\n(1 row)\n</pre>\n</div>\n<div class=\"sect2\" id=\"XFUNC-OUTPUT-PARAMETERS\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/19/xfunc-sql.html#XFUNC-OUTPUT-PARAMETERS\">36.5.4. \u5e26\u6709\u8f93\u51fa\u53c2\u6570\u7684<acronym class=\"acronym\">SQL</acronym>\u51fd\u6570</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\">\u63cf\u8ff0\u51fd\u6570\u7ed3\u679c\u7684\u53e6\u4e00\u79cd\u65b9\u6cd5\u662f\u4f7f\u7528<em class=\"firstterm\">\u8f93\u51fa\u53c2\u6570</em>\uff0c\u4f8b\u5982\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION add_em (IN x int, IN y int, OUT sum int)\nAS 'SELECT x + y'\nLANGUAGE SQL;\n\nSELECT add_em(3,7);\n add_em\n--------\n     10\n(1 row)\n</pre>\n<p lang=\"zh\">\u8fd9\u4e0e<a class=\"xref\" href=\"/docs/19/xfunc-sql.html#XFUNC-SQL-BASE-FUNCTIONS\" title=\"36.5.2.\u00a0\u57fa\u7840\u7c7b\u578b\u4e0a\u7684SQL\u51fd\u6570\">\u7b2c\u00a036.5.2\u00a0\u8282</a>\u4e2d\u5c55\u793a\u7684 <code class=\"literal\">add_em</code> \u7248\u672c\u672c\u8d28\u4e0a\u5e76\u65e0\u4e0d\u540c\u3002\u8f93\u51fa\u53c2\u6570\u7684\u771f\u6b63\u4ef7\u503c\u5728\u4e8e\uff0c\u5b83\u4eec\u4e3a\u5b9a\u4e49\u8fd4\u56de\u591a\u5217\u7684\u51fd\u6570\u63d0\u4f9b\u4e86\u4e00\u79cd\u65b9\u4fbf\u7684\u65b9\u6cd5\u3002\u4f8b\u5982\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION sum_n_product (x int, y int, OUT sum int, OUT product int)\nAS 'SELECT x + y, x * y'\nLANGUAGE SQL;\n\n SELECT * FROM sum_n_product(11,42);\n sum | product\n-----+---------\n  53 |     462\n(1 row)\n</pre>\n<p lang=\"zh\">\u8fd9\u91cc\u672c\u8d28\u4e0a\u53d1\u751f\u7684\u4e8b\u60c5\u662f\uff1a\u6211\u4eec\u4e3a\u8be5\u51fd\u6570\u7684\u7ed3\u679c\u521b\u5efa\u4e86\u4e00\u4e2a\u533f\u540d\u590d\u5408\u7c7b\u578b\u3002\u4e0a\u9762\u7684\u793a\u4f8b\u4e0e\u4e0b\u9762\u8fd9\u79cd\u5199\u6cd5\u7684\u6700\u7ec8\u6548\u679c\u76f8\u540c\uff1a</p>\n<pre class=\"screen\">CREATE TYPE sum_prod AS (sum int, product int);\n\nCREATE FUNCTION sum_n_product (int, int) RETURNS sum_prod\nAS 'SELECT $1 + $2, $1 * $2'\nLANGUAGE SQL;\n</pre>\n<p lang=\"zh\">\u4f46\u901a\u5e38\u4e0d\u5fc5\u989d\u5916\u5b9a\u4e49\u4e00\u4e2a\u72ec\u7acb\u7684\u590d\u5408\u7c7b\u578b\u4f1a\u66f4\u65b9\u4fbf\u3002\u6ce8\u610f\uff0c\u9644\u5728\u8f93\u51fa\u53c2\u6570\u4e0a\u7684\u540d\u79f0\u5e76\u975e\u53ea\u662f\u88c5\u9970\uff0c\u5b83\u4eec\u51b3\u5b9a\u4e86\u8fd9\u4e2a\u533f\u540d\u590d\u5408\u7c7b\u578b\u7684\u5217\u540d\u3002\uff08\u5982\u679c\u7701\u7565\u8f93\u51fa\u53c2\u6570\u540d\u79f0\uff0c\u7cfb\u7edf\u4f1a\u81ea\u884c\u9009\u62e9\u4e00\u4e2a\u540d\u79f0\u3002\uff09</p>\n<p lang=\"zh\">\u5728\u4ece SQL \u8c03\u7528\u8fd9\u6837\u4e00\u4e2a\u51fd\u6570\u65f6\uff0c\u8f93\u51fa\u53c2\u6570\u4e0d\u4f1a\u88ab\u5305\u62ec\u5728\u8c03\u7528\u53c2\u6570\u5217\u8868\u4e2d\u3002\u8fd9\u662f\u56e0\u4e3a<span class=\"productname\">PostgreSQL</span>\u53ea\u8003\u8651\u8f93\u5165\u53c2\u6570\u6765\u5b9a\u4e49\u51fd\u6570\u7684\u8c03\u7528\u7b7e\u540d\u3002\u8fd9\u4e5f\u610f\u5473\u7740\u5728\u4e3a\u8bf8\u5982\u5220\u9664\u51fd\u6570\u7b49\u76ee\u7684\u5f15\u7528\u8be5\u51fd\u6570\u65f6\u53ea\u6709\u8f93\u5165\u53c2\u6570\u6709\u5173\u7cfb\u3002\u6211\u4eec\u53ef\u4ee5\u7528\u4e0b\u9762\u7684\u547d\u4ee4\u4e4b\u4e00\u5220\u9664\u4e0a\u8ff0\u51fd\u6570</p>\n<pre class=\"screen\">DROP FUNCTION sum_n_product (x int, y int, OUT sum int, OUT product int);\nDROP FUNCTION sum_n_product (int, int);\n</pre>\n<p lang=\"zh\">\u53c2\u6570\u53ef\u4ee5\u88ab\u6807\u8bb0\u4e3a<code class=\"literal\">IN</code>\uff08\u9ed8\u8ba4\uff09\u3001<code class=\"literal\">OUT</code>\u3001<code class=\"literal\">INOUT</code>\u6216\u8005<code class=\"literal\">VARIADIC</code>\u3002\u4e00\u4e2a<code class=\"literal\">INOUT</code>\u53c2\u6570\u65e2\u4f5c\u4e3a\u4e00\u4e2a\u8f93\u5165\u53c2\u6570\uff08\u8c03\u7528\u53c2\u6570\u5217\u8868\u7684\u4e00\u90e8\u5206\uff09\u53c8\u4f5c\u4e3a\u4e00\u4e2a\u8f93\u51fa\u53c2\u6570\uff08\u7ed3\u679c\u8bb0\u5f55\u7c7b\u578b\u7684\u4e00\u90e8\u5206\uff09\u3002<code class=\"literal\">VARIADIC</code>\u53c2\u6570\u662f\u8f93\u5165\u53c2\u6570\uff0c\u4f46\u88ab\u6309\u7167\u4e0b\u6587\u6240\u8ff0\u7279\u6b8a\u5bf9\u5f85\u3002</p>\n</div>\n<div class=\"sect2\" id=\"XFUNC-OUTPUT-PARAMETERS-PROC\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/19/xfunc-sql.html#XFUNC-OUTPUT-PARAMETERS-PROC\">36.5.5. \u5e26\u6709\u8f93\u51fa\u53c2\u6570\u7684<acronym class=\"acronym\">SQL</acronym>\u8fc7\u7a0b</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\">\u8fc7\u7a0b\u4e5f\u652f\u6301\u8f93\u51fa\u53c2\u6570\uff0c\u4f46\u662f\u5b83\u4eec\u7684\u5de5\u4f5c\u65b9\u5f0f\u4e0e\u51fd\u6570\u7565\u6709\u4e0d\u540c\u3002\u5728<code class=\"command\">CALL</code>\u547d\u4ee4\u4e2d\uff0c\u8f93\u51fa\u53c2\u6570\u5fc5\u987b\u5305\u62ec\u5728\u53c2\u6570\u5217\u8868\u4e2d\u3002\u4f8b\u5982\uff0c\u524d\u9762\u7684\u94f6\u884c\u8d26\u6237\u501f\u8bb0\u4f8b\u7a0b\u53ef\u4ee5\u50cf\u8fd9\u6837\u5199\uff1a</p>\n<pre class=\"programlisting\">CREATE PROCEDURE tp1 (accountno integer, debit numeric, OUT new_balance numeric) AS $$\n    UPDATE bank\n        SET balance = balance - debit\n        WHERE accountno = tp1.accountno\n    RETURNING balance;\n$$ LANGUAGE SQL;\n</pre>\n<p lang=\"zh\">\u8981\u8c03\u7528\u8fd9\u4e2a\u4f8b\u7a0b\uff0c\u5fc5\u987b\u5305\u62ec\u5339\u914d<code class=\"literal\">OUT</code>\u53c2\u6570\u7684\u53c2\u6570\u3002\u901a\u5e38\u5199\u6210<code class=\"literal\">NULL</code>\uff1a</p>\n<pre class=\"programlisting\">CALL tp1(17, 100.0, NULL);\n</pre>\n<p lang=\"zh\">\u5982\u679c\u4f60\u5199\u7684\u662f\u5176\u4ed6\u5185\u5bb9\uff0c\u5b83\u5fc5\u987b\u662f\u4e00\u4e2a\u80fd\u591f\u50cf\u8f93\u5165\u53c2\u6570\u90a3\u6837\u88ab\u9690\u5f0f\u5f3a\u5236\u8f6c\u6362\u6210\u8be5\u53c2\u6570\u58f0\u660e\u7c7b\u578b\u7684\u8868\u8fbe\u5f0f\u3002\u4e0d\u8fc7\u8981\u6ce8\u610f\uff0c\u8fd9\u6837\u7684\u8868\u8fbe\u5f0f\u4e0d\u4f1a\u88ab\u6c42\u503c\u3002</p>\n<p lang=\"zh\">\u5f53\u4ece<span class=\"application\">PL/pgSQL</span>\u8c03\u7528\u8fc7\u7a0b\u65f6\uff0c\u4f60\u4e0d\u80fd\u5199<code class=\"literal\">NULL</code>\uff0c\u800c\u5fc5\u987b\u5199\u4e00\u4e2a\u7528\u4e8e\u63a5\u6536\u8fc7\u7a0b\u8f93\u51fa\u7684\u53d8\u91cf\u3002\u8be6\u89c1<a class=\"xref\" href=\"/docs/19/plpgsql-control-structures.html#PLPGSQL-STATEMENTS-CALLING-PROCEDURE\" title=\"41.6.3.\u00a0\u8c03\u7528\u8fc7\u7a0b\">\u7b2c\u00a041.6.3\u00a0\u8282</a>\u3002</p>\n</div>\n<div class=\"sect2\" id=\"XFUNC-SQL-VARIADIC-FUNCTIONS\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/19/xfunc-sql.html#XFUNC-SQL-VARIADIC-FUNCTIONS\">36.5.6. \u5e26\u6709\u53ef\u53d8\u6570\u91cf\u53c2\u6570\u7684<acronym class=\"acronym\">SQL</acronym>\u51fd\u6570</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\"><acronym class=\"acronym\">SQL</acronym> \u51fd\u6570\u53ef\u4ee5\u88ab\u58f0\u660e\u4e3a\u63a5\u53d7\u53ef\u53d8\u6570\u91cf\u7684\u53c2\u6570\uff0c\u53ea\u8981\u6240\u6709<span class=\"quote\">\u201c<span class=\"quote\">\u53ef\u9009</span>\u201d</span>\u53c2\u6570\u90fd\u5c5e\u4e8e\u540c\u4e00\u79cd\u6570\u636e\u7c7b\u578b\u3002\u53ef\u9009\u53c2\u6570\u4f1a\u4ee5\u6570\u7ec4\u5f62\u5f0f\u4f20\u9012\u7ed9\u51fd\u6570\u3002\u5b9a\u4e49\u8fd9\u7c7b\u51fd\u6570\u65f6\uff0c\u9700\u8981\u628a\u6700\u540e\u4e00\u4e2a\u53c2\u6570\u6807\u8bb0\u4e3a <code class=\"literal\">VARIADIC</code>\uff1b\u8be5\u53c2\u6570\u5fc5\u987b\u88ab\u58f0\u660e\u4e3a\u6570\u7ec4\u7c7b\u578b\u3002\u4f8b\u5982\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION mleast(VARIADIC arr numeric[]) RETURNS numeric AS $$\n    SELECT min($1[i]) FROM generate_subscripts($1, 1) g(i);\n$$ LANGUAGE SQL;\n\nSELECT mleast(10, -1, 5, 4.4);\n mleast\n--------\n     -1\n(1 row)\n</pre>\n<p lang=\"zh\">\u5b9e\u9645\u4e0a\uff0c\u4f4d\u4e8e <code class=\"literal\">VARIADIC</code> \u4f4d\u7f6e\u53ca\u4e4b\u540e\u7684\u6240\u6709\u5b9e\u53c2\u90fd\u4f1a\u88ab\u6536\u96c6\u6210\u4e00\u4e2a\u4e00\u7ef4\u6570\u7ec4\uff0c\u5c31\u50cf\u4f60\u5199\u6210\u4e86\uff1a</p>\n<pre class=\"screen\">SELECT mleast(ARRAY[10, -1, 5, 4.4]);    -- doesn't work\n</pre>\n<p lang=\"zh\">\u4e0d\u8fc7\u4f60\u5b9e\u9645\u4e0a\u4e0d\u80fd\u8fd9\u6837\u5199\uff0c\u81f3\u5c11\u5b83\u4e0d\u4f1a\u5339\u914d\u8fd9\u4e2a\u51fd\u6570\u5b9a\u4e49\u3002\u88ab\u6807\u8bb0\u4e3a <code class=\"literal\">VARIADIC</code> \u7684\u53c2\u6570\u5339\u914d\u7684\u662f\u5176\u5143\u7d20\u7c7b\u578b\u51fa\u73b0\u4e00\u6b21\u6216\u591a\u6b21\uff0c\u800c\u4e0d\u662f\u5b83\u81ea\u8eab\u7684\u6570\u7ec4\u7c7b\u578b\u3002</p>\n<p lang=\"zh\">\u6709\u65f6\u5019\uff0c\u80fd\u591f\u628a\u4e00\u4e2a\u5df2\u7ecf\u6784\u9020\u597d\u7684\u6570\u7ec4\u4f20\u7ed9\u53ef\u53d8\u53c2\u6570\u51fd\u6570\u4f1a\u5f88\u6709\u7528\uff0c\u5c24\u5176\u662f\u5f53\u4e00\u4e2a\u53ef\u53d8\u53c2\u6570\u51fd\u6570\u60f3\u628a\u5b83\u7684\u6570\u7ec4\u53c2\u6570\u518d\u4f20\u7ed9\u53e6\u4e00\u4e2a\u51fd\u6570\u65f6\u3002\u6b64\u5916\uff0c\u5728\u5141\u8bb8\u4e0d\u53d7\u4fe1\u4efb\u7528\u6237\u521b\u5efa\u5bf9\u8c61\u7684\u6a21\u5f0f\u4e2d\u8c03\u7528\u53ef\u53d8\u53c2\u6570\u51fd\u6570\u65f6\uff0c\u8fd9\u662f\u552f\u4e00\u5b89\u5168\u7684\u65b9\u5f0f\uff0c\u89c1<a class=\"xref\" href=\"/docs/19/typeconv-func.html\" title=\"10.3.\u00a0\u51fd\u6570\">\u7b2c\u00a010.3\u00a0\u8282</a>\u3002\u4f60\u53ef\u4ee5\u5728\u8c03\u7528\u4e2d\u6307\u5b9a<code class=\"literal\">VARIADIC</code>\u6765\u505a\u5230\u8fd9\u4e00\u70b9\uff1a</p>\n<pre class=\"screen\">SELECT mleast(VARIADIC ARRAY[10, -1, 5, 4.4]);\n</pre>\n<p lang=\"zh\">\u8fd9\u6837\u4f1a\u963b\u6b62\u51fd\u6570\u7684\u53ef\u53d8\u53c2\u6570\u6309\u5176\u5143\u7d20\u7c7b\u578b\u5c55\u5f00\uff0c\u4ece\u800c\u8ba9\u6570\u7ec4\u5b9e\u53c2\u80fd\u591f\u6309\u5e38\u89c4\u65b9\u5f0f\u5339\u914d\u3002<code class=\"literal\">VARIADIC</code> \u53ea\u80fd\u9644\u52a0\u5728\u51fd\u6570\u8c03\u7528\u7684\u6700\u540e\u4e00\u4e2a\u5b9e\u53c2\u4e0a\u3002</p>\n<p lang=\"zh\">\u5728\u8c03\u7528\u4e2d\u6307\u5b9a<code class=\"literal\">VARIADIC</code>\u4e5f\u662f\u5411\u53ef\u53d8\u53c2\u6570\u51fd\u6570\u4f20\u9012\u7a7a\u6570\u7ec4\u7684\u552f\u4e00\u65b9\u5f0f\uff0c\u4f8b\u5982\uff1a</p>\n<pre class=\"screen\">SELECT mleast(VARIADIC ARRAY[]::numeric[]);\n</pre>\n<p lang=\"zh\">\u4ec5\u4ec5\u5199\u6210<code class=\"literal\">SELECT mleast()</code>\u662f\u884c\u4e0d\u901a\u7684\uff0c\u56e0\u4e3a\u53ef\u53d8\u53c2\u6570\u5fc5\u987b\u5339\u914d\u81f3\u5c11\u4e00\u4e2a\u5b9e\u53c2\u3002\uff08\u5982\u679c\u4f60\u5e0c\u671b\u5141\u8bb8\u8fd9\u79cd\u8c03\u7528\uff0c\u53ef\u4ee5\u518d\u5b9a\u4e49\u4e00\u4e2a\u540c\u540d\u4e14\u4e0d\u5e26\u53c2\u6570\u7684\u51fd\u6570<code class=\"literal\">mleast</code>\u3002\uff09</p>\n<p lang=\"zh\">\u4ece\u53ef\u53d8\u53c2\u6570\u6d3e\u751f\u51fa\u7684\u6570\u7ec4\u5143\u7d20\u53c2\u6570\u4f1a\u88ab\u89c6\u4e3a\u6ca1\u6709\u81ea\u5df1\u7684\u540d\u5b57\u3002\u8fd9\u610f\u5473\u7740\u9664\u975e\u4f60\u6307\u5b9a\u4e86 <code class=\"literal\">VARIADIC</code>\uff0c\u5426\u5219\u4e0d\u80fd\u4f7f\u7528\u547d\u540d\u53c2\u6570\u6765\u8c03\u7528\u53ef\u53d8\u53c2\u6570\u51fd\u6570\uff08<a class=\"xref\" href=\"/docs/19/sql-syntax-calling-funcs.html\" title=\"4.3.\u00a0\u8c03\u7528\u51fd\u6570\">\u7b2c\u00a04.3\u00a0\u8282</a>\uff09\u3002\u4f8b\u5982\uff0c\u4e0b\u9762\u7684\u8c03\u7528\u662f\u53ef\u884c\u7684\uff1a</p>\n<pre class=\"screen\">SELECT mleast(VARIADIC arr =&gt; ARRAY[10, -1, 5, 4.4]);\n</pre>\n<p lang=\"zh\">\u4f46\u8fd9\u4e9b\u5c31\u4e0d\u884c\uff1a</p>\n<pre class=\"screen\">SELECT mleast(arr =&gt; 10);\nSELECT mleast(arr =&gt; ARRAY[10, -1, 5, 4.4]);\n</pre>\n</div>\n<div class=\"sect2\" id=\"XFUNC-SQL-PARAMETER-DEFAULTS\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/19/xfunc-sql.html#XFUNC-SQL-PARAMETER-DEFAULTS\">36.5.7. \u5e26\u6709\u53c2\u6570\u9ed8\u8ba4\u503c\u7684<acronym class=\"acronym\">SQL</acronym>\u51fd\u6570</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\">\u51fd\u6570\u53ef\u4ee5\u88ab\u58f0\u660e\u4e3a\u5bf9\u4e00\u4e9b\u6216\u8005\u6240\u6709\u8f93\u5165\u53c2\u6570\u5177\u6709\u9ed8\u8ba4\u503c\u3002\u53ea\u8981\u8c03\u7528\u51fd\u6570\u65f6\u6ca1\u6709\u7ed9\u51fa\u8db3\u591f\u591a\u7684\u5b9e\u53c2\uff0c\u5c31\u4f1a\u63d2\u5165\u9ed8\u8ba4\u503c\u6765\u5f25\u8865\u7f3a\u5931\u7684\u5b9e\u53c2\u3002\u7531\u4e8e\u53c2\u6570\u53ea\u80fd\u4ece\u5b9e\u53c2\u5217\u8868\u7684\u5c3e\u90e8\u5f00\u59cb\u88ab\u7701\u7565\uff0c\u5728\u4e00\u4e2a\u6709\u9ed8\u8ba4\u503c\u7684\u53c2\u6570\u4e4b\u540e\u7684\u6240\u6709\u53c2\u6570\u90fd\u4e0d\u5f97\u4e0d\u4e5f\u5177\u6709\u9ed8\u8ba4\u503c\uff08\u5c3d\u7ba1\u4f7f\u7528\u547d\u540d\u53c2\u6570\u8bb0\u6cd5\u53ef\u4ee5\u5141\u8bb8\u653e\u677e\u8fd9\u79cd\u9650\u5236\uff0c\u8fd9\u79cd\u9650\u5236\u4ecd\u7136\u4f1a\u88ab\u5f3a\u5236\u4ee5\u4fbf\u4f4d\u7f6e\u53c2\u6570\u8bb0\u6cd5\u80fd\u5de5\u4f5c\uff09\u3002\u4e0d\u7ba1\u4f60\u662f\u5426\u4f7f\u7528\u5b83\uff0c\u8fd9\u79cd\u80fd\u529b\u90fd\u8981\u6c42\u5728\u67d0\u4e9b\u7528\u6237\u4e0d\u4fe1\u4efb\u5176\u4ed6\u7528\u6237\u7684\u6570\u636e\u5e93\u4e2d\u8c03\u7528\u51fd\u6570\u65f6\u91c7\u53d6\u4e00\u4e9b\u9884\u9632\u63aa\u65bd\uff0c\u89c1<a class=\"xref\" href=\"/docs/19/typeconv-func.html\" title=\"10.3.\u00a0\u51fd\u6570\">\u7b2c\u00a010.3\u00a0\u8282</a>\u3002</p>\n<p lang=\"zh\">\u4f8b\u5982\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION foo(a int, b int DEFAULT 2, c int DEFAULT 3)\nRETURNS int\nLANGUAGE SQL\nAS $$\n    SELECT $1 + $2 + $3;\n$$;\n\nSELECT foo(10, 20, 30);\n foo\n-----\n  60\n(1 row)\n\nSELECT foo(10, 20);\n foo\n-----\n  33\n(1 row)\n\nSELECT foo(10);\n foo\n-----\n  15\n(1 row)\n\nSELECT foo();  -- fails since there is no default for the first argument\nERROR:  function foo() does not exist\n</pre>\n<p lang=\"zh\">\u4e5f\u53ef\u4ee5\u7528 <code class=\"literal\">=</code> \u7b26\u53f7\u4ee3\u66ff\u5173\u952e\u5b57 <code class=\"literal\">DEFAULT</code>\u3002</p>\n</div>\n<div class=\"sect2\" id=\"XFUNC-SQL-TABLE-FUNCTIONS\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/19/xfunc-sql.html#XFUNC-SQL-TABLE-FUNCTIONS\">36.5.8. <acronym class=\"acronym\">SQL</acronym> \u51fd\u6570\u4f5c\u4e3a\u8868\u6765\u6e90</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\">\u6240\u6709\u7684 SQL \u51fd\u6570\u90fd\u53ef\u4ee5\u88ab\u7528\u5728\u67e5\u8be2\u7684<code class=\"literal\">FROM</code>\u5b50\u53e5\u4e2d\uff0c\u4f46\u662f\u5bf9\u4e8e\u8fd4\u56de\u590d\u5408\u7c7b\u578b\u7684\u51fd\u6570\u7279\u522b\u6709\u7528\u3002\u5982\u679c\u51fd\u6570\u88ab\u5b9a\u4e49\u4e3a\u8fd4\u56de\u4e00\u79cd\u57fa\u7840\u7c7b\u578b\uff0c\u8be5\u8868\u51fd\u6570\u4f1a\u4ea7\u751f\u4e00\u4e2a\u5355\u5217\u8868\u3002\u5982\u679c\u8be5\u51fd\u6570\u88ab\u5b9a\u4e49\u4e3a\u8fd4\u56de\u4e00\u79cd\u590d\u5408\u7c7b\u578b\uff0c\u8be5\u8868\u51fd\u6570\u4f1a\u4e3a\u8be5\u590d\u5408\u7c7b\u578b\u7684\u6bcf\u4e00\u4e2a\u5c5e\u6027\u4ea7\u751f\u4e00\u5217\u3002</p>\n<p lang=\"zh\">\u4ee5\u4e0b\u662f\u4e00\u4e2a\u793a\u4f8b\uff1a</p>\n<pre class=\"screen\">CREATE TABLE foo (fooid int, foosubid int, fooname text);\nINSERT INTO foo VALUES (1, 1, 'Joe');\nINSERT INTO foo VALUES (1, 2, 'Ed');\nINSERT INTO foo VALUES (2, 1, 'Mary');\n\nCREATE FUNCTION getfoo(int) RETURNS foo AS $$\n    SELECT * FROM foo WHERE fooid = $1;\n$$ LANGUAGE SQL;\n\nSELECT *, upper(fooname) FROM getfoo(1) AS t1;\n\n fooid | foosubid | fooname | upper\n-------+----------+---------+-------\n     1 |        1 | Joe     | JOE\n(1 row)\n</pre>\n<p lang=\"zh\">\u5982\u793a\u4f8b\u6240\u793a\uff0c\u6211\u4eec\u53ef\u4ee5\u50cf\u64cd\u4f5c\u666e\u901a\u8868\u7684\u5217\u4e00\u6837\u64cd\u4f5c\u51fd\u6570\u7ed3\u679c\u4e2d\u7684\u5217\u3002</p>\n<p lang=\"zh\">\u6ce8\u610f\u6211\u4eec\u53ea\u4ece\u51fd\u6570\u5f97\u5230\u4e86\u4e00\u884c\u3002\u8fd9\u662f\u56e0\u4e3a\u6211\u4eec\u6ca1\u6709\u4f7f\u7528<code class=\"literal\">SETOF</code>\u3002\u8fd9\u4f1a\u5728\u4e0b\u4e00\u8282\u4e2d\u4ecb\u7ecd\u3002</p>\n</div>\n<div class=\"sect2\" id=\"XFUNC-SQL-FUNCTIONS-RETURNING-SET\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/19/xfunc-sql.html#XFUNC-SQL-FUNCTIONS-RETURNING-SET\">36.5.9. \u8fd4\u56de\u96c6\u5408\u7684<acronym class=\"acronym\">SQL</acronym>\u51fd\u6570</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\">\u5f53\u4e00\u4e2a SQL \u51fd\u6570\u88ab\u58f0\u660e\u4e3a\u8fd4\u56de<code class=\"literal\">SETOF <em class=\"replaceable\"><code>sometype</code></em></code>\u65f6\uff0c\u8be5\u51fd\u6570\u7684\u6700\u540e\u4e00\u4e2a\u67e5\u8be2\u4f1a\u88ab\u6267\u884c\u5b8c\uff0c\u5e76\u4e14\u5b83\u8f93\u51fa\u7684\u6bcf\u4e00\u884c\u90fd\u4f1a\u88ab\u4f5c\u4e3a\u7ed3\u679c\u96c6\u7684\u4e00\u4e2a\u5143\u7d20\u8fd4\u56de\u3002</p>\n<p lang=\"zh\">\u8fd9\u4e00\u7279\u6027\u901a\u5e38\u662f\u5728\u67e5\u8be2\u7684 <code class=\"literal\">FROM</code> \u5b50\u53e5\u4e2d\u8c03\u7528\u51fd\u6570\u65f6\u4f7f\u7528\u7684\u3002\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b\uff0c\u51fd\u6570\u8fd4\u56de\u7684\u6bcf\u4e00\u884c\u90fd\u4f1a\u6210\u4e3a\u67e5\u8be2\u6240\u89c1\u8868\u4e2d\u7684\u4e00\u884c\u3002\u4f8b\u5982\uff0c\u5047\u8bbe\u8868 <code class=\"structname\">foo</code> \u4e0e\u4e0a\u6587\u76f8\u540c\uff0c\u6211\u4eec\u5199\uff1a</p>\n<pre class=\"programlisting\">CREATE FUNCTION getfoo(int) RETURNS SETOF foo AS $$\n    SELECT * FROM foo WHERE fooid = $1;\n$$ LANGUAGE SQL;\n\nSELECT * FROM getfoo(1) AS t1;\n</pre>\n<p lang=\"zh\">\u90a3\u4e48\u4f1a\u5f97\u5230\uff1a</p>\n<pre class=\"screen\"> fooid | foosubid | fooname\n-------+----------+---------\n     1 |        1 | Joe\n     1 |        2 | Ed\n(2 rows)\n</pre>\n<p lang=\"zh\">\u4e5f\u53ef\u4ee5\u901a\u8fc7\u8f93\u51fa\u53c2\u6570\u5b9a\u4e49\u7684\u5217\u6765\u8fd4\u56de\u591a\u884c\uff0c\u4f8b\u5982\uff1a</p>\n<pre class=\"programlisting\">CREATE TABLE tab (y int, z int);\nINSERT INTO tab VALUES (1, 2), (3, 4), (5, 6), (7, 8);\n\nCREATE FUNCTION sum_n_product_with_tab (x int, OUT sum int, OUT product int)\nRETURNS SETOF record\nAS $$\n    SELECT $1 + tab.y, $1 * tab.y FROM tab;\n$$ LANGUAGE SQL;\n\nSELECT * FROM sum_n_product_with_tab(10);\n sum | product\n-----+---------\n  11 |      10\n  13 |      30\n  15 |      50\n  17 |      70\n(4 rows)\n</pre>\n<p lang=\"zh\">\u8fd9\u91cc\u7684\u5173\u952e\u70b9\u662f\uff1a\u4f60\u5fc5\u987b\u5199\u6210 <code class=\"literal\">RETURNS SETOF record</code>\uff0c\u4ee5\u8868\u660e\u8be5\u51fd\u6570\u8fd4\u56de\u7684\u662f\u591a\u884c\u800c\u4e0d\u662f\u5355\u884c\u3002\u5982\u679c\u53ea\u6709\u4e00\u4e2a\u8f93\u51fa\u53c2\u6570\uff0c\u5219\u5199\u8be5\u53c2\u6570\u7684\u7c7b\u578b\uff0c\u800c\u4e0d\u662f <code class=\"type\">record</code>\u3002</p>\n<p lang=\"zh\">\u901a\u8fc7\u591a\u6b21\u8c03\u7528\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u6765\u6784\u9020\u67e5\u8be2\u7ed3\u679c\u901a\u5e38\u5f88\u6709\u7528\uff0c\u5176\u4e2d\u6bcf\u6b21\u8c03\u7528\u7684\u53c2\u6570\u90fd\u6765\u81ea\u8868\u6216\u5b50\u67e5\u8be2\u7684\u8fde\u7eed\u884c\u3002\u9996\u9009\u65b9\u5f0f\u662f\u4f7f\u7528 <code class=\"literal\">LATERAL</code> \u5173\u952e\u5b57\uff0c\u8be6\u89c1<a class=\"xref\" href=\"/docs/19/queries-table-expressions.html#QUERIES-LATERAL\" title=\"7.2.1.5.\u00a0LATERAL\u5b50\u67e5\u8be2\">\u7b2c\u00a07.2.1.5\u00a0\u8282</a>\u3002\u4e0b\u9762\u662f\u4e00\u4e2a\u4f7f\u7528\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u679a\u4e3e\u6811\u7ed3\u6784\u5143\u7d20\u7684\u793a\u4f8b\uff1a</p>\n<pre class=\"screen\">SELECT * FROM nodes;\n   name    | parent\n-----------+--------\n Top       |\n Child1    | Top\n Child2    | Top\n Child3    | Top\n SubChild1 | Child1\n SubChild2 | Child1\n(6 rows)\n\nCREATE FUNCTION listchildren(text) RETURNS SETOF text AS $$\n    SELECT name FROM nodes WHERE parent = $1\n$$ LANGUAGE SQL STABLE;\n\nSELECT * FROM listchildren('Top');\n listchildren\n--------------\n Child1\n Child2\n Child3\n(3 rows)\n\nSELECT name, child FROM nodes, LATERAL listchildren(name) AS child;\n  name  |   child\n--------+-----------\n Top    | Child1\n Top    | Child2\n Top    | Child3\n Child1 | SubChild1\n Child1 | SubChild2\n(5 rows)\n</pre>\n<p lang=\"zh\">\u8fd9\u4e2a\u4f8b\u5b50\u5e76\u6ca1\u6709\u505a\u51fa\u4efb\u4f55\u65e0\u6cd5\u7528\u7b80\u5355\u8fde\u63a5\u5b9e\u73b0\u7684\u4e8b\uff0c\u4f46\u5728\u66f4\u590d\u6742\u7684\u8ba1\u7b97\u4e2d\uff0c\u628a\u4e00\u90e8\u5206\u5de5\u4f5c\u653e\u8fdb\u51fd\u6570\u91cc\u901a\u5e38\u4f1a\u975e\u5e38\u65b9\u4fbf\u3002</p>\n<p lang=\"zh\">\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u4e5f\u53ef\u4ee5\u51fa\u73b0\u5728\u67e5\u8be2\u7684\u9009\u62e9\u5217\u8868\u4e2d\u3002\u5bf9\u4e8e\u67e5\u8be2\u672c\u8eab\u751f\u6210\u7684\u6bcf\u4e00\u884c\uff0c\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u90fd\u4f1a\u88ab\u8c03\u7528\uff0c\u5e76\u4e3a\u5176\u7ed3\u679c\u96c6\u4e2d\u7684\u6bcf\u4e00\u4e2a\u5143\u7d20\u751f\u6210\u4e00\u884c\u8f93\u51fa\u3002\u524d\u9762\u7684\u4f8b\u5b50\u4e5f\u53ef\u4ee5\u5199\u6210\u8fd9\u6837\uff1a</p>\n<pre class=\"screen\">SELECT listchildren('Top');\n listchildren\n--------------\n Child1\n Child2\n Child3\n(3 rows)\n\nSELECT name, listchildren(name) FROM nodes;\n  name  | listchildren\n--------+--------------\n Top    | Child1\n Top    | Child2\n Top    | Child3\n Child1 | SubChild1\n Child1 | SubChild2\n(5 rows)\n</pre>\n<p lang=\"zh\">\u5728\u6700\u540e\u4e00\u4e2a <code class=\"command\">SELECT</code> \u4e2d\uff0c\u6ce8\u610f\u6ca1\u6709\u4e3a <code class=\"literal\">Child2</code>\u3001<code class=\"literal\">Child3</code> \u7b49\u663e\u793a\u4efb\u4f55\u8f93\u51fa\u884c\u3002\u8fd9\u662f\u56e0\u4e3a <code class=\"function\">listchildren</code> \u5bf9\u8fd9\u4e9b\u53c2\u6570\u8fd4\u56de\u7684\u662f\u7a7a\u96c6\uff0c\u56e0\u6b64\u4e0d\u4f1a\u751f\u6210\u7ed3\u679c\u884c\u3002\u8fd9\u4e0e\u4f7f\u7528 <code class=\"literal\">LATERAL</code> \u8bed\u6cd5\u628a\u51fd\u6570\u7ed3\u679c\u505a\u5185\u8fde\u63a5\u65f6\u5f97\u5230\u7684\u884c\u4e3a\u76f8\u540c\u3002</p>\n<p lang=\"zh\"><span class=\"productname\">PostgreSQL</span>\u4e2d\uff0c\u5199\u5728\u67e5\u8be2\u7684\u9009\u62e9\u5217\u8868\u4e2d\u7684\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u7684\u884c\u4e3a\u51e0\u4e4e\u548c\u5199\u5728<code class=\"literal\">LATERAL FROM</code>\u5b50\u53e5\u9879\u4e2d\u7684\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u5b8c\u5168\u4e00\u6837\u3002\u4f8b\u5982\uff1a</p>\n<pre class=\"programlisting\">SELECT x, generate_series(1,5) AS g FROM tab;\n</pre>\n<p lang=\"zh\">\u51e0\u4e4e\u7b49\u6548\u4e8e</p>\n<pre class=\"programlisting\">SELECT x, g FROM tab, LATERAL generate_series(1,5) AS g;\n</pre>\n<p lang=\"zh\">\u8fd9\u4f1a\u662f\u5b8c\u5168\u4e00\u6837\u7684\uff0c\u9664\u4e86\u5728\u8fd9\u4e2a\u7279\u522b\u7684\u793a\u4f8b\u4e2d\uff0c\u89c4\u5212\u5668\u53ef\u4ee5\u9009\u62e9\u628a<code class=\"structname\">g</code>\u653e\u5728\u5d4c\u5957\u5faa\u73af\u8fde\u63a5\u7684\u5916\u4fa7\uff0c\u56e0\u4e3a<code class=\"structname\">g</code>\u5bf9<code class=\"structname\">tab</code>\u6ca1\u6709\u5b9e\u9645\u7684\u6a2a\u5411\u4f9d\u8d56\u3002\u90a3\u4f1a\u5bfc\u81f4\u4e00\u79cd\u4e0d\u540c\u7684\u8f93\u51fa\u884c\u987a\u5e8f\u3002\u9009\u62e9\u5217\u8868\u4e2d\u7684\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u603b\u662f\u4f1a\u88ab\u8ba1\u7b97\uff0c\u5c31\u597d\u50cf\u5b83\u4eec\u5728<code class=\"literal\">FROM</code>\u5b50\u53e5\u5269\u4f59\u90e8\u5206\u7684\u5d4c\u5957\u5faa\u73af\u8fde\u63a5\u7684\u5185\u4fa7\u4e00\u6837\uff0c\u56e0\u6b64\u5728\u8003\u8651\u6765\u81ea<code class=\"literal\">FROM</code>\u5b50\u53e5\u7684\u4e0b\u4e00\u884c\u4e4b\u524d\uff0c\u8fd9\u4e9b\u51fd\u6570\u4f1a\u8fd0\u884c\u5230\u5b8c\u6210\u3002</p>\n<p lang=\"zh\">\u5982\u679c\u5728\u67e5\u8be2\u7684\u9009\u62e9\u5217\u8868\u4e2d\u6709\u4e0d\u6b62\u4e00\u4e2a\u96c6\u5408\u8fd4\u56de\u51fd\u6570\uff0c\u5219\u884c\u4e3a\u7c7b\u4f3c\u4e8e\u628a\u90a3\u4e9b\u51fd\u6570\u653e\u5230\u4e00\u4e2a\u5355\u4e00\u7684<code class=\"literal\">LATERAL ROWS FROM( ... )</code> <code class=\"literal\">FROM</code>\u5b50\u53e5\u9879\u4e2d\u7684\u884c\u4e3a\u3002\u5bf9\u4e8e\u6765\u81ea\u5e95\u5c42\u67e5\u8be2\u7684\u6bcf\u4e00\u884c\uff0c\u90fd\u6709\u4e00\u4e2a\u7528\u5230\u6bcf\u4e2a\u51fd\u6570\u9996\u4e2a\u7ed3\u679c\u7684\u8f93\u51fa\u884c\uff0c\u7136\u540e\u662f\u4e00\u4e2a\u4f7f\u7528\u6bcf\u4e2a\u51fd\u6570\u7b2c\u4e8c\u4e2a\u7ed3\u679c\u7684\u8f93\u51fa\u884c\uff0c\u4ee5\u6b64\u7c7b\u63a8\u3002\u5982\u679c\u67d0\u4e9b\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u4ea7\u751f\u7684\u8f93\u51fa\u6bd4\u5176\u4ed6\u51fd\u6570\u5c11\uff0c\u4f1a\u7528\u7a7a\u503c\u4ee3\u66ff\u7f3a\u5931\u7684\u6570\u636e\uff0c\u56e0\u6b64\u4e3a\u4e00\u4e2a\u5e95\u5c42\u884c\u5f62\u6210\u7684\u603b\u884c\u6570\u7b49\u4e8e\u4ea7\u751f\u6700\u591a\u8f93\u51fa\u7684\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u7684\u8f93\u51fa\u884c\u6570\u3002\u56e0\u6b64\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u4f1a<span class=\"quote\">\u201c<span class=\"quote\">\u6b65\u8c03\u4e00\u81f4</span>\u201d</span>\u5730\u8fd0\u884c\u76f4\u5230\u5b83\u4eec\u7684\u8f93\u51fa\u88ab\u8017\u5c3d\uff0c\u7136\u540e\u7528\u4e0b\u4e00\u4e2a\u5e95\u5c42\u884c\u7ee7\u7eed\u6267\u884c\u3002</p>\n<p lang=\"zh\">\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u53ef\u4ee5\u88ab\u5d4c\u5957\u5728\u4e00\u4e2a\u9009\u62e9\u5217\u8868\u4e2d\uff0c\u4e0d\u8fc7\u5728<code class=\"literal\">FROM</code>\u5b50\u53e5\u9879\u4e2d\u4e0d\u5141\u8bb8\u8fd9\u6837\u505a\u3002\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b\uff0c\u5d4c\u5957\u7684\u6bcf\u4e00\u5c42\u4f1a\u88ab\u5355\u72ec\u5bf9\u5f85\uff0c\u5c31\u50cf\u5b83\u662f\u4e00\u4e2a\u5355\u72ec\u7684<code class=\"literal\">LATERAL ROWS FROM( ... )</code>\u9879\u4e00\u6837\u3002\u4f8b\u5982\uff0c\u5728</p>\n<pre class=\"programlisting\">SELECT srf1(srf2(x), srf3(y)), srf4(srf5(z)) FROM tab;\n</pre>\n<p lang=\"zh\">\u4e2d\uff0c\u96c6\u5408\u8fd4\u56de\u51fd\u6570<code class=\"function\">srf2</code>\u3001<code class=\"function\">srf3</code>\u548c<code class=\"function\">srf5</code>\u5c06\u4e3a<code class=\"structname\">tab</code>\u7684\u6bcf\u4e00\u884c\u6b65\u8c03\u4e00\u81f4\u5730\u8fd0\u884c\uff0c\u7136\u540e\u4f1a\u5bf9\u8f83\u4f4e\u5c42\u7684\u51fd\u6570\u4ea7\u751f\u7684\u6bcf\u4e00\u884c\u4ee5\u6b65\u8c03\u4e00\u81f4\u7684\u5f62\u5f0f\u5e94\u7528<code class=\"function\">srf1</code>\u548c<code class=\"function\">srf4</code>\u3002</p>\n<p lang=\"zh\">\u5728<code class=\"literal\">CASE</code>\u6216<code class=\"literal\">COALESCE</code>\u8fd9\u6837\u7684\u6761\u4ef6\u8ba1\u7b97\u7ed3\u6784\u4e2d\uff0c\u4e0d\u80fd\u4f7f\u7528\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u3002\u4f8b\u5982\uff0c\u8003\u8651</p>\n<pre class=\"programlisting\">SELECT x, CASE WHEN x &gt; 0 THEN generate_series(1, 5) ELSE 0 END FROM tab;\n</pre>\n<p lang=\"zh\">\u8868\u9762\u4e0a\u770b\uff0c\u8fd9\u5e94\u5f53\u8ba9 x &gt; 0 \u7684\u8f93\u5165\u884c\u91cd\u590d\u4e94\u6b21\uff0c\u5176\u4f59\u884c\u53ea\u51fa\u73b0\u4e00\u6b21\uff1b\u4f46\u5b9e\u9645\u4e0a\uff0cgenerate_series(1, 5) \u4f1a\u5728 CASE \u8868\u8fbe\u5f0f\u6c42\u503c\u4e4b\u524d\uff0c\u4f5c\u4e3a\u9690\u5f0f LATERAL FROM \u9879\u6267\u884c\uff0c\u56e0\u6b64\u6bcf\u4e2a\u8f93\u5165\u884c\u90fd\u4f1a\u91cd\u590d\u4e94\u6b21\u3002\u4e3a\u907f\u514d\u6df7\u6dc6\uff0c\u6b64\u7c7b\u5199\u6cd5\u4f1a\u5728\u89e3\u6790\u9636\u6bb5\u62a5\u9519\u3002</p>\n<div class=\"note\">\n<h3 class=\"title\" lang=\"zh\">\u6ce8\u610f</h3>\n<p lang=\"zh\">\u5982\u679c\u51fd\u6570\u7684\u6700\u540e\u4e00\u6761\u547d\u4ee4\u662f\u5e26 RETURNING \u7684 INSERT\u3001UPDATE\u3001DELETE \u6216 MERGE\uff0c\u8be5\u547d\u4ee4\u59cb\u7ec8\u6267\u884c\u5230\u5b8c\u6210\uff0c\u5373\u4f7f\u51fd\u6570\u672a\u58f0\u660e SETOF\uff0c\u6216\u8c03\u7528\u67e5\u8be2\u672a\u83b7\u53d6\u5168\u90e8\u7ed3\u679c\u884c\u4e5f\u662f\u5982\u6b64\u3002RETURNING \u5b50\u53e5\u4ea7\u751f\u7684\u989d\u5916\u884c\u4f1a\u88ab\u9759\u9ed8\u4e22\u5f03\uff0c\u4f46\u6307\u5b9a\u7684\u8868\u4fee\u6539\u4ecd\u4f1a\u53d1\u751f\uff0c\u5e76\u5728\u51fd\u6570\u8fd4\u56de\u4e4b\u524d\u5168\u90e8\u5b8c\u6210\u3002</p>\n</div>\n<div class=\"note\">\n<h3 class=\"title\" lang=\"zh\">\u6ce8\u610f</h3>\n<p lang=\"zh\">\u5728 <span class=\"productname\">PostgreSQL</span> 10 \u4e4b\u524d\uff0c\u9664\u975e\u591a\u4e2a\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u59cb\u7ec8\u4ea7\u751f\u76f8\u540c\u6570\u91cf\u7684\u884c\uff0c\u5426\u5219\u628a\u5b83\u4eec\u653e\u5728\u540c\u4e00\u4e2a\u9009\u62e9\u5217\u8868\u4e2d\u7684\u884c\u4e3a\u5e76\u4e0d\u5408\u7406\u3002\u5426\u5219\uff0c\u5f97\u5230\u7684\u8f93\u51fa\u884c\u6570\u4f1a\u662f\u8fd9\u4e9b\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u5404\u81ea\u4ea7\u751f\u884c\u6570\u7684\u6700\u5c0f\u516c\u500d\u6570\u3002\u6b64\u5916\uff0c\u5d4c\u5957\u7684\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u4e5f\u4e0d\u50cf\u4e0a\u6587\u6240\u63cf\u8ff0\u7684\u90a3\u6837\u5de5\u4f5c\uff1b\u76f8\u53cd\uff0c\u4e00\u4e2a\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u81f3\u591a\u53ea\u80fd\u6709\u4e00\u4e2a\u96c6\u5408\u8fd4\u56de\u53c2\u6570\uff0c\u5e76\u4e14\u6bcf\u4e00\u7ec4\u5d4c\u5957\u7684\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u90fd\u4f1a\u72ec\u7acb\u8fd0\u884c\u3002\u518d\u52a0\u4e0a\u8fc7\u53bb\u8fd8\u5141\u8bb8\u6761\u4ef6\u6267\u884c\uff08\u5373\u5728 <code class=\"literal\">CASE</code> \u7b49\u7ed3\u6784\u5185\u90e8\u4f7f\u7528\u96c6\u5408\u8fd4\u56de\u51fd\u6570\uff09\uff0c\u4e8b\u60c5\u5c31\u66f4\u52a0\u590d\u6742\u4e86\u3002\u5982\u679c\u4f60\u8981\u7f16\u5199\u9700\u8981\u5728\u65e7\u7248 <span class=\"productname\">PostgreSQL</span> \u4e0a\u8fd0\u884c\u7684\u67e5\u8be2\uff0c\u5efa\u8bae\u4f7f\u7528 <code class=\"literal\">LATERAL</code> \u8bed\u6cd5\uff0c\u56e0\u4e3a\u8fd9\u6837\u5728\u4e0d\u540c\u7248\u672c\u4e4b\u95f4\u80fd\u591f\u5f97\u5230\u4e00\u81f4\u7684\u7ed3\u679c\u3002\u5982\u679c\u4f60\u7684\u67e5\u8be2\u4f9d\u8d56\u4e8e\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u7684\u6761\u4ef6\u6267\u884c\uff0c\u6216\u8bb8\u53ef\u4ee5\u628a\u6761\u4ef6\u5224\u65ad\u79fb\u52a8\u5230\u81ea\u5b9a\u4e49\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u5185\u90e8\u6765\u4fee\u590d\u3002\u4f8b\u5982\uff0c</p>\n<pre class=\"programlisting\">SELECT x, CASE WHEN y &gt; 0 THEN generate_series(1, z) ELSE 5 END FROM tab;\n</pre>\n<p lang=\"zh\">\u53ef\u4ee5\u53d8\u6210</p>\n<pre class=\"programlisting\">CREATE FUNCTION case_generate_series(cond bool, start int, fin int, els int)\n  RETURNS SETOF int AS $$\nBEGIN\n  IF cond THEN\n    RETURN QUERY SELECT generate_series(start, fin);\n  ELSE\n    RETURN QUERY SELECT els;\n  END IF;\nEND$$ LANGUAGE plpgsql;\n\nSELECT x, case_generate_series(y &gt; 0, 1, z, 5) FROM tab;\n</pre>\n<p lang=\"zh\">\u8fd9\u79cd\u5199\u6cd5\u5728\u6240\u6709\u7248\u672c\u7684 <span class=\"productname\">PostgreSQL</span> \u4e2d\u7684\u884c\u4e3a\u90fd\u76f8\u540c\u3002</p>\n</div>\n</div>\n<div class=\"sect2\" id=\"XFUNC-SQL-FUNCTIONS-RETURNING-TABLE\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/19/xfunc-sql.html#XFUNC-SQL-FUNCTIONS-RETURNING-TABLE\">36.5.10. \u8fd4\u56de<code class=\"literal\">TABLE</code>\u7684<acronym class=\"acronym\">SQL</acronym>\u51fd\u6570</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\">\u8fd8\u6709\u53e6\u4e00\u79cd\u65b9\u6cd5\u53ef\u4ee5\u628a\u51fd\u6570\u58f0\u660e\u4e3a\u8fd4\u56de\u4e00\u4e2a\u96c6\u5408\uff0c\u5373\u4f7f\u7528 <code class=\"literal\">RETURNS TABLE(<em class=\"replaceable\"><code>columns</code></em>)</code>\u8bed\u6cd5\u3002\u8fd9\u7b49\u6548\u4e8e\u4f7f\u7528\u4e00\u4e2a\u6216\u8005\u591a\u4e2a<code class=\"literal\">OUT</code>\u53c2\u6570\u5916\u52a0\u628a\u51fd\u6570\u6807\u8bb0\u4e3a\u8fd4\u56de <code class=\"literal\">SETOF record</code>\uff08\u6216\u8005\u662f<code class=\"literal\">SETOF</code>\u5355\u4e2a\u8f93\u51fa\u53c2\u6570\u7684\u7c7b\u578b\uff09\u3002\u8fd9\u79cd\u5199\u6cd5\u662f\u5728\u6700\u8fd1\u7684 SQL \u6807\u51c6\u4e2d\u6307\u5b9a\u7684\uff0c\u56e0\u6b64\u53ef\u80fd\u6bd4\u4f7f\u7528 <code class=\"literal\">SETOF</code>\u7684\u79fb\u690d\u6027\u66f4\u597d\u3002</p>\n<p lang=\"zh\">\u4f8b\u5982\uff0c\u524d\u9762\u7684\u6c42\u548c\u5e76\u4e14\u76f8\u4e58\u7684\u793a\u4f8b\u4e5f\u53ef\u4ee5\u8fd9\u6837\u6765\u505a\uff1a</p>\n<pre class=\"programlisting\">CREATE FUNCTION sum_n_product_with_tab (x int)\nRETURNS TABLE(sum int, product int) AS $$\n    SELECT $1 + tab.y, $1 * tab.y FROM tab;\n$$ LANGUAGE SQL;\n</pre>\n<p lang=\"zh\">\u4e0d\u5141\u8bb8\u628a\u663e\u5f0f\u7684<code class=\"literal\">OUT</code>\u6216\u8005<code class=\"literal\">INOUT</code>\u53c2\u6570\u7528\u4e8e <code class=\"literal\">RETURNS TABLE</code>\u8bb0\u6cd5 \u2014 \u5fc5\u987b\u628a\u6240\u6709\u8f93\u51fa\u5217\u653e\u5728 <code class=\"literal\">TABLE</code>\u5217\u8868\u4e2d\u3002</p>\n</div>\n<div class=\"sect2\" id=\"XFUNC-SQL-POLYMORPHIC-FUNCTIONS\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/19/xfunc-sql.html#XFUNC-SQL-POLYMORPHIC-FUNCTIONS\">36.5.11. \u591a\u6001<acronym class=\"acronym\">SQL</acronym>\u51fd\u6570</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\"><acronym class=\"acronym\">SQL</acronym> \u51fd\u6570\u53ef\u4ee5\u88ab\u58f0\u660e\u4e3a\u63a5\u53d7\u5e76\u8fd4\u56de<a class=\"xref\" href=\"/docs/19/extend-type-system.html#EXTEND-TYPES-POLYMORPHIC\" title=\"36.2.5.\u00a0\u591a\u6001\u7c7b\u578b\">\u7b2c\u00a036.2.5\u00a0\u8282</a>\u4e2d\u63cf\u8ff0\u7684\u591a\u6001\u7c7b\u578b\u3002\u4e0b\u9762\u8fd9\u4e2a\u591a\u6001\u51fd\u6570 <code class=\"function\">make_array</code> \u4f1a\u6839\u636e\u4e24\u4e2a\u4efb\u610f\u6570\u636e\u7c7b\u578b\u7684\u5143\u7d20\u6784\u9020\u4e00\u4e2a\u6570\u7ec4\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION make_array(anyelement, anyelement) RETURNS anyarray AS $$\n    SELECT ARRAY[$1, $2];\n$$ LANGUAGE SQL;\n\nSELECT make_array(1, 2) AS intarray, make_array('a'::text, 'b') AS textarray;\n intarray | textarray\n----------+-----------\n {1,2}    | {a,b}\n(1 row)\n</pre>\n<p lang=\"zh\">\u6ce8\u610f\u7c7b\u578b\u8f6c\u6362<code class=\"literal\">'a'::text</code>\u7684\u4f7f\u7528\u662f\u4e3a\u4e86\u6307\u5b9a\u8be5\u53c2\u6570\u7684\u7c7b\u578b\u662f<code class=\"type\">text</code>\u3002\u5982\u679c\u8be5\u53c2\u6570\u53ea\u662f\u4e00\u4e2a\u5b57\u7b26\u4e32\u5b57\u9762\u91cf\uff0c\u8fd9\u5c31\u662f\u5fc5\u987b\u7684\uff0c\u56e0\u4e3a\u5426\u5219\u5b83\u4f1a\u88ab\u5f53\u4f5c<code class=\"type\">unknown</code>\u7c7b\u578b\uff0c\u5e76\u4e14 <code class=\"type\">unknown</code>\u7684\u6570\u7ec4\u4e5f\u4e0d\u662f\u4e00\u79cd\u5408\u6cd5\u7684\u7c7b\u578b\u3002\u5982\u679c\u6ca1\u6709\u8be5\u7c7b\u578b\u8f6c\u6362\uff0c\u5c06\u5f97\u5230\u8fd9\u6837\u7684\u9519\u8bef\uff1a</p>\n<pre class=\"screen\">ERROR:  could not determine polymorphic type because input has type unknown\n</pre>\n<p lang=\"zh\">\u6309\u7167\u4e0a\u9762\u7684\u65b9\u5f0f\u58f0\u660e <code class=\"function\">make_array</code> \u65f6\uff0c\u4f60\u5fc5\u987b\u63d0\u4f9b\u4e24\u4e2a\u6570\u636e\u7c7b\u578b\u5b8c\u5168\u76f8\u540c\u7684\u53c2\u6570\uff1b\u7cfb\u7edf\u4e0d\u4f1a\u5c1d\u8bd5\u89e3\u51b3\u5b83\u4eec\u4e4b\u95f4\u7684\u7c7b\u578b\u5dee\u5f02\u3002\u4f8b\u5982\uff0c\u4e0b\u9762\u8fd9\u6837\u662f\u4e0d\u884c\u7684\uff1a</p>\n<pre class=\"screen\">SELECT make_array(1, 2.5) AS numericarray;\nERROR:  function make_array(integer, numeric) does not exist\n</pre>\n<p lang=\"zh\">\u53e6\u4e00\u79cd\u65b9\u6cd5\u662f\u4f7f\u7528<span class=\"quote\">\u201c<span class=\"quote\">common</span>\u201d</span>\u8fd9\u4e00\u65cf\u591a\u6001\u7c7b\u578b\uff0c\u5b83\u5141\u8bb8\u7cfb\u7edf\u5c1d\u8bd5\u8bc6\u522b\u4e00\u4e2a\u5408\u9002\u7684\u516c\u5171\u7c7b\u578b\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION make_array2(anycompatible, anycompatible)\nRETURNS anycompatiblearray AS $$\n    SELECT ARRAY[$1, $2];\n$$ LANGUAGE SQL;\n\nSELECT make_array2(1, 2.5) AS numericarray;\n numericarray\n--------------\n {1,2.5}\n(1 row)\n</pre>\n<p lang=\"zh\">\u7531\u4e8e\u516c\u5171\u7c7b\u578b\u89e3\u6790\u89c4\u5219\u5728\u6240\u6709\u8f93\u5165\u90fd\u662f\u672a\u77e5\u7c7b\u578b\u65f6\u9ed8\u8ba4\u9009\u62e9 <code class=\"type\">text</code>\uff0c\u6240\u4ee5\u4e0b\u9762\u7684\u5199\u6cd5\u4e5f\u80fd\u5de5\u4f5c\uff1a</p>\n<pre class=\"screen\">SELECT make_array2('a', 'b') AS textarray;\n textarray\n-----------\n {a,b}\n(1 row)\n</pre>\n<p lang=\"zh\">\u5141\u8bb8\u5b58\u5728\u5177\u6709\u56fa\u5b9a\u8fd4\u56de\u7c7b\u578b\u7684\u591a\u6001\u53c2\u6570\uff0c\u4f46\u53cd\u8fc7\u6765\u5219\u4e0d\u5141\u8bb8\u3002\u4f8b\u5982\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION is_greater(anyelement, anyelement) RETURNS boolean AS $$\n    SELECT $1 &gt; $2;\n$$ LANGUAGE SQL;\n\nSELECT is_greater(1, 2);\n is_greater\n------------\n f\n(1 row)\n\nCREATE FUNCTION invalid_func() RETURNS anyelement AS $$\n    SELECT 1;\n$$ LANGUAGE SQL;\nERROR:  cannot determine result data type\nDETAIL:  A result of type anyelement requires at least one input of type anyelement, anyarray, anynonarray, anyenum, or anyrange.\n</pre>\n<p lang=\"zh\">\u591a\u6001\u4e5f\u53ef\u4ee5\u548c\u5e26\u8f93\u51fa\u53c2\u6570\u7684\u51fd\u6570\u4e00\u8d77\u4f7f\u7528\u3002\u4f8b\u5982\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION dup (f1 anyelement, OUT f2 anyelement, OUT f3 anyarray)\nAS 'SELECT $1, ARRAY[$1, $1]' LANGUAGE SQL;\n\nSELECT * FROM dup(22);\n f2 |   f3\n----+---------\n 22 | {22,22}\n(1 row)\n</pre>\n<p lang=\"zh\">\u591a\u6001\u4e5f\u53ef\u4ee5\u7528\u4e8e\u53ef\u53d8\u53c2\u6570\u51fd\u6570\u3002\u4f8b\u5982\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION anyleast (VARIADIC anyarray) RETURNS anyelement AS $$\n    SELECT min($1[i]) FROM generate_subscripts($1, 1) g(i);\n$$ LANGUAGE SQL;\n\nSELECT anyleast(10, -1, 5, 4);\n anyleast\n----------\n       -1\n(1 row)\n\nSELECT anyleast('abc'::text, 'def');\n anyleast\n----------\n abc\n(1 row)\n\nCREATE FUNCTION concat_values(text, VARIADIC anyarray) RETURNS text AS $$\n    SELECT array_to_string($2, $1);\n$$ LANGUAGE SQL;\n\nSELECT concat_values('|', 1, 4, 2);\n concat_values\n---------------\n 1|4|2\n(1 row)\n</pre>\n</div>\n<div class=\"sect2\" id=\"XFUNC-SQL-COLLATIONS\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/19/xfunc-sql.html#XFUNC-SQL-COLLATIONS\">36.5.12. \u5e26\u6709\u6392\u5e8f\u89c4\u5219\u7684<acronym class=\"acronym\">SQL</acronym>\u51fd\u6570</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\">\u5f53\u4e00\u4e2a SQL \u51fd\u6570\u6709\u4e00\u4e2a\u6216\u591a\u4e2a\u652f\u6301\u6392\u5e8f\u89c4\u5219\u7684\u6570\u636e\u7c7b\u578b\u53c2\u6570\u65f6\uff0c\u4f1a\u6309<a class=\"xref\" href=\"/docs/19/collation.html\" title=\"23.2.\u00a0\u6392\u5e8f\u89c4\u5219\u652f\u6301\">\u7b2c\u00a023.2\u00a0\u8282</a>\u4e2d\u7684\u8bf4\u660e\uff0c\u6839\u636e\u5206\u914d\u7ed9\u5b9e\u53c2\u7684\u6392\u5e8f\u89c4\u5219\uff0c\u4e3a\u6bcf\u6b21\u51fd\u6570\u8c03\u7528\u786e\u5b9a\u4e00\u4e2a\u6392\u5e8f\u89c4\u5219\u3002\u5982\u679c\u80fd\u591f\u6210\u529f\u786e\u5b9a\uff08\u4e5f\u5c31\u662f\u8bf4\uff0c\u53c2\u6570\u4e4b\u95f4\u4e0d\u5b58\u5728\u9690\u5f0f\u6392\u5e8f\u89c4\u5219\u51b2\u7a81\uff09\uff0c\u90a3\u4e48\u6240\u6709\u652f\u6301\u6392\u5e8f\u89c4\u5219\u7684\u53c2\u6570\u90fd\u4f1a\u88ab\u89c6\u4e3a\u9690\u5f0f\u5e26\u6709\u8be5\u6392\u5e8f\u89c4\u5219\u3002\u8fd9\u4f1a\u5f71\u54cd\u51fd\u6570\u4e2d\u5bf9\u6392\u5e8f\u89c4\u5219\u654f\u611f\u7684\u64cd\u4f5c\u7684\u884c\u4e3a\u3002\u4f8b\u5982\uff0c\u4f7f\u7528\u4e0a\u6587\u7684 <code class=\"function\">anyleast</code> \u51fd\u6570\u65f6\uff0c</p>\n<pre class=\"programlisting\">SELECT anyleast('abc'::text, 'ABC');\n</pre>\n<p lang=\"zh\">\u5176\u7ed3\u679c\u5c06\u53d6\u51b3\u4e8e\u6570\u636e\u5e93\u7684\u9ed8\u8ba4\u6392\u5e8f\u89c4\u5219\u3002\u5728 <code class=\"literal\">C</code> \u533a\u57df\u8bbe\u7f6e\u4e0b\uff0c\u7ed3\u679c\u4f1a\u662f <code class=\"literal\">ABC</code>\uff0c\u4f46\u5728\u8bb8\u591a\u5176\u4ed6\u533a\u57df\u8bbe\u7f6e\u4e0b\u5219\u4f1a\u662f <code class=\"literal\">abc</code>\u3002\u53ef\u4ee5\u5728\u4efb\u610f\u53c2\u6570\u4e0a\u6dfb\u52a0 <code class=\"literal\">COLLATE</code> \u5b50\u53e5\u6765\u5f3a\u5236\u6307\u5b9a\u8981\u4f7f\u7528\u7684\u6392\u5e8f\u89c4\u5219\uff0c\u4f8b\u5982\uff1a</p>\n<pre class=\"programlisting\">SELECT anyleast('abc'::text, 'ABC' COLLATE \"C\");\n</pre>\n<p lang=\"zh\">\u53e6\u5916\uff0c\u5982\u679c\u4f60\u5e0c\u671b\u67d0\u4e2a\u51fd\u6570\u65e0\u8bba\u4ee5\u4ec0\u4e48\u6392\u5e8f\u89c4\u5219\u8c03\u7528\uff0c\u90fd\u59cb\u7ec8\u6309\u7279\u5b9a\u6392\u5e8f\u89c4\u5219\u5de5\u4f5c\uff0c\u53ef\u4ee5\u5728\u51fd\u6570\u5b9a\u4e49\u4e2d\u6309\u9700\u63d2\u5165 <code class=\"literal\">COLLATE</code> \u5b50\u53e5\u3002\u4e0b\u9762\u8fd9\u4e2a\u7248\u672c\u7684 <code class=\"function\">anyleast</code> \u5c06\u59cb\u7ec8\u4f7f\u7528 <code class=\"literal\">en_US</code> \u533a\u57df\u8bbe\u7f6e\u6765\u6bd4\u8f83\u5b57\u7b26\u4e32\uff1a</p>\n<pre class=\"programlisting\">CREATE FUNCTION anyleast (VARIADIC anyarray) RETURNS anyelement AS $$\n    SELECT min($1[i] COLLATE \"en_US\") FROM generate_subscripts($1, 1) g(i);\n$$ LANGUAGE SQL;\n</pre>\n<p lang=\"zh\">\u4f46\u8bf7\u6ce8\u610f\uff0c\u5982\u679c\u628a\u5b83\u7528\u4e8e\u4e0d\u652f\u6301\u6392\u5e8f\u89c4\u5219\u7684\u6570\u636e\u7c7b\u578b\uff0c\u5c31\u4f1a\u629b\u51fa\u9519\u8bef\u3002</p>\n<p lang=\"zh\">\u5982\u679c\u65e0\u6cd5\u5728\u5b9e\u53c2\u4e4b\u95f4\u786e\u5b9a\u5171\u540c\u7684\u6392\u5e8f\u89c4\u5219\uff0c\u90a3\u4e48 SQL \u51fd\u6570\u4f1a\u628a\u53c2\u6570\u89c6\u4e3a\u5e26\u6709\u5176\u6570\u636e\u7c7b\u578b\u7684\u9ed8\u8ba4\u6392\u5e8f\u89c4\u5219\uff08\u901a\u5e38\u662f\u6570\u636e\u5e93\u7684\u9ed8\u8ba4\u6392\u5e8f\u89c4\u5219\uff0c\u4f46\u5bf9\u57df\u7c7b\u578b\u53c2\u6570\u6765\u8bf4\u4e5f\u53ef\u80fd\u4e0d\u540c\uff09\u3002</p>\n<p lang=\"zh\">\u8fd9\u79cd\u652f\u6301\u6392\u5e8f\u89c4\u5219\u7684\u53c2\u6570\u7684\u884c\u4e3a\uff0c\u53ef\u4ee5\u770b\u4f5c\u662f\u4ec5\u9002\u7528\u4e8e\u6587\u672c\u6570\u636e\u7c7b\u578b\u7684\u4e00\u79cd\u53d7\u9650\u591a\u6001\u5f62\u5f0f\u3002</p>\n</div>\n</div>", "manual_path": "/docs/19/xfunc-sql.html", "localization": {"status": "complete", "sources": [{"url": "/docs/19/xfunc-sql.html", "method": "same-major semantic node", "sha256": "d880917aace358ce7c870619ed898ba2972d5d2884572454f7350da2bc907d18", "language": "zh", "matched_nodes": ["#XFUNC-SQL/div[12]/div[10]/h3[0]", "#XFUNC-SQL/div[12]/p[2]", "#XFUNC-SQL/div[12]/p[3]", "#XFUNC-SQL/div[12]/p[4]", "#XFUNC-SQL/div[12]/p[5]", "#XFUNC-SQL/div[12]/p[6]", "#XFUNC-SQL/div[12]/p[8]", "#XFUNC-SQL/div[13]/p[10]", "#XFUNC-SQL/div[13]/p[12]", "#XFUNC-SQL/div[13]/p[13]", "#XFUNC-SQL/div[13]/p[15]", "#XFUNC-SQL/div[13]/p[17]", "#XFUNC-SQL/div[13]/p[19]", "#XFUNC-SQL/div[13]/p[1]", "#XFUNC-SQL/div[13]/p[3]", "#XFUNC-SQL/div[13]/p[4]", "#XFUNC-SQL/div[13]/p[6]", "#XFUNC-SQL/div[13]/p[8]", "#XFUNC-SQL/div[14]/div[12]/ul[0]/li[0]", "#XFUNC-SQL/div[14]/div[12]/ul[0]/li[1]", "#XFUNC-SQL/div[14]/p[10]", "#XFUNC-SQL/div[14]/p[11]", "#XFUNC-SQL/div[14]/p[13]", "#XFUNC-SQL/div[14]/p[15]", "#XFUNC-SQL/div[14]/p[16]", "#XFUNC-SQL/div[14]/p[18]", "#XFUNC-SQL/div[14]/p[1]", "#XFUNC-SQL/div[14]/p[20]", "#XFUNC-SQL/div[14]/p[21]", "#XFUNC-SQL/div[14]/p[23]", "#XFUNC-SQL/div[14]/p[25]", "#XFUNC-SQL/div[14]/p[27]", "#XFUNC-SQL/div[14]/p[28]", "#XFUNC-SQL/div[14]/p[3]", "#XFUNC-SQL/div[14]/p[5]", "#XFUNC-SQL/div[14]/p[6]", "#XFUNC-SQL/div[14]/p[8]", "#XFUNC-SQL/div[15]/p[11]", "#XFUNC-SQL/div[15]/p[2]", "#XFUNC-SQL/div[15]/p[4]", "#XFUNC-SQL/div[15]/p[6]", "#XFUNC-SQL/div[15]/p[8]", "#XFUNC-SQL/div[15]/p[9]", "#XFUNC-SQL/div[16]/p[2]", "#XFUNC-SQL/div[16]/p[4]", "#XFUNC-SQL/div[16]/p[6]", "#XFUNC-SQL/div[16]/p[7]", "#XFUNC-SQL/div[17]/p[10]", "#XFUNC-SQL/div[17]/p[11]", "#XFUNC-SQL/div[17]/p[13]", "#XFUNC-SQL/div[17]/p[14]", "#XFUNC-SQL/div[17]/p[16]", "#XFUNC-SQL/div[17]/p[3]", "#XFUNC-SQL/div[17]/p[5]", "#XFUNC-SQL/div[17]/p[7]", "#XFUNC-SQL/div[17]/p[8]", "#XFUNC-SQL/div[18]/p[2]", "#XFUNC-SQL/div[18]/p[3]", "#XFUNC-SQL/div[18]/p[5]", "#XFUNC-SQL/div[19]/p[1]", "#XFUNC-SQL/div[19]/p[2]", "#XFUNC-SQL/div[19]/p[4]", "#XFUNC-SQL/div[19]/p[5]", "#XFUNC-SQL/div[1]/dl[0]/dt[0]", "#XFUNC-SQL/div[1]/dl[0]/dt[10]", "#XFUNC-SQL/div[1]/dl[0]/dt[11]", "#XFUNC-SQL/div[1]/dl[0]/dt[1]", "#XFUNC-SQL/div[1]/dl[0]/dt[2]", "#XFUNC-SQL/div[1]/dl[0]/dt[3]", "#XFUNC-SQL/div[1]/dl[0]/dt[4]", "#XFUNC-SQL/div[1]/dl[0]/dt[5]", "#XFUNC-SQL/div[1]/dl[0]/dt[6]", "#XFUNC-SQL/div[1]/dl[0]/dt[7]", "#XFUNC-SQL/div[1]/dl[0]/dt[8]", "#XFUNC-SQL/div[1]/dl[0]/dt[9]", "#XFUNC-SQL/div[20]/div[29]/p[1]", "#XFUNC-SQL/div[20]/div[29]/p[3]", "#XFUNC-SQL/div[20]/div[29]/p[5]", "#XFUNC-SQL/div[20]/p[10]", "#XFUNC-SQL/div[20]/p[12]", "#XFUNC-SQL/div[20]/p[13]", "#XFUNC-SQL/div[20]/p[15]", "#XFUNC-SQL/div[20]/p[16]", "#XFUNC-SQL/div[20]/p[18]", "#XFUNC-SQL/div[20]/p[20]", "#XFUNC-SQL/div[20]/p[21]", "#XFUNC-SQL/div[20]/p[22]", "#XFUNC-SQL/div[20]/p[24]", "#XFUNC-SQL/div[20]/p[25]", "#XFUNC-SQL/div[20]/p[2]", "#XFUNC-SQL/div[20]/p[3]", "#XFUNC-SQL/div[20]/p[5]", "#XFUNC-SQL/div[20]/p[7]", "#XFUNC-SQL/div[20]/p[9]", "#XFUNC-SQL/div[21]/p[2]", "#XFUNC-SQL/div[21]/p[3]", "#XFUNC-SQL/div[21]/p[5]", "#XFUNC-SQL/div[22]/p[11]", "#XFUNC-SQL/div[22]/p[13]", "#XFUNC-SQL/div[22]/p[15]", "#XFUNC-SQL/div[22]/p[1]", "#XFUNC-SQL/div[22]/p[3]", "#XFUNC-SQL/div[22]/p[5]", "#XFUNC-SQL/div[22]/p[7]", "#XFUNC-SQL/div[22]/p[9]", "#XFUNC-SQL/div[23]/p[10]", "#XFUNC-SQL/div[23]/p[2]", "#XFUNC-SQL/div[23]/p[4]", "#XFUNC-SQL/div[23]/p[6]", "#XFUNC-SQL/div[23]/p[8]", "#XFUNC-SQL/div[23]/p[9]", "#XFUNC-SQL/p[10]", "#XFUNC-SQL/p[11]", "#XFUNC-SQL/p[3]", "#XFUNC-SQL/p[4]", "#XFUNC-SQL/p[6]", "#XFUNC-SQL/p[8]"]}], "language": "zh", "original_text": {"/versions/19/description/0": "SQL-language functions", "/versions/19/facts/0/label": "Kind", "/versions/19/facts/0/value": "Native function language", "/versions/19/facts/1/label": "Trusted", "/versions/19/facts/2/label": "Validator"}, "fallback_fields": [], "source_language": "en", "original_snapshot_sha256": "fa9a7d99664f7fe643b76f42892b7d0d5ce90ebb7d24e80a0fec1bcfd240fd71"}, "comparison_data": {"kind": "Native function language", "handler": "", "trusted": "t", "validator": "fmgr_sql_validator"}, "comparison_hash": "a4af9cf453d140d941e865b952c6a41e2b704a4b30cb77b61c1cdda8a77c5035", "manual_language": "zh"}, "20": {"facts": [{"label": "\u79cd\u7c7b", "value": "\u539f\u751f\u51fd\u6570\u8bed\u8a00"}, {"label": "\u53ef\u4fe1", "value": "t"}, {"label": "\u6821\u9a8c\u51fd\u6570", "value": "fmgr_sql_validator"}], "tables": [], "aliases": [], "catalog": {"oid": "14", "descr": "SQL-language functions", "lanacl": "_null_", "lanispl": "f", "lanname": "sql", "lanowner": "POSTGRES", "laninline": "0", "oid_symbol": "SQLlanguageId", "lanpltrusted": "t", "lanvalidator": "fmgr_sql_validator", "lanplcallfoid": "0"}, "related": [], "release": {"ref": "https://ftp.postgresql.org/pub/snapshot/dev/postgresql-snapshot.tar.bz2", "label": "20devel", "major": "20", "channel": "devel", "revision": "4d3346909b201ac1648232cf290462a7070c119326f56196f1f0253ed80fae41", "source_sha256": "4d3346909b201ac1648232cf290462a7070c119326f56196f1f0253ed80fae41", "catalog_fingerprint": "398fbb9f262264053c02fbf79f88be0a6770c1473faa6ecd5931d6ec41b8258b", "source_snapshot_utc": "26-Sep-2026 20:22"}, "sources": [{"url": "https://ftp.postgresql.org/pub/snapshot/dev/postgresql-snapshot.tar.bz2", "label": "Matching PostgreSQL source archive", "sha256": "4d3346909b201ac1648232cf290462a7070c119326f56196f1f0253ed80fae41"}, {"url": "https://pg.center/docs/devel/xfunc-sql.html", "path": "xfunc-sql.html", "label": "PostgreSQL 20 English manual", "sha256": "c0ebe4142e99545f0fe3e02b02f7573466de0fa21db7c51405f9ffd53eb0f067", "language": "en", "original_url": "/docs/devel/xfunc-sql.html"}], "sections": [], "signature": "", "attributes": {"kind": "Native function language", "handler": "", "trusted": "t", "validator": "fmgr_sql_validator"}, "description": ["SQL \u8bed\u8a00\u51fd\u6570"], "manual_html": "<div class=\"sect1\" id=\"XFUNC-SQL\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h2 class=\"title\" lang=\"zh\">36.5. \u67e5\u8be2\u8bed\u8a00\uff08SQL\uff09\u51fd\u6570</h2>\n</div>\n</div>\n</div>\n<p lang=\"zh\">SQL \u51fd\u6570\u6267\u884c\u7531\u4efb\u610f SQL \u8bed\u53e5\u7ec4\u6210\u7684\u4e00\u4e2a\u5217\u8868\uff0c\u5e76\u8fd4\u56de\u5217\u8868\u4e2d\u6700\u540e\u4e00\u4e2a\u67e5\u8be2\u7684\u7ed3\u679c\u3002\u5728\u7b80\u5355\uff08\u975e\u96c6\u5408\uff09\u60c5\u51b5\u4e0b\uff0c\u5c06\u8fd4\u56de\u6700\u540e\u4e00\u4e2a\u67e5\u8be2\u7ed3\u679c\u7684\u7b2c\u4e00\u884c\u3002\uff08\u8bf7\u8bb0\u4f4f\uff0c\u9664\u975e\u4f7f\u7528 <code class=\"literal\">ORDER BY</code>\uff0c\u5426\u5219\u591a\u884c\u7ed3\u679c\u4e2d\u7684<span class=\"quote\">\u201c<span class=\"quote\">\u7b2c\u4e00\u884c</span>\u201d</span>\u5e76\u6ca1\u6709\u660e\u786e\u5b9a\u4e49\u3002\uff09\u5982\u679c\u6700\u540e\u4e00\u4e2a\u67e5\u8be2\u5b8c\u5168\u6ca1\u6709\u8fd4\u56de\u4efb\u4f55\u884c\uff0c\u5219\u8fd4\u56de\u7a7a\u503c\u3002</p>\n<p lang=\"zh\">\u6216\u8005\uff0c\u4e00\u4e2a SQL \u51fd\u6570\u53ef\u4ee5\u901a\u8fc7\u6307\u5b9a\u51fd\u6570\u7684\u8fd4\u56de\u7c7b\u578b\u4e3a<code class=\"literal\">SETOF <em class=\"replaceable\"><code>sometype</code></em></code>\u88ab\u58f0\u660e\u4e3a\u8fd4\u56de\u4e00\u4e2a\u96c6\u5408\uff08\u4e5f\u5c31\u662f\u591a\u4e2a\u884c\uff09\uff0c\u6216\u8005\u7b49\u6548\u5730\u58f0\u660e\u5b83\u4e3a<code class=\"literal\">RETURNS TABLE(<em class=\"replaceable\"><code>columns</code></em>)</code>\u3002\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b\uff0c\u6700\u540e\u4e00\u4e2a\u67e5\u8be2\u7684\u7ed3\u679c\u7684\u6240\u6709\u884c\u4f1a\u88ab\u8fd4\u56de\u3002\u4e0b\u6587\u5c06\u7ed9\u51fa\u8fdb\u4e00\u6b65\u7684\u7ec6\u8282\u3002</p>\n<p lang=\"zh\">SQL \u51fd\u6570\u4f53\u5fc5\u987b\u662f\u4e00\u7ec4\u7528\u5206\u53f7\u5206\u9694\u7684 SQL \u8bed\u53e5\uff0c\u6700\u540e\u4e00\u6761\u8bed\u53e5\u540e\u7684\u5206\u53f7\u53ef\u7701\u7565\u3002\u9664\u975e\u51fd\u6570\u58f0\u660e\u4e3a\u8fd4\u56de void\uff0c\u5426\u5219\u6700\u540e\u4e00\u6761\u8bed\u53e5\u5fc5\u987b\u662f SELECT\uff0c\u6216\u5305\u542b RETURNING \u5b50\u53e5\u7684 INSERT\u3001UPDATE\u3001DELETE \u6216 MERGE\u3002</p>\n<p lang=\"zh\">\u4efb\u610f\u4e00\u7ec4 <acronym class=\"acronym\">SQL</acronym> \u8bed\u8a00\u547d\u4ee4\u90fd\u53ef\u4ee5\u6253\u5305\u5e76\u5b9a\u4e49\u6210\u51fd\u6570\u3002\u9664 <code class=\"command\">SELECT</code> \u67e5\u8be2\u5916\uff0c\u8fd9\u4e9b\u547d\u4ee4\u8fd8\u53ef\u4ee5\u5305\u542b\u6570\u636e\u4fee\u6539\u67e5\u8be2\uff08<code class=\"command\">INSERT</code>\u3001<code class=\"command\">UPDATE</code>\u3001<code class=\"command\">DELETE</code> \u548c <code class=\"command\">MERGE</code>\uff09\uff0c\u4ee5\u53ca\u5176\u4ed6 SQL \u547d\u4ee4\u3002\uff08\u5728 <acronym class=\"acronym\">SQL</acronym> \u51fd\u6570\u4e2d\u4e0d\u80fd\u4f7f\u7528\u4e8b\u52a1\u63a7\u5236\u547d\u4ee4\uff0c\u4f8b\u5982 <code class=\"command\">COMMIT</code>\u3001<code class=\"command\">SAVEPOINT</code>\uff0c\u4e5f\u4e0d\u80fd\u4f7f\u7528\u67d0\u4e9b\u5de5\u5177\u547d\u4ee4\uff0c\u4f8b\u5982 <code class=\"literal\">VACUUM</code>\u3002\uff09\u4e0d\u8fc7\uff0c\u6700\u540e\u4e00\u6761\u547d\u4ee4\u5fc5\u987b\u662f <code class=\"command\">SELECT</code>\uff0c\u6216\u8005\u5e26\u6709 <code class=\"literal\">RETURNING</code> \u5b50\u53e5\uff0c\u5e76\u8fd4\u56de\u4e0e\u51fd\u6570\u58f0\u660e\u8fd4\u56de\u7c7b\u578b\u76f8\u7b26\u7684\u7ed3\u679c\u3002\u6216\u8005\uff0c\u5982\u679c\u4f60\u60f3\u5b9a\u4e49\u4e00\u4e2a\u6267\u884c\u52a8\u4f5c\u4f46\u6ca1\u6709\u6709\u7528\u8fd4\u56de\u503c\u7684 SQL \u51fd\u6570\uff0c\u4e5f\u53ef\u4ee5\u628a\u5b83\u5b9a\u4e49\u4e3a\u8fd4\u56de <code class=\"type\">void</code>\u3002\u4f8b\u5982\uff0c\u4e0b\u9762\u8fd9\u4e2a\u51fd\u6570\u4f1a\u4ece <code class=\"literal\">emp</code> \u8868\u4e2d\u5220\u9664\u85aa\u8d44\u4e3a\u8d1f\u7684\u884c\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION clean_emp() RETURNS void AS '\n    DELETE FROM emp\n        WHERE salary &lt; 0;\n' LANGUAGE SQL;\n\nSELECT clean_emp();\n\n clean_emp\n-----------\n\n(1 row)\n</pre>\n<p lang=\"zh\">\u4f60\u4e5f\u53ef\u4ee5\u628a\u8fd9\u4e2a\u5199\u4e3a\u4e00\u4e2a\u8fc7\u7a0b\uff0c\u90a3\u6837\u907f\u514d\u8fd4\u56de\u7c7b\u578b\u7684\u95ee\u9898\u3002\u4f8b\u5982\uff1a</p>\n<pre class=\"screen\">CREATE PROCEDURE clean_emp() AS '\n    DELETE FROM emp\n        WHERE salary &lt; 0;\n' LANGUAGE SQL;\n\nCALL clean_emp();\n</pre>\n<p lang=\"zh\">\u5728\u50cf\u8fd9\u6837\u7684\u7b80\u5355\u60c5\u51b5\u4e2d\uff0c\u8fd4\u56de<code class=\"type\">void</code>\u7684\u51fd\u6570\u4e0e\u8fc7\u7a0b\u4e4b\u95f4\u7684\u5dee\u5f02\u4e3b\u8981\u662f\u98ce\u683c\u4e0a\u9762\u7684\u3002\u4e0d\u8fc7\uff0c\u8fc7\u7a0b\u8fd8\u63d0\u4f9b\u4e86\u51fd\u6570\u6240\u6ca1\u6709\u7684\u989d\u5916\u80fd\u529b\uff0c\u4f8b\u5982\u4e8b\u52a1\u63a7\u5236\u3002\u6b64\u5916\uff0c\u8fc7\u7a0b\u662f SQL \u6807\u51c6\u7684\u4e00\u90e8\u5206\uff0c\u800c\u8fd4\u56de<code class=\"type\">void</code>\u5219\u662f PostgreSQL \u6269\u5c55\u3002</p>\n<p lang=\"zh\"><code class=\"command\">CREATE FUNCTION</code> \u547d\u4ee4\u7684\u8bed\u6cd5\u8981\u6c42\u628a\u51fd\u6570\u4f53\u5199\u6210\u4e00\u4e2a\u5b57\u7b26\u4e32\u5e38\u91cf\u3002\u5bf9\u4e8e\u5b57\u7b26\u4e32\u5e38\u91cf\uff0c\u901a\u5e38\u4f7f\u7528\u7f8e\u5143\u5f15\u7528\u6700\u65b9\u4fbf\uff08\u89c1<a class=\"xref\" href=\"/docs/devel/sql-syntax-lexical.html#SQL-SYNTAX-DOLLAR-QUOTING\" title=\"4.1.2.4.\u00a0\u7f8e\u5143\u5f15\u7528\u7684\u5b57\u7b26\u4e32\u5e38\u91cf\">\u7b2c\u00a04.1.2.4\u00a0\u8282</a>\uff09\u3002\u5982\u679c\u4f60\u9009\u62e9\u4f7f\u7528\u5e38\u89c4\u7684\u5355\u5f15\u53f7\u5b57\u7b26\u4e32\u5e38\u91cf\u8bed\u6cd5\uff0c\u90a3\u4e48\u5fc5\u987b\u5728\u51fd\u6570\u4f53\u4e2d\u5c06\u5355\u5f15\u53f7\uff08<code class=\"literal\">'</code>\uff09\u548c\u53cd\u659c\u7ebf\uff08<code class=\"literal\">\\</code>\uff09\u5199\u6210\u53cc\u4efd\uff08\u5047\u5b9a\u4f7f\u7528\u8f6c\u4e49\u5b57\u7b26\u4e32\u8bed\u6cd5\uff0c\u89c1<a class=\"xref\" href=\"/docs/devel/sql-syntax-lexical.html#SQL-SYNTAX-STRINGS\" title=\"4.1.2.1.\u00a0\u5b57\u7b26\u4e32\u5e38\u91cf\">\u7b2c\u00a04.1.2.1\u00a0\u8282</a>\uff09\u3002</p>\n<div class=\"sect2\" id=\"XFUNC-SQL-FUNCTION-ARGUMENTS\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/devel/xfunc-sql.html#XFUNC-SQL-FUNCTION-ARGUMENTS\">36.5.1. <acronym class=\"acronym\">SQL</acronym>\u51fd\u6570\u7684\u53c2\u6570</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\">\u4e00\u4e2a SQL \u51fd\u6570\u7684\u53c2\u6570\u53ef\u4ee5\u5728\u51fd\u6570\u4f53\u4e2d\u7528\u540d\u79f0\u6216\u7f16\u53f7\u5f15\u7528\u3002\u4e0b\u9762\u4f1a\u6709\u4e24\u79cd\u65b9\u6cd5\u7684\u793a\u4f8b\u3002</p>\n<p lang=\"zh\">\u8981\u4f7f\u7528\u4e00\u4e2a\u540d\u79f0\uff0c\u5c06\u51fd\u6570\u53c2\u6570\u58f0\u660e\u4e3a\u5e26\u6709\u4e00\u4e2a\u540d\u79f0\uff0c\u7136\u540e\u5728\u51fd\u6570\u4f53\u4e2d\u53ea\u5199\u8be5\u540d\u79f0\u3002\u5982\u679c\u53c2\u6570\u540d\u79f0\u4e0e\u51fd\u6570\u5185\u5f53\u524d SQL \u547d\u4ee4\u4e2d\u7684\u4efb\u610f\u5217\u540d\u76f8\u540c\uff0c\u5217\u540d\u5c06\u4f18\u5148\u3002\u5982\u679c\u4e0d\u60f3\u8fd9\u6837\uff0c\u53ef\u4ee5\u7528\u51fd\u6570\u672c\u8eab\u7684\u540d\u79f0\u6765\u9650\u5b9a\u53c2\u6570\u540d\uff0c\u4e5f\u5c31\u662f<code class=\"literal\"><em class=\"replaceable\"><code>function_name</code></em>.<em class=\"replaceable\"><code>argument_name</code></em></code>\uff08\u5982\u679c\u8fd9\u4f1a\u4e0e\u4e00\u4e2a\u88ab\u9650\u5b9a\u7684\u5217\u540d\u51b2\u7a81\uff0c\u7167\u4f8b\u8fd8\u662f\u5217\u540d\u8d62\u5f97\u4f18\u5148\u3002\u4f60\u53ef\u4ee5\u901a\u8fc7\u4e3a SQL \u547d\u4ee4\u4e2d\u7684\u8868\u9009\u62e9\u4e00\u4e2a\u4e0d\u540c\u7684\u522b\u540d\u6765\u907f\u514d\u8fd9\u79cd\u6df7\u6dc6\uff09\u3002</p>\n<p lang=\"zh\">\u5728\u66f4\u65e7\u7684\u6570\u5b57\u65b9\u6cd5\u4e2d\uff0c\u53c2\u6570\u53ef\u4ee5\u7528\u8bed\u6cd5<code class=\"literal\">$<em class=\"replaceable\"><code>n</code></em></code>\u5f15\u7528\uff1a<code class=\"literal\">$1</code>\u6307\u7684\u662f\u7b2c\u4e00\u4e2a\u8f93\u5165\u53c2\u6570\uff0c<code class=\"literal\">$2</code>\u6307\u7684\u662f\u7b2c\u4e8c\u4e2a\uff0c\u4ee5\u6b64\u7c7b\u63a8\u3002\u4e0d\u7ba1\u7279\u5b9a\u7684\u53c2\u6570\u662f\u5426\u4f7f\u7528\u540d\u79f0\u58f0\u660e\uff0c\u8fd9\u79cd\u65b9\u6cd5\u90fd\u6709\u6548\u3002</p>\n<p lang=\"zh\">\u5982\u679c\u4e00\u4e2a\u53c2\u6570\u662f\u4e00\u79cd\u590d\u5408\u7c7b\u578b\uff0c\u90a3\u4e48\u70b9\u53f7\u8bb0\u6cd5\uff08\u5982 <code class=\"literal\"><em class=\"replaceable\"><code>argname</code></em>.<em class=\"replaceable\"><code>fieldname</code></em></code> \u6216<code class=\"literal\">$1.<em class=\"replaceable\"><code>fieldname</code></em></code>\uff09\u4e5f\u53ef\u4ee5\u88ab\u7528\u6765\u8bbf\u95ee\u8be5\u53c2\u6570\u7684\u5c5e\u6027\u3002\u540c\u6837\uff0c\u4f60\u53ef\u80fd\u9700\u8981\u7528\u51fd\u6570\u7684\u540d\u79f0\u6765\u9650\u5b9a\u53c2\u6570\u7684\u540d\u79f0\u4ee5\u907f\u514d\u6b67\u4e49\u3002</p>\n<p lang=\"zh\">SQL \u51fd\u6570\u53c2\u6570\u53ea\u80fd\u88ab\u7528\u4f5c\u6570\u636e\u503c\u800c\u4e0d\u80fd\u4f5c\u4e3a\u6807\u8bc6\u7b26\u3002\u4f8b\u5982\u8fd9\u662f\u5408\u7406\u7684\uff1a</p>\n<pre class=\"programlisting\">INSERT INTO mytable VALUES ($1);\n</pre>\n<p lang=\"zh\">\u4f46\u8fd9\u6837\u5c31\u4e0d\u884c\uff1a</p>\n<pre class=\"programlisting\">INSERT INTO $1 VALUES (42);\n</pre>\n<div class=\"note\">\n<h3 class=\"title\" lang=\"zh\">\u6ce8\u610f</h3>\n<p lang=\"zh\">PostgreSQL 9.2 \u5f00\u59cb\u652f\u6301\u901a\u8fc7\u540d\u79f0\u5f15\u7528 SQL \u51fd\u6570\u53c2\u6570\u3002\u9700\u8981\u7528\u4e8e\u66f4\u65e9\u7248\u672c\u670d\u52a1\u5668\u7684\u51fd\u6570\u5fc5\u987b\u4f7f\u7528 $n \u8bb0\u6cd5\u3002</p>\n</div>\n</div>\n<div class=\"sect2\" id=\"XFUNC-SQL-BASE-FUNCTIONS\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/devel/xfunc-sql.html#XFUNC-SQL-BASE-FUNCTIONS\">36.5.2. \u57fa\u7840\u7c7b\u578b\u4e0a\u7684<acronym class=\"acronym\">SQL</acronym>\u51fd\u6570</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\">\u6700\u7b80\u5355\u7684 <acronym class=\"acronym\">SQL</acronym> \u51fd\u6570\u6ca1\u6709\u53c2\u6570\uff0c\u53ea\u662f\u8fd4\u56de\u4e00\u4e2a\u57fa\u7840\u7c7b\u578b\uff0c\u4f8b\u5982 <code class=\"type\">integer</code>\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION one() RETURNS integer AS $$\n    SELECT 1 AS result;\n$$ LANGUAGE SQL;\n\n-- Alternative syntax for string literal:\nCREATE FUNCTION one() RETURNS integer AS '\n    SELECT 1 AS result;\n' LANGUAGE SQL;\n\nSELECT one();\n\n one\n-----\n   1\n</pre>\n<p lang=\"zh\">\u6ce8\u610f\u6211\u4eec\u4e3a\u8be5\u51fd\u6570\u7684\u7ed3\u679c\u5728\u51fd\u6570\u4f53\u5185\u5b9a\u4e49\u4e86\u4e00\u4e2a\u5217\u522b\u540d\uff08\u540d\u4e3a<code class=\"literal\">result</code>\uff09\uff0c\u4f46\u662f\u8fd9\u4e2a\u5217\u522b\u540d\u5728\u51fd\u6570\u4ee5\u5916\u662f\u4e0d\u53ef\u89c1\u7684\u3002\u56e0\u6b64\uff0c\u7ed3\u679c\u88ab\u6807\u8bb0\u4e3a<code class=\"literal\">one</code>\u800c\u4e0d\u662f<code class=\"literal\">result</code>\u3002</p>\n<p lang=\"zh\">\u5b9a\u4e49\u63a5\u53d7\u57fa\u7840\u7c7b\u578b\u53c2\u6570\u7684 <acronym class=\"acronym\">SQL</acronym> \u51fd\u6570\u4e5f\u51e0\u4e4e\u540c\u6837\u5bb9\u6613\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION add_em(x integer, y integer) RETURNS integer AS $$\n    SELECT x + y;\n$$ LANGUAGE SQL;\n\nSELECT add_em(1, 2) AS answer;\n\n answer\n--------\n      3\n</pre>\n<p lang=\"zh\">\u6216\u8005\uff0c\u6211\u4eec\u4e5f\u53ef\u4ee5\u4e0d\u7528\u53c2\u6570\u540d\uff0c\u800c\u6539\u7528\u6570\u5b57\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION add_em(integer, integer) RETURNS integer AS $$\n    SELECT $1 + $2;\n$$ LANGUAGE SQL;\n\nSELECT add_em(1, 2) AS answer;\n\n answer\n--------\n      3\n</pre>\n<p lang=\"zh\">\u4e0b\u9762\u662f\u4e00\u4e2a\u66f4\u6709\u7528\u7684\u51fd\u6570\uff0c\u5b83\u53ef\u4ee5\u7528\u6765\u4ece\u94f6\u884c\u8d26\u6237\u4e2d\u6263\u6b3e\uff1a</p>\n<pre class=\"programlisting\">CREATE FUNCTION tf1 (accountno integer, debit numeric) RETURNS numeric AS $$\n    UPDATE bank\n        SET balance = balance - debit\n        WHERE accountno = tf1.accountno;\n    SELECT 1;\n$$ LANGUAGE SQL;\n</pre>\n<p lang=\"zh\">\u7528\u6237\u53ef\u4ee5\u8fd9\u6837\u6267\u884c\u8be5\u51fd\u6570\uff0c\u4ece 17 \u53f7\u8d26\u6237\u4e2d\u6263\u9664 $100.00\uff1a</p>\n<pre class=\"programlisting\">SELECT tf1(17, 100.0);\n</pre>\n<p lang=\"zh\">\u5728\u8fd9\u4e2a\u793a\u4f8b\u4e2d\uff0c\u6211\u4eec\u4e3a\u7b2c\u4e00\u4e2a\u53c2\u6570\u9009\u62e9\u4e86\u540d\u79f0<code class=\"literal\">accountno</code>\uff0c\u4f46\u662f\u8fd9\u548c\u8868<code class=\"structname\">bank</code>\u4e2d\u7684\u4e00\u4e2a\u5217\u540d\u76f8\u540c\u3002\u5728<code class=\"command\">UPDATE</code>\u547d\u4ee4\u4e2d\uff0c<code class=\"literal\">accountno</code>\u5f15\u7528\u5217<code class=\"structfield\">bank.accountno</code>\uff0c\u56e0\u6b64 <code class=\"literal\">tf1.accountno</code>\u5fc5\u987b\u88ab\u7528\u6765\u5f15\u7528\u8be5\u53c2\u6570\u3002\u6211\u4eec\u5f53\u7136\u53ef\u4ee5\u901a\u8fc7\u4e3a\u8be5\u53c2\u6570\u4f7f\u7528\u4e00\u4e2a\u4e0d\u540c\u7684\u540d\u79f0\u6765\u907f\u514d\u8fd9\u6837\u7684\u95ee\u9898\u3002</p>\n<p lang=\"zh\">\u5b9e\u9645\u4e0a\u6211\u4eec\u53ef\u80fd\u559c\u6b22\u4ece\u8be5\u51fd\u6570\u5f97\u5230\u4e00\u4e2a\u66f4\u6709\u7528\u7684\u7ed3\u679c\u800c\u4e0d\u662f\u4e00\u4e2a\u5e38\u6570 1\uff0c\u56e0\u6b64\u4e00\u4e2a\u66f4\u53ef\u80fd\u7684\u5b9a\u4e49\u662f\uff1a</p>\n<pre class=\"programlisting\">CREATE FUNCTION tf1 (accountno integer, debit numeric) RETURNS numeric AS $$\n    UPDATE bank\n        SET balance = balance - debit\n        WHERE accountno = tf1.accountno;\n    SELECT balance FROM bank WHERE accountno = tf1.accountno;\n$$ LANGUAGE SQL;\n</pre>\n<p lang=\"zh\">\u5b83\u4f1a\u8c03\u6574\u4f59\u989d\u5e76\u4e14\u8fd4\u56de\u65b0\u7684\u4f59\u989d\u3002\u540c\u6837\u7684\u4e8b\u60c5\u4e5f\u53ef\u4ee5\u7528\u4e00\u4e2a\u4f7f\u7528<code class=\"literal\">RETURNING</code>\u7684\u547d\u4ee4\u5b9e\u73b0\uff1a</p>\n<pre class=\"programlisting\">CREATE FUNCTION tf1 (accountno integer, debit numeric) RETURNS numeric AS $$\n    UPDATE bank\n        SET balance = balance - debit\n        WHERE accountno = tf1.accountno\n    RETURNING balance;\n$$ LANGUAGE SQL;\n</pre>\n<p lang=\"zh\">\u5982\u679c\u5728<code class=\"literal\">SELECT</code>\u6216<code class=\"literal\">RETURNING</code>\u5b50\u53e5\u4e2d\uff0c<acronym class=\"acronym\">SQL</acronym>\u51fd\u6570\u7684\u6700\u7ec8\u8fd4\u56de\u503c\u7c7b\u578b\u4e0e\u51fd\u6570\u58f0\u660e\u7684\u7ed3\u679c\u7c7b\u578b\u4e0d\u5b8c\u5168\u5339\u914d\uff0c\u5982\u679c\u53ef\u4ee5\u4f7f\u7528\u9690\u5f0f\u6216\u8d4b\u503c\u8f6c\u6362\uff0c<span class=\"productname\">PostgreSQL</span>\u5c06\u81ea\u52a8\u5c06\u8be5\u503c\u8f6c\u6362\u4e3a\u6240\u9700\u7c7b\u578b\u3002\u5426\u5219\uff0c\u4f60\u5fc5\u987b\u5199\u51fa\u663e\u5f0f\u7c7b\u578b\u8f6c\u6362\u3002\u4f8b\u5982\uff0c\u5047\u8bbe\u6211\u4eec\u5e0c\u671b\u524d\u9762\u7684<code class=\"function\">add_em</code>\u51fd\u6570\u8fd4\u56de<code class=\"type\">float8</code>\u7c7b\u578b\u3002\u53ea\u9700\u7f16\u5199</p>\n<pre class=\"programlisting\">CREATE FUNCTION add_em(integer, integer) RETURNS float8 AS $$\n    SELECT $1 + $2;\n$$ LANGUAGE SQL;\n</pre>\n<p lang=\"zh\">\u56e0\u4e3a<code class=\"type\">integer</code>\u7684\u548c\u53ef\u4ee5\u9690\u5f0f\u8f6c\u6362\u4e3a<code class=\"type\">float8</code>\u3002\uff08\u6709\u5173\u8f6c\u6362\u7684\u66f4\u591a\u4fe1\u606f\uff0c\u8bf7\u53c2\u89c1<a class=\"xref\" href=\"/docs/devel/typeconv.html\" title=\"\u7b2c\u00a010\u00a0\u7ae0\u00a0\u7c7b\u578b\u8f6c\u6362\">\u7b2c\u00a010\u00a0\u7ae0</a>\u6216<a class=\"xref\" href=\"/docs/devel/sql-createcast.html\" title=\"CREATE CAST\"><span class=\"refentrytitle\">CREATE CAST</span></a>\u3002\uff09</p>\n</div>\n<div class=\"sect2\" id=\"XFUNC-SQL-COMPOSITE-FUNCTIONS\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/devel/xfunc-sql.html#XFUNC-SQL-COMPOSITE-FUNCTIONS\">36.5.3. \u590d\u5408\u7c7b\u578b\u4e0a\u7684<acronym class=\"acronym\">SQL</acronym>\u51fd\u6570</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\">\u7f16\u5199\u63a5\u53d7\u590d\u5408\u7c7b\u578b\u53c2\u6570\u7684\u51fd\u6570\u65f6\uff0c\u6211\u4eec\u4e0d\u4ec5\u5fc5\u987b\u6307\u5b9a\u8981\u7528\u54ea\u4e2a\u53c2\u6570\uff0c\u8fd8\u5fc5\u987b\u6307\u5b9a\u8be5\u53c2\u6570\u7684\u54ea\u4e2a\u5c5e\u6027\uff08\u5b57\u6bb5\uff09\u3002\u4f8b\u5982\uff0c\u5047\u8bbe <code class=\"type\">emp</code> \u662f\u4e00\u4e2a\u5305\u542b\u96c7\u5458\u6570\u636e\u7684\u8868\uff0c\u56e0\u6b64\u5b83\u4e5f\u662f\u8be5\u8868\u6bcf\u4e00\u884c\u5bf9\u5e94\u7684\u590d\u5408\u7c7b\u578b\u540d\u79f0\u3002\u4e0b\u9762\u7684\u51fd\u6570 <code class=\"function\">double_salary</code> \u7528\u6765\u8ba1\u7b97\u67d0\u4eba\u7684\u5de5\u8d44\u7ffb\u500d\u540e\u4f1a\u662f\u591a\u5c11\uff1a</p>\n<pre class=\"screen\">CREATE TABLE emp (\n    name        text,\n    salary      numeric,\n    age         integer,\n    cubicle     point\n);\n\nINSERT INTO emp VALUES ('Bill', 4200, 45, '(2,1)');\n\nCREATE FUNCTION double_salary(emp) RETURNS numeric AS $$\n    SELECT $1.salary * 2 AS salary;\n$$ LANGUAGE SQL;\n\nSELECT name, double_salary(emp.*) AS dream\n    FROM emp\n    WHERE emp.cubicle ~= point '(2,1)';\n\n name | dream\n------+-------\n Bill |  8400\n</pre>\n<p lang=\"zh\">\u6ce8\u610f\u8fd9\u91cc\u7528 <code class=\"literal\">$1.salary</code> \u8bed\u6cd5\u6765\u9009\u53d6\u53c2\u6570\u884c\u503c\u4e2d\u7684\u4e00\u4e2a\u5b57\u6bb5\u3002\u8fd8\u8981\u6ce8\u610f\uff0c\u8c03\u7528\u65f6\u7684 <code class=\"command\">SELECT</code> \u547d\u4ee4\u4f7f\u7528 <em class=\"replaceable\"><code>table_name</code></em><code class=\"literal\">.*</code> \u5c06\u8868\u7684\u5f53\u524d\u6574\u884c\u53d6\u4f5c\u4e00\u4e2a\u590d\u5408\u503c\u3002\u8be5\u8868\u884c\u4e5f\u53ef\u4ee5\u4ec5\u7528\u8868\u540d\u6765\u5f15\u7528\uff1a</p>\n<pre class=\"screen\">SELECT name, double_salary(emp) AS dream\n    FROM emp\n    WHERE emp.cubicle ~= point '(2,1)';\n</pre>\n<p lang=\"zh\">\u4f46\u8fd9\u79cd\u7528\u6cd5\u5df2\u88ab\u5f03\u7528\uff0c\u56e0\u4e3a\u5b83\u5f88\u5bb9\u6613\u8ba9\u4eba\u6df7\u6dc6\uff08\u5173\u4e8e\u8868\u884c\u590d\u5408\u503c\u8fd9\u4e24\u79cd\u8bb0\u6cd5\u7684\u66f4\u591a\u7ec6\u8282\uff0c\u89c1<a class=\"xref\" href=\"/docs/devel/rowtypes.html#ROWTYPES-USAGE\" title=\"8.16.5.\u00a0\u5728\u67e5\u8be2\u4e2d\u4f7f\u7528\u590d\u5408\u7c7b\u578b\">\u7b2c\u00a08.16.5\u00a0\u8282</a>\uff09\u3002</p>\n<p lang=\"zh\">\u6709\u65f6\u5019\u5373\u65f6\u6784\u9020\u4e00\u4e2a\u590d\u5408\u53c2\u6570\u503c\u4f1a\u5f88\u65b9\u4fbf\u3002\u8fd9\u53ef\u4ee5\u7528<code class=\"literal\">ROW</code>\u6784\u9020\u5668\u5b8c\u6210\u3002\u4f8b\u5982\uff0c\u6211\u4eec\u53ef\u4ee5\u8c03\u6574\u88ab\u4f20\u9012\u7ed9\u51fd\u6570\u7684\u6570\u636e\uff1a</p>\n<pre class=\"screen\">SELECT name, double_salary(ROW(name, salary*1.1, age, cubicle)) AS dream\n    FROM emp;\n</pre>\n<p lang=\"zh\">\u4e5f\u53ef\u4ee5\u6784\u5efa\u4e00\u4e2a\u8fd4\u56de\u590d\u5408\u7c7b\u578b\u7684\u51fd\u6570\u3002\u8fd9\u662f\u4e00\u4e2a\u8fd4\u56de\u5355\u4e00<code class=\"type\">emp</code>\u884c\u7684\u51fd\u6570\u793a\u4f8b\uff1a</p>\n<pre class=\"programlisting\">CREATE FUNCTION new_emp() RETURNS emp AS $$\n    SELECT text 'None' AS name,\n        1000.0 AS salary,\n        25 AS age,\n        point '(2,2)' AS cubicle;\n$$ LANGUAGE SQL;\n</pre>\n<p lang=\"zh\">\u5728\u8fd9\u4e2a\u793a\u4f8b\u4e2d\uff0c\u6211\u4eec\u4e3a\u6bcf\u4e00\u4e2a\u5c5e\u6027\u6307\u5b9a\u4e86\u4e00\u4e2a\u5e38\u91cf\u503c\uff0c\u4f46\u662f\u53ef\u4ee5\u7528\u4efb\u4f55\u8ba1\u7b97\u6765\u66ff\u6362\u8fd9\u4e9b\u5e38\u91cf\u3002</p>\n<p lang=\"zh\">\u5b9a\u4e49\u8be5\u51fd\u6570\u65f6\u6709\u4e24\u70b9\u91cd\u8981\u6ce8\u610f\u4e8b\u9879\uff1a</p>\n<div class=\"itemizedlist\">\n<ul class=\"itemizedlist\">\n<li class=\"listitem\" lang=\"zh\">\n<p>\u67e5\u8be2\u4e2d\u7684\u9009\u62e9\u5217\u8868\u987a\u5e8f\u5fc5\u987b\u4e0e\u5217\u5728\u590d\u5408\u7c7b\u578b\u4e2d\u51fa\u73b0\u7684\u987a\u5e8f\u5b8c\u5168\u76f8\u540c\u3002\uff08\u7cfb\u7edf\u4e0d\u8003\u8651\u50cf\u4e0a\u9762\u8fd9\u6837\u6307\u5b9a\u7684\u5217\u540d\u3002\uff09</p>\n</li>\n<li class=\"listitem\" lang=\"zh\">\n<p>\u6211\u4eec\u5fc5\u987b\u786e\u4fdd\u6bcf\u4e2a\u8868\u8fbe\u5f0f\u7684\u7c7b\u578b\u90fd\u53ef\u4ee5\u8f6c\u6362\u4e3a\u590d\u5408\u7c7b\u578b\u7684\u76f8\u5e94\u5217\u7684\u7c7b\u578b\u3002\u5426\u5219\u6211\u4eec\u4f1a\u5f97\u5230\u8fd9\u6837\u7684\u9519\u8bef\uff1a</p>\n<pre class=\"screen\">\n<code class=\"computeroutput\">\nERROR:  return type mismatch in function declared to return emp\nDETAIL:  Final statement returns text instead of point at column 4.\n</code>\n</pre>\n<p>\u4e0e\u57fa\u7840\u7c7b\u578b\u7684\u60c5\u51b5\u4e00\u6837\uff0c\u7cfb\u7edf\u4e0d\u4f1a\u81ea\u52a8\u63d2\u5165\u663e\u5f0f\u8f6c\u6362\uff0c\u53ea\u4f1a\u63d2\u5165\u9690\u5f0f\u6216\u8d4b\u503c\u8f6c\u6362\u3002</p>\n</li>\n</ul>\n</div>\n<p lang=\"zh\">\u5b9a\u4e49\u540c\u6837\u7684\u51fd\u6570\u7684\u4e00\u79cd\u4e0d\u540c\u7684\u65b9\u6cd5\u662f\uff1a</p>\n<pre class=\"programlisting\">CREATE FUNCTION new_emp() RETURNS emp AS $$\n    SELECT ROW('None', 1000.0, 25, '(2,2)')::emp;\n$$ LANGUAGE SQL;\n</pre>\n<p lang=\"zh\">\u8fd9\u91cc\u6211\u4eec\u5199\u4e86\u4e00\u4e2a\u53ea\u8fd4\u56de\u5355\u5217\u3001\u4e14\u8be5\u5217\u5177\u6709\u6b63\u786e\u590d\u5408\u7c7b\u578b\u7684 <code class=\"command\">SELECT</code>\u3002\u5728\u8fd9\u79cd\u573a\u666f\u4e0b\uff0c\u8fd9\u6837\u5199\u5e76\u4e0d\u89c1\u5f97\u66f4\u597d\uff0c\u4f46\u5728\u67d0\u4e9b\u60c5\u51b5\u4e0b\u4f1a\u5f88\u65b9\u4fbf \u2014 \u4f8b\u5982\uff0c\u9700\u8981\u901a\u8fc7\u8c03\u7528\u53e6\u4e00\u4e2a\u8fd4\u56de\u76ee\u6807\u590d\u5408\u503c\u7684\u51fd\u6570\u6765\u8ba1\u7b97\u7ed3\u679c\u65f6\u3002\u8fd8\u6709\u4e00\u79cd\u60c5\u51b5\u662f\uff0c\u5982\u679c\u6211\u4eec\u8981\u7f16\u5199\u7684\u51fd\u6570\u8fd4\u56de\u7684\u662f\u57fa\u4e8e\u590d\u5408\u7c7b\u578b\u7684\u57df\uff0c\u800c\u4e0d\u662f\u666e\u901a\u590d\u5408\u7c7b\u578b\uff0c\u90a3\u4e48\u5c31\u5fc5\u987b\u5199\u6210\u8fd4\u56de\u5355\u5217\u7684\u5f62\u5f0f\uff0c\u56e0\u4e3a\u6ca1\u6709\u529e\u6cd5\u8ba9\u6574\u884c\u7ed3\u679c\u53d1\u751f\u6240\u9700\u7684\u5f3a\u5236\u8f6c\u6362\u3002</p>\n<p lang=\"zh\">\u6211\u4eec\u65e2\u53ef\u4ee5\u628a\u8fd9\u4e2a\u51fd\u6570\u76f4\u63a5\u5f53\u4f5c\u503c\u8868\u8fbe\u5f0f\u8c03\u7528\uff1a</p>\n<pre class=\"screen\">SELECT new_emp();\n\n         new_emp\n--------------------------\n (None,1000.0,25,\"(2,2)\")\n</pre>\n<p lang=\"zh\">\u4e5f\u53ef\u4ee5\u628a\u5b83\u5f53\u4f5c\u8868\u51fd\u6570\u6765\u8c03\u7528\uff1a</p>\n<pre class=\"screen\">SELECT * FROM new_emp();\n\n name | salary | age | cubicle\n------+--------+-----+---------\n None | 1000.0 |  25 | (2,2)\n</pre>\n<p lang=\"zh\">\u7b2c\u4e8c\u79cd\u65b9\u5f0f\u4f1a\u5728<a class=\"xref\" href=\"/docs/devel/xfunc-sql.html#XFUNC-SQL-TABLE-FUNCTIONS\" title=\"36.5.8.\u00a0SQL \u51fd\u6570\u4f5c\u4e3a\u8868\u6765\u6e90\">\u7b2c\u00a036.5.8\u00a0\u8282</a>\u4e2d\u8fdb\u4e00\u6b65\u8bf4\u660e\u3002</p>\n<p lang=\"zh\">\u5f53\u4f60\u4f7f\u7528\u8fd4\u56de\u590d\u5408\u7c7b\u578b\u7684\u51fd\u6570\u65f6\uff0c\u53ef\u80fd\u53ea\u9700\u8981\u53d6\u5176\u7ed3\u679c\u4e2d\u7684\u4e00\u4e2a\u5b57\u6bb5\uff08\u5c5e\u6027\uff09\u3002\u53ef\u4ee5\u4f7f\u7528\u4e0b\u9762\u8fd9\u6837\u7684\u8bed\u6cd5\uff1a</p>\n<pre class=\"screen\">SELECT (new_emp()).name;\n\n name\n------\n None\n</pre>\n<p lang=\"zh\">\u8fd9\u91cc\u9700\u8981\u989d\u5916\u7684\u62ec\u53f7\uff0c\u4ee5\u514d\u89e3\u6790\u5668\u4ea7\u751f\u6b67\u4e49\u3002\u5982\u679c\u4e0d\u52a0\u62ec\u53f7\uff0c\u7ed3\u679c\u4f1a\u662f\u8fd9\u6837\uff1a</p>\n<pre class=\"screen\">SELECT new_emp().name;\nERROR:  syntax error at or near \".\"\nLINE 1: SELECT new_emp().name;\n                        ^\n</pre>\n<p lang=\"zh\">\u53e6\u4e00\u79cd\u9009\u62e9\u662f\u4f7f\u7528\u51fd\u6570\u8bb0\u6cd5\u6765\u63d0\u53d6\u5c5e\u6027\uff1a</p>\n<pre class=\"screen\">SELECT name(new_emp());\n\n name\n------\n None\n</pre>\n<p lang=\"zh\">\u5982<a class=\"xref\" href=\"/docs/devel/rowtypes.html#ROWTYPES-USAGE\" title=\"8.16.5.\u00a0\u5728\u67e5\u8be2\u4e2d\u4f7f\u7528\u590d\u5408\u7c7b\u578b\">\u7b2c\u00a08.16.5\u00a0\u8282</a>\u6240\u8ff0\uff0c\u5b57\u6bb5\u8bb0\u6cd5\u548c\u51fd\u6570\u8bb0\u6cd5\u662f\u7b49\u4ef7\u7684\u3002</p>\n<p lang=\"zh\">\u53e6\u4e00\u79cd\u4f7f\u7528\u51fd\u6570\u8fd4\u56de\u590d\u5408\u7c7b\u578b\u7684\u65b9\u6cd5\u662f\u5c06\u7ed3\u679c\u4f20\u9012\u7ed9\u53e6\u4e00\u4e2a\u63a5\u53d7\u6b63\u786e\u884c\u7c7b\u578b\u4f5c\u4e3a\u8f93\u5165\u7684\u51fd\u6570\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION getname(emp) RETURNS text AS $$\n    SELECT $1.name;\n$$ LANGUAGE SQL;\n\nSELECT getname(new_emp());\n getname\n---------\n None\n(1 row)\n</pre>\n</div>\n<div class=\"sect2\" id=\"XFUNC-OUTPUT-PARAMETERS\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/devel/xfunc-sql.html#XFUNC-OUTPUT-PARAMETERS\">36.5.4. \u5e26\u6709\u8f93\u51fa\u53c2\u6570\u7684<acronym class=\"acronym\">SQL</acronym>\u51fd\u6570</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\">\u63cf\u8ff0\u51fd\u6570\u7ed3\u679c\u7684\u53e6\u4e00\u79cd\u65b9\u6cd5\u662f\u4f7f\u7528<em class=\"firstterm\">\u8f93\u51fa\u53c2\u6570</em>\uff0c\u4f8b\u5982\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION add_em (IN x int, IN y int, OUT sum int)\nAS 'SELECT x + y'\nLANGUAGE SQL;\n\nSELECT add_em(3,7);\n add_em\n--------\n     10\n(1 row)\n</pre>\n<p lang=\"zh\">\u8fd9\u4e0e<a class=\"xref\" href=\"/docs/devel/xfunc-sql.html#XFUNC-SQL-BASE-FUNCTIONS\" title=\"36.5.2.\u00a0\u57fa\u7840\u7c7b\u578b\u4e0a\u7684SQL\u51fd\u6570\">\u7b2c\u00a036.5.2\u00a0\u8282</a>\u4e2d\u5c55\u793a\u7684 <code class=\"literal\">add_em</code> \u7248\u672c\u672c\u8d28\u4e0a\u5e76\u65e0\u4e0d\u540c\u3002\u8f93\u51fa\u53c2\u6570\u7684\u771f\u6b63\u4ef7\u503c\u5728\u4e8e\uff0c\u5b83\u4eec\u4e3a\u5b9a\u4e49\u8fd4\u56de\u591a\u5217\u7684\u51fd\u6570\u63d0\u4f9b\u4e86\u4e00\u79cd\u65b9\u4fbf\u7684\u65b9\u6cd5\u3002\u4f8b\u5982\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION sum_n_product (x int, y int, OUT sum int, OUT product int)\nAS 'SELECT x + y, x * y'\nLANGUAGE SQL;\n\n SELECT * FROM sum_n_product(11,42);\n sum | product\n-----+---------\n  53 |     462\n(1 row)\n</pre>\n<p lang=\"zh\">\u8fd9\u91cc\u672c\u8d28\u4e0a\u53d1\u751f\u7684\u4e8b\u60c5\u662f\uff1a\u6211\u4eec\u4e3a\u8be5\u51fd\u6570\u7684\u7ed3\u679c\u521b\u5efa\u4e86\u4e00\u4e2a\u533f\u540d\u590d\u5408\u7c7b\u578b\u3002\u4e0a\u9762\u7684\u793a\u4f8b\u4e0e\u4e0b\u9762\u8fd9\u79cd\u5199\u6cd5\u7684\u6700\u7ec8\u6548\u679c\u76f8\u540c\uff1a</p>\n<pre class=\"screen\">CREATE TYPE sum_prod AS (sum int, product int);\n\nCREATE FUNCTION sum_n_product (int, int) RETURNS sum_prod\nAS 'SELECT $1 + $2, $1 * $2'\nLANGUAGE SQL;\n</pre>\n<p lang=\"zh\">\u4f46\u901a\u5e38\u4e0d\u5fc5\u989d\u5916\u5b9a\u4e49\u4e00\u4e2a\u72ec\u7acb\u7684\u590d\u5408\u7c7b\u578b\u4f1a\u66f4\u65b9\u4fbf\u3002\u6ce8\u610f\uff0c\u9644\u5728\u8f93\u51fa\u53c2\u6570\u4e0a\u7684\u540d\u79f0\u5e76\u975e\u53ea\u662f\u88c5\u9970\uff0c\u5b83\u4eec\u51b3\u5b9a\u4e86\u8fd9\u4e2a\u533f\u540d\u590d\u5408\u7c7b\u578b\u7684\u5217\u540d\u3002\uff08\u5982\u679c\u7701\u7565\u8f93\u51fa\u53c2\u6570\u540d\u79f0\uff0c\u7cfb\u7edf\u4f1a\u81ea\u884c\u9009\u62e9\u4e00\u4e2a\u540d\u79f0\u3002\uff09</p>\n<p lang=\"zh\">\u5728\u4ece SQL \u8c03\u7528\u8fd9\u6837\u4e00\u4e2a\u51fd\u6570\u65f6\uff0c\u8f93\u51fa\u53c2\u6570\u4e0d\u4f1a\u88ab\u5305\u62ec\u5728\u8c03\u7528\u53c2\u6570\u5217\u8868\u4e2d\u3002\u8fd9\u662f\u56e0\u4e3a<span class=\"productname\">PostgreSQL</span>\u53ea\u8003\u8651\u8f93\u5165\u53c2\u6570\u6765\u5b9a\u4e49\u51fd\u6570\u7684\u8c03\u7528\u7b7e\u540d\u3002\u8fd9\u4e5f\u610f\u5473\u7740\u5728\u4e3a\u8bf8\u5982\u5220\u9664\u51fd\u6570\u7b49\u76ee\u7684\u5f15\u7528\u8be5\u51fd\u6570\u65f6\u53ea\u6709\u8f93\u5165\u53c2\u6570\u6709\u5173\u7cfb\u3002\u6211\u4eec\u53ef\u4ee5\u7528\u4e0b\u9762\u7684\u547d\u4ee4\u4e4b\u4e00\u5220\u9664\u4e0a\u8ff0\u51fd\u6570</p>\n<pre class=\"screen\">DROP FUNCTION sum_n_product (x int, y int, OUT sum int, OUT product int);\nDROP FUNCTION sum_n_product (int, int);\n</pre>\n<p lang=\"zh\">\u53c2\u6570\u53ef\u4ee5\u88ab\u6807\u8bb0\u4e3a<code class=\"literal\">IN</code>\uff08\u9ed8\u8ba4\uff09\u3001<code class=\"literal\">OUT</code>\u3001<code class=\"literal\">INOUT</code>\u6216\u8005<code class=\"literal\">VARIADIC</code>\u3002\u4e00\u4e2a<code class=\"literal\">INOUT</code>\u53c2\u6570\u65e2\u4f5c\u4e3a\u4e00\u4e2a\u8f93\u5165\u53c2\u6570\uff08\u8c03\u7528\u53c2\u6570\u5217\u8868\u7684\u4e00\u90e8\u5206\uff09\u53c8\u4f5c\u4e3a\u4e00\u4e2a\u8f93\u51fa\u53c2\u6570\uff08\u7ed3\u679c\u8bb0\u5f55\u7c7b\u578b\u7684\u4e00\u90e8\u5206\uff09\u3002<code class=\"literal\">VARIADIC</code>\u53c2\u6570\u662f\u8f93\u5165\u53c2\u6570\uff0c\u4f46\u88ab\u6309\u7167\u4e0b\u6587\u6240\u8ff0\u7279\u6b8a\u5bf9\u5f85\u3002</p>\n</div>\n<div class=\"sect2\" id=\"XFUNC-OUTPUT-PARAMETERS-PROC\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/devel/xfunc-sql.html#XFUNC-OUTPUT-PARAMETERS-PROC\">36.5.5. \u5e26\u6709\u8f93\u51fa\u53c2\u6570\u7684<acronym class=\"acronym\">SQL</acronym>\u8fc7\u7a0b</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\">\u8fc7\u7a0b\u4e5f\u652f\u6301\u8f93\u51fa\u53c2\u6570\uff0c\u4f46\u662f\u5b83\u4eec\u7684\u5de5\u4f5c\u65b9\u5f0f\u4e0e\u51fd\u6570\u7565\u6709\u4e0d\u540c\u3002\u5728<code class=\"command\">CALL</code>\u547d\u4ee4\u4e2d\uff0c\u8f93\u51fa\u53c2\u6570\u5fc5\u987b\u5305\u62ec\u5728\u53c2\u6570\u5217\u8868\u4e2d\u3002\u4f8b\u5982\uff0c\u524d\u9762\u7684\u94f6\u884c\u8d26\u6237\u501f\u8bb0\u4f8b\u7a0b\u53ef\u4ee5\u50cf\u8fd9\u6837\u5199\uff1a</p>\n<pre class=\"programlisting\">CREATE PROCEDURE tp1 (accountno integer, debit numeric, OUT new_balance numeric) AS $$\n    UPDATE bank\n        SET balance = balance - debit\n        WHERE accountno = tp1.accountno\n    RETURNING balance;\n$$ LANGUAGE SQL;\n</pre>\n<p lang=\"zh\">\u8981\u8c03\u7528\u8fd9\u4e2a\u8fc7\u7a0b\uff0c\u5fc5\u987b\u5305\u62ec\u5339\u914d<code class=\"literal\">OUT</code>\u53c2\u6570\u7684\u53c2\u6570\u3002\u901a\u5e38\u5199\u6210<code class=\"literal\">NULL</code>\uff1a</p>\n<pre class=\"programlisting\">CALL tp1(17, 100.0, NULL);\n</pre>\n<p lang=\"zh\">\u5982\u679c\u4f60\u5199\u7684\u662f\u5176\u4ed6\u5185\u5bb9\uff0c\u5b83\u5fc5\u987b\u662f\u4e00\u4e2a\u80fd\u591f\u50cf\u8f93\u5165\u53c2\u6570\u90a3\u6837\u88ab\u9690\u5f0f\u5f3a\u5236\u8f6c\u6362\u6210\u8be5\u53c2\u6570\u58f0\u660e\u7c7b\u578b\u7684\u8868\u8fbe\u5f0f\u3002\u4e0d\u8fc7\u8981\u6ce8\u610f\uff0c\u8fd9\u6837\u7684\u8868\u8fbe\u5f0f\u4e0d\u4f1a\u88ab\u6c42\u503c\u3002</p>\n<p lang=\"zh\">\u5f53\u4ece<span class=\"application\">PL/pgSQL</span>\u8c03\u7528\u8fc7\u7a0b\u65f6\uff0c\u4f60\u4e0d\u80fd\u5199<code class=\"literal\">NULL</code>\uff0c\u800c\u5fc5\u987b\u5199\u4e00\u4e2a\u7528\u4e8e\u63a5\u6536\u8fc7\u7a0b\u8f93\u51fa\u7684\u53d8\u91cf\u3002\u8be6\u89c1<a class=\"xref\" href=\"/docs/devel/plpgsql-control-structures.html#PLPGSQL-STATEMENTS-CALLING-PROCEDURE\" title=\"41.6.3.\u00a0\u8c03\u7528\u8fc7\u7a0b\">\u7b2c\u00a041.6.3\u00a0\u8282</a>\u3002</p>\n</div>\n<div class=\"sect2\" id=\"XFUNC-SQL-VARIADIC-FUNCTIONS\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/devel/xfunc-sql.html#XFUNC-SQL-VARIADIC-FUNCTIONS\">36.5.6. \u5e26\u6709\u53ef\u53d8\u6570\u91cf\u53c2\u6570\u7684<acronym class=\"acronym\">SQL</acronym>\u51fd\u6570</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\"><acronym class=\"acronym\">SQL</acronym> \u51fd\u6570\u53ef\u4ee5\u88ab\u58f0\u660e\u4e3a\u63a5\u53d7\u53ef\u53d8\u6570\u91cf\u7684\u53c2\u6570\uff0c\u53ea\u8981\u6240\u6709<span class=\"quote\">\u201c<span class=\"quote\">\u53ef\u9009</span>\u201d</span>\u53c2\u6570\u90fd\u5c5e\u4e8e\u540c\u4e00\u79cd\u6570\u636e\u7c7b\u578b\u3002\u53ef\u9009\u53c2\u6570\u4f1a\u4ee5\u6570\u7ec4\u5f62\u5f0f\u4f20\u9012\u7ed9\u51fd\u6570\u3002\u5b9a\u4e49\u8fd9\u7c7b\u51fd\u6570\u65f6\uff0c\u9700\u8981\u628a\u6700\u540e\u4e00\u4e2a\u53c2\u6570\u6807\u8bb0\u4e3a <code class=\"literal\">VARIADIC</code>\uff1b\u8be5\u53c2\u6570\u5fc5\u987b\u88ab\u58f0\u660e\u4e3a\u6570\u7ec4\u7c7b\u578b\u3002\u4f8b\u5982\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION mleast(VARIADIC arr numeric[]) RETURNS numeric AS $$\n    SELECT min($1[i]) FROM generate_subscripts($1, 1) g(i);\n$$ LANGUAGE SQL;\n\nSELECT mleast(10, -1, 5, 4.4);\n mleast\n--------\n     -1\n(1 row)\n</pre>\n<p lang=\"zh\">\u5b9e\u9645\u4e0a\uff0c\u4f4d\u4e8e <code class=\"literal\">VARIADIC</code> \u4f4d\u7f6e\u53ca\u4e4b\u540e\u7684\u6240\u6709\u5b9e\u53c2\u90fd\u4f1a\u88ab\u6536\u96c6\u6210\u4e00\u4e2a\u4e00\u7ef4\u6570\u7ec4\uff0c\u5c31\u50cf\u4f60\u5199\u6210\u4e86\uff1a</p>\n<pre class=\"screen\">SELECT mleast(ARRAY[10, -1, 5, 4.4]);    -- doesn't work\n</pre>\n<p lang=\"zh\">\u4e0d\u8fc7\u4f60\u5b9e\u9645\u4e0a\u4e0d\u80fd\u8fd9\u6837\u5199\uff0c\u81f3\u5c11\u5b83\u4e0d\u4f1a\u5339\u914d\u8fd9\u4e2a\u51fd\u6570\u5b9a\u4e49\u3002\u88ab\u6807\u8bb0\u4e3a <code class=\"literal\">VARIADIC</code> \u7684\u53c2\u6570\u5339\u914d\u7684\u662f\u5176\u5143\u7d20\u7c7b\u578b\u51fa\u73b0\u4e00\u6b21\u6216\u591a\u6b21\uff0c\u800c\u4e0d\u662f\u5b83\u81ea\u8eab\u7684\u6570\u7ec4\u7c7b\u578b\u3002</p>\n<p lang=\"zh\">\u6709\u65f6\u5019\uff0c\u80fd\u591f\u628a\u4e00\u4e2a\u5df2\u7ecf\u6784\u9020\u597d\u7684\u6570\u7ec4\u4f20\u7ed9\u53ef\u53d8\u53c2\u6570\u51fd\u6570\u4f1a\u5f88\u6709\u7528\uff0c\u5c24\u5176\u662f\u5f53\u4e00\u4e2a\u53ef\u53d8\u53c2\u6570\u51fd\u6570\u60f3\u628a\u5b83\u7684\u6570\u7ec4\u53c2\u6570\u518d\u4f20\u7ed9\u53e6\u4e00\u4e2a\u51fd\u6570\u65f6\u3002\u6b64\u5916\uff0c\u5728\u5141\u8bb8\u4e0d\u53d7\u4fe1\u4efb\u7528\u6237\u521b\u5efa\u5bf9\u8c61\u7684\u6a21\u5f0f\u4e2d\u8c03\u7528\u53ef\u53d8\u53c2\u6570\u51fd\u6570\u65f6\uff0c\u8fd9\u662f\u552f\u4e00\u5b89\u5168\u7684\u65b9\u5f0f\uff0c\u89c1<a class=\"xref\" href=\"/docs/devel/typeconv-func.html\" title=\"10.3.\u00a0\u51fd\u6570\">\u7b2c\u00a010.3\u00a0\u8282</a>\u3002\u4f60\u53ef\u4ee5\u5728\u8c03\u7528\u4e2d\u6307\u5b9a<code class=\"literal\">VARIADIC</code>\u6765\u505a\u5230\u8fd9\u4e00\u70b9\uff1a</p>\n<pre class=\"screen\">SELECT mleast(VARIADIC ARRAY[10, -1, 5, 4.4]);\n</pre>\n<p lang=\"zh\">\u8fd9\u6837\u4f1a\u963b\u6b62\u51fd\u6570\u7684\u53ef\u53d8\u53c2\u6570\u6309\u5176\u5143\u7d20\u7c7b\u578b\u5c55\u5f00\uff0c\u4ece\u800c\u8ba9\u6570\u7ec4\u5b9e\u53c2\u80fd\u591f\u6309\u5e38\u89c4\u65b9\u5f0f\u5339\u914d\u3002<code class=\"literal\">VARIADIC</code> \u53ea\u80fd\u9644\u52a0\u5728\u51fd\u6570\u8c03\u7528\u7684\u6700\u540e\u4e00\u4e2a\u5b9e\u53c2\u4e0a\u3002</p>\n<p lang=\"zh\">\u5728\u8c03\u7528\u4e2d\u6307\u5b9a<code class=\"literal\">VARIADIC</code>\u4e5f\u662f\u5411\u53ef\u53d8\u53c2\u6570\u51fd\u6570\u4f20\u9012\u7a7a\u6570\u7ec4\u7684\u552f\u4e00\u65b9\u5f0f\uff0c\u4f8b\u5982\uff1a</p>\n<pre class=\"screen\">SELECT mleast(VARIADIC ARRAY[]::numeric[]);\n</pre>\n<p lang=\"zh\">\u4ec5\u4ec5\u5199\u6210<code class=\"literal\">SELECT mleast()</code>\u662f\u884c\u4e0d\u901a\u7684\uff0c\u56e0\u4e3a\u53ef\u53d8\u53c2\u6570\u5fc5\u987b\u5339\u914d\u81f3\u5c11\u4e00\u4e2a\u5b9e\u53c2\u3002\uff08\u5982\u679c\u4f60\u5e0c\u671b\u5141\u8bb8\u8fd9\u79cd\u8c03\u7528\uff0c\u53ef\u4ee5\u518d\u5b9a\u4e49\u4e00\u4e2a\u540c\u540d\u4e14\u4e0d\u5e26\u53c2\u6570\u7684\u51fd\u6570<code class=\"literal\">mleast</code>\u3002\uff09</p>\n<p lang=\"zh\">\u4ece\u53ef\u53d8\u53c2\u6570\u6d3e\u751f\u51fa\u7684\u6570\u7ec4\u5143\u7d20\u53c2\u6570\u4f1a\u88ab\u89c6\u4e3a\u6ca1\u6709\u81ea\u5df1\u7684\u540d\u5b57\u3002\u8fd9\u610f\u5473\u7740\u9664\u975e\u4f60\u6307\u5b9a\u4e86 <code class=\"literal\">VARIADIC</code>\uff0c\u5426\u5219\u4e0d\u80fd\u4f7f\u7528\u547d\u540d\u53c2\u6570\u6765\u8c03\u7528\u53ef\u53d8\u53c2\u6570\u51fd\u6570\uff08<a class=\"xref\" href=\"/docs/devel/sql-syntax-calling-funcs.html\" title=\"4.3.\u00a0\u8c03\u7528\u51fd\u6570\">\u7b2c\u00a04.3\u00a0\u8282</a>\uff09\u3002\u4f8b\u5982\uff0c\u4e0b\u9762\u7684\u8c03\u7528\u662f\u53ef\u884c\u7684\uff1a</p>\n<pre class=\"screen\">SELECT mleast(VARIADIC arr =&gt; ARRAY[10, -1, 5, 4.4]);\n</pre>\n<p lang=\"zh\">\u4f46\u8fd9\u4e9b\u5c31\u4e0d\u884c\uff1a</p>\n<pre class=\"screen\">SELECT mleast(arr =&gt; 10);\nSELECT mleast(arr =&gt; ARRAY[10, -1, 5, 4.4]);\n</pre>\n</div>\n<div class=\"sect2\" id=\"XFUNC-SQL-PARAMETER-DEFAULTS\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/devel/xfunc-sql.html#XFUNC-SQL-PARAMETER-DEFAULTS\">36.5.7. \u5e26\u6709\u53c2\u6570\u9ed8\u8ba4\u503c\u7684<acronym class=\"acronym\">SQL</acronym>\u51fd\u6570</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\">\u51fd\u6570\u53ef\u4ee5\u88ab\u58f0\u660e\u4e3a\u5bf9\u4e00\u4e9b\u6216\u8005\u6240\u6709\u8f93\u5165\u53c2\u6570\u5177\u6709\u9ed8\u8ba4\u503c\u3002\u53ea\u8981\u8c03\u7528\u51fd\u6570\u65f6\u6ca1\u6709\u7ed9\u51fa\u8db3\u591f\u591a\u7684\u5b9e\u53c2\uff0c\u5c31\u4f1a\u63d2\u5165\u9ed8\u8ba4\u503c\u6765\u5f25\u8865\u7f3a\u5931\u7684\u5b9e\u53c2\u3002\u7531\u4e8e\u53c2\u6570\u53ea\u80fd\u4ece\u5b9e\u53c2\u5217\u8868\u7684\u5c3e\u90e8\u5f00\u59cb\u88ab\u7701\u7565\uff0c\u5728\u4e00\u4e2a\u6709\u9ed8\u8ba4\u503c\u7684\u53c2\u6570\u4e4b\u540e\u7684\u6240\u6709\u53c2\u6570\u90fd\u4e0d\u5f97\u4e0d\u4e5f\u5177\u6709\u9ed8\u8ba4\u503c\uff08\u5c3d\u7ba1\u4f7f\u7528\u547d\u540d\u53c2\u6570\u8bb0\u6cd5\u53ef\u4ee5\u5141\u8bb8\u653e\u677e\u8fd9\u79cd\u9650\u5236\uff0c\u8fd9\u79cd\u9650\u5236\u4ecd\u7136\u4f1a\u88ab\u5f3a\u5236\u4ee5\u4fbf\u4f4d\u7f6e\u53c2\u6570\u8bb0\u6cd5\u80fd\u5de5\u4f5c\uff09\u3002\u4e0d\u7ba1\u4f60\u662f\u5426\u4f7f\u7528\u5b83\uff0c\u8fd9\u79cd\u80fd\u529b\u90fd\u8981\u6c42\u5728\u67d0\u4e9b\u7528\u6237\u4e0d\u4fe1\u4efb\u5176\u4ed6\u7528\u6237\u7684\u6570\u636e\u5e93\u4e2d\u8c03\u7528\u51fd\u6570\u65f6\u91c7\u53d6\u4e00\u4e9b\u9884\u9632\u63aa\u65bd\uff0c\u89c1<a class=\"xref\" href=\"/docs/devel/typeconv-func.html\" title=\"10.3.\u00a0\u51fd\u6570\">\u7b2c\u00a010.3\u00a0\u8282</a>\u3002</p>\n<p lang=\"zh\">\u4f8b\u5982\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION foo(a int, b int DEFAULT 2, c int DEFAULT 3)\nRETURNS int\nLANGUAGE SQL\nAS $$\n    SELECT $1 + $2 + $3;\n$$;\n\nSELECT foo(10, 20, 30);\n foo\n-----\n  60\n(1 row)\n\nSELECT foo(10, 20);\n foo\n-----\n  33\n(1 row)\n\nSELECT foo(10);\n foo\n-----\n  15\n(1 row)\n\nSELECT foo();  -- fails since there is no default for the first argument\nERROR:  function foo() does not exist\n</pre>\n<p lang=\"zh\">\u4e5f\u53ef\u4ee5\u7528 <code class=\"literal\">=</code> \u7b26\u53f7\u4ee3\u66ff\u5173\u952e\u5b57 <code class=\"literal\">DEFAULT</code>\u3002</p>\n</div>\n<div class=\"sect2\" id=\"XFUNC-SQL-TABLE-FUNCTIONS\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/devel/xfunc-sql.html#XFUNC-SQL-TABLE-FUNCTIONS\">36.5.8. <acronym class=\"acronym\">SQL</acronym> \u51fd\u6570\u4f5c\u4e3a\u8868\u6765\u6e90</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\">\u6240\u6709\u7684 SQL \u51fd\u6570\u90fd\u53ef\u4ee5\u88ab\u7528\u5728\u67e5\u8be2\u7684<code class=\"literal\">FROM</code>\u5b50\u53e5\u4e2d\uff0c\u4f46\u662f\u5bf9\u4e8e\u8fd4\u56de\u590d\u5408\u7c7b\u578b\u7684\u51fd\u6570\u7279\u522b\u6709\u7528\u3002\u5982\u679c\u51fd\u6570\u88ab\u5b9a\u4e49\u4e3a\u8fd4\u56de\u4e00\u79cd\u57fa\u7840\u7c7b\u578b\uff0c\u8be5\u8868\u51fd\u6570\u4f1a\u4ea7\u751f\u4e00\u4e2a\u5355\u5217\u8868\u3002\u5982\u679c\u8be5\u51fd\u6570\u88ab\u5b9a\u4e49\u4e3a\u8fd4\u56de\u4e00\u79cd\u590d\u5408\u7c7b\u578b\uff0c\u8be5\u8868\u51fd\u6570\u4f1a\u4e3a\u8be5\u590d\u5408\u7c7b\u578b\u7684\u6bcf\u4e00\u4e2a\u5c5e\u6027\u4ea7\u751f\u4e00\u5217\u3002</p>\n<p lang=\"zh\">\u4ee5\u4e0b\u662f\u4e00\u4e2a\u793a\u4f8b\uff1a</p>\n<pre class=\"screen\">CREATE TABLE foo (fooid int, foosubid int, fooname text);\nINSERT INTO foo VALUES (1, 1, 'Joe');\nINSERT INTO foo VALUES (1, 2, 'Ed');\nINSERT INTO foo VALUES (2, 1, 'Mary');\n\nCREATE FUNCTION getfoo(int) RETURNS foo AS $$\n    SELECT * FROM foo WHERE fooid = $1;\n$$ LANGUAGE SQL;\n\nSELECT *, upper(fooname) FROM getfoo(1) AS t1;\n\n fooid | foosubid | fooname | upper\n-------+----------+---------+-------\n     1 |        1 | Joe     | JOE\n(1 row)\n</pre>\n<p lang=\"zh\">\u5982\u793a\u4f8b\u6240\u793a\uff0c\u6211\u4eec\u53ef\u4ee5\u50cf\u64cd\u4f5c\u666e\u901a\u8868\u7684\u5217\u4e00\u6837\u64cd\u4f5c\u51fd\u6570\u7ed3\u679c\u4e2d\u7684\u5217\u3002</p>\n<p lang=\"zh\">\u6ce8\u610f\u6211\u4eec\u53ea\u4ece\u51fd\u6570\u5f97\u5230\u4e86\u4e00\u884c\u3002\u8fd9\u662f\u56e0\u4e3a\u6211\u4eec\u6ca1\u6709\u4f7f\u7528<code class=\"literal\">SETOF</code>\u3002\u8fd9\u4f1a\u5728\u4e0b\u4e00\u8282\u4e2d\u4ecb\u7ecd\u3002</p>\n</div>\n<div class=\"sect2\" id=\"XFUNC-SQL-FUNCTIONS-RETURNING-SET\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/devel/xfunc-sql.html#XFUNC-SQL-FUNCTIONS-RETURNING-SET\">36.5.9. \u8fd4\u56de\u96c6\u5408\u7684<acronym class=\"acronym\">SQL</acronym>\u51fd\u6570</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\">\u5f53\u4e00\u4e2a SQL \u51fd\u6570\u88ab\u58f0\u660e\u4e3a\u8fd4\u56de<code class=\"literal\">SETOF <em class=\"replaceable\"><code>sometype</code></em></code>\u65f6\uff0c\u8be5\u51fd\u6570\u7684\u6700\u540e\u4e00\u4e2a\u67e5\u8be2\u4f1a\u88ab\u6267\u884c\u5b8c\uff0c\u5e76\u4e14\u5b83\u8f93\u51fa\u7684\u6bcf\u4e00\u884c\u90fd\u4f1a\u88ab\u4f5c\u4e3a\u7ed3\u679c\u96c6\u7684\u4e00\u4e2a\u5143\u7d20\u8fd4\u56de\u3002</p>\n<p lang=\"zh\">\u8fd9\u4e00\u7279\u6027\u901a\u5e38\u662f\u5728\u67e5\u8be2\u7684 <code class=\"literal\">FROM</code> \u5b50\u53e5\u4e2d\u8c03\u7528\u51fd\u6570\u65f6\u4f7f\u7528\u7684\u3002\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b\uff0c\u51fd\u6570\u8fd4\u56de\u7684\u6bcf\u4e00\u884c\u90fd\u4f1a\u6210\u4e3a\u67e5\u8be2\u6240\u89c1\u8868\u4e2d\u7684\u4e00\u884c\u3002\u4f8b\u5982\uff0c\u5047\u8bbe\u8868 <code class=\"structname\">foo</code> \u4e0e\u4e0a\u6587\u76f8\u540c\uff0c\u6211\u4eec\u5199\uff1a</p>\n<pre class=\"programlisting\">CREATE FUNCTION getfoo(int) RETURNS SETOF foo AS $$\n    SELECT * FROM foo WHERE fooid = $1;\n$$ LANGUAGE SQL;\n\nSELECT * FROM getfoo(1) AS t1;\n</pre>\n<p lang=\"zh\">\u90a3\u4e48\u4f1a\u5f97\u5230\uff1a</p>\n<pre class=\"screen\"> fooid | foosubid | fooname\n-------+----------+---------\n     1 |        1 | Joe\n     1 |        2 | Ed\n(2 rows)\n</pre>\n<p lang=\"zh\">\u4e5f\u53ef\u4ee5\u901a\u8fc7\u8f93\u51fa\u53c2\u6570\u5b9a\u4e49\u7684\u5217\u6765\u8fd4\u56de\u591a\u884c\uff0c\u4f8b\u5982\uff1a</p>\n<pre class=\"programlisting\">CREATE TABLE tab (y int, z int);\nINSERT INTO tab VALUES (1, 2), (3, 4), (5, 6), (7, 8);\n\nCREATE FUNCTION sum_n_product_with_tab (x int, OUT sum int, OUT product int)\nRETURNS SETOF record\nAS $$\n    SELECT $1 + tab.y, $1 * tab.y FROM tab;\n$$ LANGUAGE SQL;\n\nSELECT * FROM sum_n_product_with_tab(10);\n sum | product\n-----+---------\n  11 |      10\n  13 |      30\n  15 |      50\n  17 |      70\n(4 rows)\n</pre>\n<p lang=\"zh\">\u8fd9\u91cc\u7684\u5173\u952e\u70b9\u662f\uff1a\u4f60\u5fc5\u987b\u5199\u6210 <code class=\"literal\">RETURNS SETOF record</code>\uff0c\u4ee5\u8868\u660e\u8be5\u51fd\u6570\u8fd4\u56de\u7684\u662f\u591a\u884c\u800c\u4e0d\u662f\u5355\u884c\u3002\u5982\u679c\u53ea\u6709\u4e00\u4e2a\u8f93\u51fa\u53c2\u6570\uff0c\u5219\u5199\u8be5\u53c2\u6570\u7684\u7c7b\u578b\uff0c\u800c\u4e0d\u662f <code class=\"type\">record</code>\u3002</p>\n<p lang=\"zh\">\u901a\u8fc7\u591a\u6b21\u8c03\u7528\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u6765\u6784\u9020\u67e5\u8be2\u7ed3\u679c\u901a\u5e38\u5f88\u6709\u7528\uff0c\u5176\u4e2d\u6bcf\u6b21\u8c03\u7528\u7684\u53c2\u6570\u90fd\u6765\u81ea\u8868\u6216\u5b50\u67e5\u8be2\u7684\u8fde\u7eed\u884c\u3002\u9996\u9009\u65b9\u5f0f\u662f\u4f7f\u7528 <code class=\"literal\">LATERAL</code> \u5173\u952e\u5b57\uff0c\u8be6\u89c1<a class=\"xref\" href=\"/docs/devel/queries-table-expressions.html#QUERIES-LATERAL\" title=\"7.2.1.5.\u00a0LATERAL\u5b50\u67e5\u8be2\">\u7b2c\u00a07.2.1.5\u00a0\u8282</a>\u3002\u4e0b\u9762\u662f\u4e00\u4e2a\u4f7f\u7528\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u679a\u4e3e\u6811\u7ed3\u6784\u5143\u7d20\u7684\u793a\u4f8b\uff1a</p>\n<pre class=\"screen\">SELECT * FROM nodes;\n   name    | parent\n-----------+--------\n Top       |\n Child1    | Top\n Child2    | Top\n Child3    | Top\n SubChild1 | Child1\n SubChild2 | Child1\n(6 rows)\n\nCREATE FUNCTION listchildren(text) RETURNS SETOF text AS $$\n    SELECT name FROM nodes WHERE parent = $1\n$$ LANGUAGE SQL STABLE;\n\nSELECT * FROM listchildren('Top');\n listchildren\n--------------\n Child1\n Child2\n Child3\n(3 rows)\n\nSELECT name, child FROM nodes, LATERAL listchildren(name) AS child;\n  name  |   child\n--------+-----------\n Top    | Child1\n Top    | Child2\n Top    | Child3\n Child1 | SubChild1\n Child1 | SubChild2\n(5 rows)\n</pre>\n<p lang=\"zh\">\u8fd9\u4e2a\u4f8b\u5b50\u5e76\u6ca1\u6709\u505a\u51fa\u4efb\u4f55\u65e0\u6cd5\u7528\u7b80\u5355\u8fde\u63a5\u5b9e\u73b0\u7684\u4e8b\uff0c\u4f46\u5728\u66f4\u590d\u6742\u7684\u8ba1\u7b97\u4e2d\uff0c\u628a\u4e00\u90e8\u5206\u5de5\u4f5c\u653e\u8fdb\u51fd\u6570\u91cc\u901a\u5e38\u4f1a\u975e\u5e38\u65b9\u4fbf\u3002</p>\n<p lang=\"zh\">\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u4e5f\u53ef\u4ee5\u51fa\u73b0\u5728\u67e5\u8be2\u7684\u9009\u62e9\u5217\u8868\u4e2d\u3002\u5bf9\u4e8e\u67e5\u8be2\u672c\u8eab\u751f\u6210\u7684\u6bcf\u4e00\u884c\uff0c\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u90fd\u4f1a\u88ab\u8c03\u7528\uff0c\u5e76\u4e3a\u5176\u7ed3\u679c\u96c6\u4e2d\u7684\u6bcf\u4e00\u4e2a\u5143\u7d20\u751f\u6210\u4e00\u884c\u8f93\u51fa\u3002\u524d\u9762\u7684\u4f8b\u5b50\u4e5f\u53ef\u4ee5\u5199\u6210\u8fd9\u6837\uff1a</p>\n<pre class=\"screen\">SELECT listchildren('Top');\n listchildren\n--------------\n Child1\n Child2\n Child3\n(3 rows)\n\nSELECT name, listchildren(name) FROM nodes;\n  name  | listchildren\n--------+--------------\n Top    | Child1\n Top    | Child2\n Top    | Child3\n Child1 | SubChild1\n Child1 | SubChild2\n(5 rows)\n</pre>\n<p lang=\"zh\">\u5728\u6700\u540e\u4e00\u4e2a <code class=\"command\">SELECT</code> \u4e2d\uff0c\u6ce8\u610f\u6ca1\u6709\u4e3a <code class=\"literal\">Child2</code>\u3001<code class=\"literal\">Child3</code> \u7b49\u663e\u793a\u4efb\u4f55\u8f93\u51fa\u884c\u3002\u8fd9\u662f\u56e0\u4e3a <code class=\"function\">listchildren</code> \u5bf9\u8fd9\u4e9b\u53c2\u6570\u8fd4\u56de\u7684\u662f\u7a7a\u96c6\uff0c\u56e0\u6b64\u4e0d\u4f1a\u751f\u6210\u7ed3\u679c\u884c\u3002\u8fd9\u4e0e\u4f7f\u7528 <code class=\"literal\">LATERAL</code> \u8bed\u6cd5\u628a\u51fd\u6570\u7ed3\u679c\u505a\u5185\u8fde\u63a5\u65f6\u5f97\u5230\u7684\u884c\u4e3a\u76f8\u540c\u3002</p>\n<p lang=\"zh\"><span class=\"productname\">PostgreSQL</span>\u4e2d\uff0c\u5199\u5728\u67e5\u8be2\u7684\u9009\u62e9\u5217\u8868\u4e2d\u7684\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u7684\u884c\u4e3a\u51e0\u4e4e\u548c\u5199\u5728<code class=\"literal\">LATERAL FROM</code>\u5b50\u53e5\u9879\u4e2d\u7684\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u5b8c\u5168\u4e00\u6837\u3002\u4f8b\u5982\uff1a</p>\n<pre class=\"programlisting\">SELECT x, generate_series(1,5) AS g FROM tab;\n</pre>\n<p lang=\"zh\">\u51e0\u4e4e\u7b49\u6548\u4e8e</p>\n<pre class=\"programlisting\">SELECT x, g FROM tab, LATERAL generate_series(1,5) AS g;\n</pre>\n<p lang=\"zh\">\u8fd9\u4f1a\u662f\u5b8c\u5168\u4e00\u6837\u7684\uff0c\u9664\u4e86\u5728\u8fd9\u4e2a\u7279\u522b\u7684\u793a\u4f8b\u4e2d\uff0c\u89c4\u5212\u5668\u53ef\u4ee5\u9009\u62e9\u628a<code class=\"structname\">g</code>\u653e\u5728\u5d4c\u5957\u5faa\u73af\u8fde\u63a5\u7684\u5916\u4fa7\uff0c\u56e0\u4e3a<code class=\"structname\">g</code>\u5bf9<code class=\"structname\">tab</code>\u6ca1\u6709\u5b9e\u9645\u7684\u6a2a\u5411\u4f9d\u8d56\u3002\u90a3\u4f1a\u5bfc\u81f4\u4e00\u79cd\u4e0d\u540c\u7684\u8f93\u51fa\u884c\u987a\u5e8f\u3002\u9009\u62e9\u5217\u8868\u4e2d\u7684\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u603b\u662f\u4f1a\u88ab\u8ba1\u7b97\uff0c\u5c31\u597d\u50cf\u5b83\u4eec\u5728<code class=\"literal\">FROM</code>\u5b50\u53e5\u5269\u4f59\u90e8\u5206\u7684\u5d4c\u5957\u5faa\u73af\u8fde\u63a5\u7684\u5185\u4fa7\u4e00\u6837\uff0c\u56e0\u6b64\u5728\u8003\u8651\u6765\u81ea<code class=\"literal\">FROM</code>\u5b50\u53e5\u7684\u4e0b\u4e00\u884c\u4e4b\u524d\uff0c\u8fd9\u4e9b\u51fd\u6570\u4f1a\u8fd0\u884c\u5230\u5b8c\u6210\u3002</p>\n<p lang=\"zh\">\u5982\u679c\u5728\u67e5\u8be2\u7684\u9009\u62e9\u5217\u8868\u4e2d\u6709\u4e0d\u6b62\u4e00\u4e2a\u96c6\u5408\u8fd4\u56de\u51fd\u6570\uff0c\u5219\u884c\u4e3a\u7c7b\u4f3c\u4e8e\u628a\u90a3\u4e9b\u51fd\u6570\u653e\u5230\u4e00\u4e2a\u5355\u4e00\u7684<code class=\"literal\">LATERAL ROWS FROM( ... )</code> <code class=\"literal\">FROM</code>\u5b50\u53e5\u9879\u4e2d\u7684\u884c\u4e3a\u3002\u5bf9\u4e8e\u6765\u81ea\u5e95\u5c42\u67e5\u8be2\u7684\u6bcf\u4e00\u884c\uff0c\u90fd\u6709\u4e00\u4e2a\u7528\u5230\u6bcf\u4e2a\u51fd\u6570\u9996\u4e2a\u7ed3\u679c\u7684\u8f93\u51fa\u884c\uff0c\u7136\u540e\u662f\u4e00\u4e2a\u4f7f\u7528\u6bcf\u4e2a\u51fd\u6570\u7b2c\u4e8c\u4e2a\u7ed3\u679c\u7684\u8f93\u51fa\u884c\uff0c\u4ee5\u6b64\u7c7b\u63a8\u3002\u5982\u679c\u67d0\u4e9b\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u4ea7\u751f\u7684\u8f93\u51fa\u6bd4\u5176\u4ed6\u51fd\u6570\u5c11\uff0c\u4f1a\u7528\u7a7a\u503c\u4ee3\u66ff\u7f3a\u5931\u7684\u6570\u636e\uff0c\u56e0\u6b64\u4e3a\u4e00\u4e2a\u5e95\u5c42\u884c\u5f62\u6210\u7684\u603b\u884c\u6570\u7b49\u4e8e\u4ea7\u751f\u6700\u591a\u8f93\u51fa\u7684\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u7684\u8f93\u51fa\u884c\u6570\u3002\u56e0\u6b64\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u4f1a<span class=\"quote\">\u201c<span class=\"quote\">\u6b65\u8c03\u4e00\u81f4</span>\u201d</span>\u5730\u8fd0\u884c\u76f4\u5230\u5b83\u4eec\u7684\u8f93\u51fa\u88ab\u8017\u5c3d\uff0c\u7136\u540e\u7528\u4e0b\u4e00\u4e2a\u5e95\u5c42\u884c\u7ee7\u7eed\u6267\u884c\u3002</p>\n<p lang=\"zh\">\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u53ef\u4ee5\u88ab\u5d4c\u5957\u5728\u4e00\u4e2a\u9009\u62e9\u5217\u8868\u4e2d\uff0c\u4e0d\u8fc7\u5728<code class=\"literal\">FROM</code>\u5b50\u53e5\u9879\u4e2d\u4e0d\u5141\u8bb8\u8fd9\u6837\u505a\u3002\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b\uff0c\u5d4c\u5957\u7684\u6bcf\u4e00\u5c42\u4f1a\u88ab\u5355\u72ec\u5bf9\u5f85\uff0c\u5c31\u50cf\u5b83\u662f\u4e00\u4e2a\u5355\u72ec\u7684<code class=\"literal\">LATERAL ROWS FROM( ... )</code>\u9879\u4e00\u6837\u3002\u4f8b\u5982\uff0c\u5728</p>\n<pre class=\"programlisting\">SELECT srf1(srf2(x), srf3(y)), srf4(srf5(z)) FROM tab;\n</pre>\n<p lang=\"zh\">\u4e2d\uff0c\u96c6\u5408\u8fd4\u56de\u51fd\u6570<code class=\"function\">srf2</code>\u3001<code class=\"function\">srf3</code>\u548c<code class=\"function\">srf5</code>\u5c06\u4e3a<code class=\"structname\">tab</code>\u7684\u6bcf\u4e00\u884c\u6b65\u8c03\u4e00\u81f4\u5730\u8fd0\u884c\uff0c\u7136\u540e\u4f1a\u5bf9\u8f83\u4f4e\u5c42\u7684\u51fd\u6570\u4ea7\u751f\u7684\u6bcf\u4e00\u884c\u4ee5\u6b65\u8c03\u4e00\u81f4\u7684\u5f62\u5f0f\u5e94\u7528<code class=\"function\">srf1</code>\u548c<code class=\"function\">srf4</code>\u3002</p>\n<p lang=\"zh\">\u5728<code class=\"literal\">CASE</code>\u6216<code class=\"literal\">COALESCE</code>\u8fd9\u6837\u7684\u6761\u4ef6\u8ba1\u7b97\u7ed3\u6784\u4e2d\uff0c\u4e0d\u80fd\u4f7f\u7528\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u3002\u4f8b\u5982\uff0c\u8003\u8651</p>\n<pre class=\"programlisting\">SELECT x, CASE WHEN x &gt; 0 THEN generate_series(1, 5) ELSE 0 END FROM tab;\n</pre>\n<p lang=\"zh\">\u8868\u9762\u4e0a\u770b\uff0c\u8fd9\u5e94\u5f53\u8ba9 x &gt; 0 \u7684\u8f93\u5165\u884c\u91cd\u590d\u4e94\u6b21\uff0c\u5176\u4f59\u884c\u53ea\u51fa\u73b0\u4e00\u6b21\uff1b\u4f46\u5b9e\u9645\u4e0a\uff0cgenerate_series(1, 5) \u4f1a\u5728 CASE \u8868\u8fbe\u5f0f\u6c42\u503c\u4e4b\u524d\uff0c\u4f5c\u4e3a\u9690\u5f0f LATERAL FROM \u9879\u6267\u884c\uff0c\u56e0\u6b64\u6bcf\u4e2a\u8f93\u5165\u884c\u90fd\u4f1a\u91cd\u590d\u4e94\u6b21\u3002\u4e3a\u907f\u514d\u6df7\u6dc6\uff0c\u6b64\u7c7b\u5199\u6cd5\u4f1a\u5728\u89e3\u6790\u9636\u6bb5\u62a5\u9519\u3002</p>\n<div class=\"note\">\n<h3 class=\"title\" lang=\"zh\">\u6ce8\u610f</h3>\n<p lang=\"zh\">\u5982\u679c\u51fd\u6570\u7684\u6700\u540e\u4e00\u6761\u547d\u4ee4\u662f\u5e26 RETURNING \u7684 INSERT\u3001UPDATE\u3001DELETE \u6216 MERGE\uff0c\u8be5\u547d\u4ee4\u59cb\u7ec8\u6267\u884c\u5230\u5b8c\u6210\uff0c\u5373\u4f7f\u51fd\u6570\u672a\u58f0\u660e SETOF\uff0c\u6216\u8c03\u7528\u67e5\u8be2\u672a\u83b7\u53d6\u5168\u90e8\u7ed3\u679c\u884c\u4e5f\u662f\u5982\u6b64\u3002RETURNING \u5b50\u53e5\u4ea7\u751f\u7684\u989d\u5916\u884c\u4f1a\u88ab\u9759\u9ed8\u4e22\u5f03\uff0c\u4f46\u6307\u5b9a\u7684\u8868\u4fee\u6539\u4ecd\u4f1a\u53d1\u751f\uff0c\u5e76\u5728\u51fd\u6570\u8fd4\u56de\u4e4b\u524d\u5168\u90e8\u5b8c\u6210\u3002</p>\n</div>\n<div class=\"note\">\n<h3 class=\"title\" lang=\"zh\">\u6ce8\u610f</h3>\n<p lang=\"zh\">\u5728 <span class=\"productname\">PostgreSQL</span> 10 \u4e4b\u524d\uff0c\u9664\u975e\u591a\u4e2a\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u59cb\u7ec8\u4ea7\u751f\u76f8\u540c\u6570\u91cf\u7684\u884c\uff0c\u5426\u5219\u628a\u5b83\u4eec\u653e\u5728\u540c\u4e00\u4e2a\u9009\u62e9\u5217\u8868\u4e2d\u7684\u884c\u4e3a\u5e76\u4e0d\u5408\u7406\u3002\u5426\u5219\uff0c\u5f97\u5230\u7684\u8f93\u51fa\u884c\u6570\u4f1a\u662f\u8fd9\u4e9b\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u5404\u81ea\u4ea7\u751f\u884c\u6570\u7684\u6700\u5c0f\u516c\u500d\u6570\u3002\u6b64\u5916\uff0c\u5d4c\u5957\u7684\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u4e5f\u4e0d\u50cf\u4e0a\u6587\u6240\u63cf\u8ff0\u7684\u90a3\u6837\u5de5\u4f5c\uff1b\u76f8\u53cd\uff0c\u4e00\u4e2a\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u81f3\u591a\u53ea\u80fd\u6709\u4e00\u4e2a\u96c6\u5408\u8fd4\u56de\u53c2\u6570\uff0c\u5e76\u4e14\u6bcf\u4e00\u7ec4\u5d4c\u5957\u7684\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u90fd\u4f1a\u72ec\u7acb\u8fd0\u884c\u3002\u518d\u52a0\u4e0a\u8fc7\u53bb\u8fd8\u5141\u8bb8\u6761\u4ef6\u6267\u884c\uff08\u5373\u5728 <code class=\"literal\">CASE</code> \u7b49\u7ed3\u6784\u5185\u90e8\u4f7f\u7528\u96c6\u5408\u8fd4\u56de\u51fd\u6570\uff09\uff0c\u4e8b\u60c5\u5c31\u66f4\u52a0\u590d\u6742\u4e86\u3002\u5982\u679c\u4f60\u8981\u7f16\u5199\u9700\u8981\u5728\u65e7\u7248 <span class=\"productname\">PostgreSQL</span> \u4e0a\u8fd0\u884c\u7684\u67e5\u8be2\uff0c\u5efa\u8bae\u4f7f\u7528 <code class=\"literal\">LATERAL</code> \u8bed\u6cd5\uff0c\u56e0\u4e3a\u8fd9\u6837\u5728\u4e0d\u540c\u7248\u672c\u4e4b\u95f4\u80fd\u591f\u5f97\u5230\u4e00\u81f4\u7684\u7ed3\u679c\u3002\u5982\u679c\u4f60\u7684\u67e5\u8be2\u4f9d\u8d56\u4e8e\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u7684\u6761\u4ef6\u6267\u884c\uff0c\u6216\u8bb8\u53ef\u4ee5\u628a\u6761\u4ef6\u5224\u65ad\u79fb\u52a8\u5230\u81ea\u5b9a\u4e49\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u5185\u90e8\u6765\u4fee\u590d\u3002\u4f8b\u5982\uff0c</p>\n<pre class=\"programlisting\">SELECT x, CASE WHEN y &gt; 0 THEN generate_series(1, z) ELSE 5 END FROM tab;\n</pre>\n<p lang=\"zh\">\u53ef\u4ee5\u53d8\u6210</p>\n<pre class=\"programlisting\">CREATE FUNCTION case_generate_series(cond bool, start int, fin int, els int)\n  RETURNS SETOF int AS $$\nBEGIN\n  IF cond THEN\n    RETURN QUERY SELECT generate_series(start, fin);\n  ELSE\n    RETURN QUERY SELECT els;\n  END IF;\nEND$$ LANGUAGE plpgsql;\n\nSELECT x, case_generate_series(y &gt; 0, 1, z, 5) FROM tab;\n</pre>\n<p lang=\"zh\">\u8fd9\u79cd\u5199\u6cd5\u5728\u6240\u6709\u7248\u672c\u7684 <span class=\"productname\">PostgreSQL</span> \u4e2d\u7684\u884c\u4e3a\u90fd\u76f8\u540c\u3002</p>\n</div>\n</div>\n<div class=\"sect2\" id=\"XFUNC-SQL-FUNCTIONS-RETURNING-TABLE\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/devel/xfunc-sql.html#XFUNC-SQL-FUNCTIONS-RETURNING-TABLE\">36.5.10. \u8fd4\u56de<code class=\"literal\">TABLE</code>\u7684<acronym class=\"acronym\">SQL</acronym>\u51fd\u6570</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\">\u8fd8\u6709\u53e6\u4e00\u79cd\u65b9\u6cd5\u53ef\u4ee5\u628a\u51fd\u6570\u58f0\u660e\u4e3a\u8fd4\u56de\u4e00\u4e2a\u96c6\u5408\uff0c\u5373\u4f7f\u7528 <code class=\"literal\">RETURNS TABLE(<em class=\"replaceable\"><code>columns</code></em>)</code>\u8bed\u6cd5\u3002\u8fd9\u7b49\u6548\u4e8e\u4f7f\u7528\u4e00\u4e2a\u6216\u8005\u591a\u4e2a<code class=\"literal\">OUT</code>\u53c2\u6570\u5916\u52a0\u628a\u51fd\u6570\u6807\u8bb0\u4e3a\u8fd4\u56de <code class=\"literal\">SETOF record</code>\uff08\u6216\u8005\u662f<code class=\"literal\">SETOF</code>\u5355\u4e2a\u8f93\u51fa\u53c2\u6570\u7684\u7c7b\u578b\uff09\u3002\u8fd9\u79cd\u5199\u6cd5\u662f\u5728\u6700\u8fd1\u7684 SQL \u6807\u51c6\u4e2d\u6307\u5b9a\u7684\uff0c\u56e0\u6b64\u53ef\u80fd\u6bd4\u4f7f\u7528 <code class=\"literal\">SETOF</code>\u7684\u79fb\u690d\u6027\u66f4\u597d\u3002</p>\n<p lang=\"zh\">\u4f8b\u5982\uff0c\u524d\u9762\u7684\u6c42\u548c\u5e76\u4e14\u76f8\u4e58\u7684\u793a\u4f8b\u4e5f\u53ef\u4ee5\u8fd9\u6837\u6765\u505a\uff1a</p>\n<pre class=\"programlisting\">CREATE FUNCTION sum_n_product_with_tab (x int)\nRETURNS TABLE(sum int, product int) AS $$\n    SELECT $1 + tab.y, $1 * tab.y FROM tab;\n$$ LANGUAGE SQL;\n</pre>\n<p lang=\"zh\">\u4e0d\u5141\u8bb8\u628a\u663e\u5f0f\u7684<code class=\"literal\">OUT</code>\u6216\u8005<code class=\"literal\">INOUT</code>\u53c2\u6570\u7528\u4e8e <code class=\"literal\">RETURNS TABLE</code>\u8bb0\u6cd5 \u2014 \u5fc5\u987b\u628a\u6240\u6709\u8f93\u51fa\u5217\u653e\u5728 <code class=\"literal\">TABLE</code>\u5217\u8868\u4e2d\u3002</p>\n</div>\n<div class=\"sect2\" id=\"XFUNC-SQL-POLYMORPHIC-FUNCTIONS\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/devel/xfunc-sql.html#XFUNC-SQL-POLYMORPHIC-FUNCTIONS\">36.5.11. \u591a\u6001<acronym class=\"acronym\">SQL</acronym>\u51fd\u6570</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\"><acronym class=\"acronym\">SQL</acronym> \u51fd\u6570\u53ef\u4ee5\u88ab\u58f0\u660e\u4e3a\u63a5\u53d7\u5e76\u8fd4\u56de<a class=\"xref\" href=\"/docs/devel/extend-type-system.html#EXTEND-TYPES-POLYMORPHIC\" title=\"36.2.5.\u00a0\u591a\u6001\u7c7b\u578b\">\u7b2c\u00a036.2.5\u00a0\u8282</a>\u4e2d\u63cf\u8ff0\u7684\u591a\u6001\u7c7b\u578b\u3002\u4e0b\u9762\u8fd9\u4e2a\u591a\u6001\u51fd\u6570 <code class=\"function\">make_array</code> \u4f1a\u6839\u636e\u4e24\u4e2a\u4efb\u610f\u6570\u636e\u7c7b\u578b\u7684\u5143\u7d20\u6784\u9020\u4e00\u4e2a\u6570\u7ec4\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION make_array(anyelement, anyelement) RETURNS anyarray AS $$\n    SELECT ARRAY[$1, $2];\n$$ LANGUAGE SQL;\n\nSELECT make_array(1, 2) AS intarray, make_array('a'::text, 'b') AS textarray;\n intarray | textarray\n----------+-----------\n {1,2}    | {a,b}\n(1 row)\n</pre>\n<p lang=\"zh\">\u6ce8\u610f\u7c7b\u578b\u8f6c\u6362<code class=\"literal\">'a'::text</code>\u7684\u4f7f\u7528\u662f\u4e3a\u4e86\u6307\u5b9a\u8be5\u53c2\u6570\u7684\u7c7b\u578b\u662f<code class=\"type\">text</code>\u3002\u5982\u679c\u8be5\u53c2\u6570\u53ea\u662f\u4e00\u4e2a\u5b57\u7b26\u4e32\u5b57\u9762\u91cf\uff0c\u8fd9\u5c31\u662f\u5fc5\u987b\u7684\uff0c\u56e0\u4e3a\u5426\u5219\u5b83\u4f1a\u88ab\u5f53\u4f5c<code class=\"type\">unknown</code>\u7c7b\u578b\uff0c\u5e76\u4e14 <code class=\"type\">unknown</code>\u7684\u6570\u7ec4\u4e5f\u4e0d\u662f\u4e00\u79cd\u5408\u6cd5\u7684\u7c7b\u578b\u3002\u5982\u679c\u6ca1\u6709\u8be5\u7c7b\u578b\u8f6c\u6362\uff0c\u5c06\u5f97\u5230\u8fd9\u6837\u7684\u9519\u8bef\uff1a</p>\n<pre class=\"screen\">ERROR:  could not determine polymorphic type because input has type unknown\n</pre>\n<p lang=\"zh\">\u6309\u7167\u4e0a\u9762\u7684\u65b9\u5f0f\u58f0\u660e <code class=\"function\">make_array</code> \u65f6\uff0c\u4f60\u5fc5\u987b\u63d0\u4f9b\u4e24\u4e2a\u6570\u636e\u7c7b\u578b\u5b8c\u5168\u76f8\u540c\u7684\u53c2\u6570\uff1b\u7cfb\u7edf\u4e0d\u4f1a\u5c1d\u8bd5\u89e3\u51b3\u5b83\u4eec\u4e4b\u95f4\u7684\u7c7b\u578b\u5dee\u5f02\u3002\u4f8b\u5982\uff0c\u4e0b\u9762\u8fd9\u6837\u662f\u4e0d\u884c\u7684\uff1a</p>\n<pre class=\"screen\">SELECT make_array(1, 2.5) AS numericarray;\nERROR:  function make_array(integer, numeric) does not exist\n</pre>\n<p lang=\"zh\">\u53e6\u4e00\u79cd\u65b9\u6cd5\u662f\u4f7f\u7528<span class=\"quote\">\u201c<span class=\"quote\">common</span>\u201d</span>\u8fd9\u4e00\u65cf\u591a\u6001\u7c7b\u578b\uff0c\u5b83\u5141\u8bb8\u7cfb\u7edf\u5c1d\u8bd5\u8bc6\u522b\u4e00\u4e2a\u5408\u9002\u7684\u516c\u5171\u7c7b\u578b\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION make_array2(anycompatible, anycompatible)\nRETURNS anycompatiblearray AS $$\n    SELECT ARRAY[$1, $2];\n$$ LANGUAGE SQL;\n\nSELECT make_array2(1, 2.5) AS numericarray;\n numericarray\n--------------\n {1,2.5}\n(1 row)\n</pre>\n<p lang=\"zh\">\u7531\u4e8e\u516c\u5171\u7c7b\u578b\u89e3\u6790\u89c4\u5219\u5728\u6240\u6709\u8f93\u5165\u90fd\u662f\u672a\u77e5\u7c7b\u578b\u65f6\u9ed8\u8ba4\u9009\u62e9 <code class=\"type\">text</code>\uff0c\u6240\u4ee5\u4e0b\u9762\u7684\u5199\u6cd5\u4e5f\u80fd\u5de5\u4f5c\uff1a</p>\n<pre class=\"screen\">SELECT make_array2('a', 'b') AS textarray;\n textarray\n-----------\n {a,b}\n(1 row)\n</pre>\n<p lang=\"zh\">\u5141\u8bb8\u5b58\u5728\u5177\u6709\u56fa\u5b9a\u8fd4\u56de\u7c7b\u578b\u7684\u591a\u6001\u53c2\u6570\uff0c\u4f46\u53cd\u8fc7\u6765\u5219\u4e0d\u5141\u8bb8\u3002\u4f8b\u5982\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION is_greater(anyelement, anyelement) RETURNS boolean AS $$\n    SELECT $1 &gt; $2;\n$$ LANGUAGE SQL;\n\nSELECT is_greater(1, 2);\n is_greater\n------------\n f\n(1 row)\n\nCREATE FUNCTION invalid_func() RETURNS anyelement AS $$\n    SELECT 1;\n$$ LANGUAGE SQL;\nERROR:  cannot determine result data type\nDETAIL:  A result of type anyelement requires at least one input of type anyelement, anyarray, anynonarray, anyenum, or anyrange.\n</pre>\n<p lang=\"zh\">\u591a\u6001\u4e5f\u53ef\u4ee5\u548c\u5e26\u8f93\u51fa\u53c2\u6570\u7684\u51fd\u6570\u4e00\u8d77\u4f7f\u7528\u3002\u4f8b\u5982\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION dup (f1 anyelement, OUT f2 anyelement, OUT f3 anyarray)\nAS 'SELECT $1, ARRAY[$1, $1]' LANGUAGE SQL;\n\nSELECT * FROM dup(22);\n f2 |   f3\n----+---------\n 22 | {22,22}\n(1 row)\n</pre>\n<p lang=\"zh\">\u591a\u6001\u4e5f\u53ef\u4ee5\u7528\u4e8e\u53ef\u53d8\u53c2\u6570\u51fd\u6570\u3002\u4f8b\u5982\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION anyleast (VARIADIC anyarray) RETURNS anyelement AS $$\n    SELECT min($1[i]) FROM generate_subscripts($1, 1) g(i);\n$$ LANGUAGE SQL;\n\nSELECT anyleast(10, -1, 5, 4);\n anyleast\n----------\n       -1\n(1 row)\n\nSELECT anyleast('abc'::text, 'def');\n anyleast\n----------\n abc\n(1 row)\n\nCREATE FUNCTION concat_values(text, VARIADIC anyarray) RETURNS text AS $$\n    SELECT array_to_string($2, $1);\n$$ LANGUAGE SQL;\n\nSELECT concat_values('|', 1, 4, 2);\n concat_values\n---------------\n 1|4|2\n(1 row)\n</pre>\n</div>\n<div class=\"sect2\" id=\"XFUNC-SQL-COLLATIONS\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/devel/xfunc-sql.html#XFUNC-SQL-COLLATIONS\">36.5.12. \u5e26\u6709\u6392\u5e8f\u89c4\u5219\u7684<acronym class=\"acronym\">SQL</acronym>\u51fd\u6570</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\">\u5f53\u4e00\u4e2a SQL \u51fd\u6570\u6709\u4e00\u4e2a\u6216\u591a\u4e2a\u652f\u6301\u6392\u5e8f\u89c4\u5219\u7684\u6570\u636e\u7c7b\u578b\u53c2\u6570\u65f6\uff0c\u4f1a\u6309<a class=\"xref\" href=\"/docs/devel/collation.html\" title=\"23.2.\u00a0\u6392\u5e8f\u89c4\u5219\u652f\u6301\">\u7b2c\u00a023.2\u00a0\u8282</a>\u4e2d\u7684\u8bf4\u660e\uff0c\u6839\u636e\u5206\u914d\u7ed9\u5b9e\u53c2\u7684\u6392\u5e8f\u89c4\u5219\uff0c\u4e3a\u6bcf\u6b21\u51fd\u6570\u8c03\u7528\u786e\u5b9a\u4e00\u4e2a\u6392\u5e8f\u89c4\u5219\u3002\u5982\u679c\u80fd\u591f\u6210\u529f\u786e\u5b9a\uff08\u4e5f\u5c31\u662f\u8bf4\uff0c\u53c2\u6570\u4e4b\u95f4\u4e0d\u5b58\u5728\u9690\u5f0f\u6392\u5e8f\u89c4\u5219\u51b2\u7a81\uff09\uff0c\u90a3\u4e48\u6240\u6709\u652f\u6301\u6392\u5e8f\u89c4\u5219\u7684\u53c2\u6570\u90fd\u4f1a\u88ab\u89c6\u4e3a\u9690\u5f0f\u5e26\u6709\u8be5\u6392\u5e8f\u89c4\u5219\u3002\u8fd9\u4f1a\u5f71\u54cd\u51fd\u6570\u4e2d\u5bf9\u6392\u5e8f\u89c4\u5219\u654f\u611f\u7684\u64cd\u4f5c\u7684\u884c\u4e3a\u3002\u4f8b\u5982\uff0c\u4f7f\u7528\u4e0a\u6587\u7684 <code class=\"function\">anyleast</code> \u51fd\u6570\u65f6\uff0c</p>\n<pre class=\"programlisting\">SELECT anyleast('abc'::text, 'ABC');\n</pre>\n<p lang=\"zh\">\u5176\u7ed3\u679c\u5c06\u53d6\u51b3\u4e8e\u6570\u636e\u5e93\u7684\u9ed8\u8ba4\u6392\u5e8f\u89c4\u5219\u3002\u5728 <code class=\"literal\">C</code> \u533a\u57df\u8bbe\u7f6e\u4e0b\uff0c\u7ed3\u679c\u4f1a\u662f <code class=\"literal\">ABC</code>\uff0c\u4f46\u5728\u8bb8\u591a\u5176\u4ed6\u533a\u57df\u8bbe\u7f6e\u4e0b\u5219\u4f1a\u662f <code class=\"literal\">abc</code>\u3002\u53ef\u4ee5\u5728\u4efb\u610f\u53c2\u6570\u4e0a\u6dfb\u52a0 <code class=\"literal\">COLLATE</code> \u5b50\u53e5\u6765\u5f3a\u5236\u6307\u5b9a\u8981\u4f7f\u7528\u7684\u6392\u5e8f\u89c4\u5219\uff0c\u4f8b\u5982\uff1a</p>\n<pre class=\"programlisting\">SELECT anyleast('abc'::text, 'ABC' COLLATE \"C\");\n</pre>\n<p lang=\"zh\">\u53e6\u5916\uff0c\u5982\u679c\u4f60\u5e0c\u671b\u67d0\u4e2a\u51fd\u6570\u65e0\u8bba\u4ee5\u4ec0\u4e48\u6392\u5e8f\u89c4\u5219\u8c03\u7528\uff0c\u90fd\u59cb\u7ec8\u6309\u7279\u5b9a\u6392\u5e8f\u89c4\u5219\u5de5\u4f5c\uff0c\u53ef\u4ee5\u5728\u51fd\u6570\u5b9a\u4e49\u4e2d\u6309\u9700\u63d2\u5165 <code class=\"literal\">COLLATE</code> \u5b50\u53e5\u3002\u4e0b\u9762\u8fd9\u4e2a\u7248\u672c\u7684 <code class=\"function\">anyleast</code> \u5c06\u59cb\u7ec8\u4f7f\u7528 <code class=\"literal\">en_US</code> \u533a\u57df\u8bbe\u7f6e\u6765\u6bd4\u8f83\u5b57\u7b26\u4e32\uff1a</p>\n<pre class=\"programlisting\">CREATE FUNCTION anyleast (VARIADIC anyarray) RETURNS anyelement AS $$\n    SELECT min($1[i] COLLATE \"en_US\") FROM generate_subscripts($1, 1) g(i);\n$$ LANGUAGE SQL;\n</pre>\n<p lang=\"zh\">\u4f46\u8bf7\u6ce8\u610f\uff0c\u5982\u679c\u628a\u5b83\u7528\u4e8e\u4e0d\u652f\u6301\u6392\u5e8f\u89c4\u5219\u7684\u6570\u636e\u7c7b\u578b\uff0c\u5c31\u4f1a\u629b\u51fa\u9519\u8bef\u3002</p>\n<p lang=\"zh\">\u5982\u679c\u65e0\u6cd5\u5728\u5b9e\u53c2\u4e4b\u95f4\u786e\u5b9a\u5171\u540c\u7684\u6392\u5e8f\u89c4\u5219\uff0c\u90a3\u4e48 SQL \u51fd\u6570\u4f1a\u628a\u53c2\u6570\u89c6\u4e3a\u5e26\u6709\u5176\u6570\u636e\u7c7b\u578b\u7684\u9ed8\u8ba4\u6392\u5e8f\u89c4\u5219\uff08\u901a\u5e38\u662f\u6570\u636e\u5e93\u7684\u9ed8\u8ba4\u6392\u5e8f\u89c4\u5219\uff0c\u4f46\u5bf9\u57df\u7c7b\u578b\u53c2\u6570\u6765\u8bf4\u4e5f\u53ef\u80fd\u4e0d\u540c\uff09\u3002</p>\n<p lang=\"zh\">\u8fd9\u79cd\u652f\u6301\u6392\u5e8f\u89c4\u5219\u7684\u53c2\u6570\u7684\u884c\u4e3a\uff0c\u53ef\u4ee5\u770b\u4f5c\u662f\u4ec5\u9002\u7528\u4e8e\u6587\u672c\u6570\u636e\u7c7b\u578b\u7684\u4e00\u79cd\u53d7\u9650\u591a\u6001\u5f62\u5f0f\u3002</p>\n</div>\n</div>", "manual_path": "/docs/devel/xfunc-sql.html", "localization": {"status": "complete", "sources": [{"url": "/docs/devel/xfunc-sql.html", "method": "same-major semantic node", "sha256": "c296f361bf4f3e354585061ee341857d31cad79767963b60cbe530aa61e9f45b", "language": "zh", "matched_nodes": ["#XFUNC-SQL/div[12]/div[10]/h3[0]", "#XFUNC-SQL/div[12]/p[2]", "#XFUNC-SQL/div[12]/p[3]", "#XFUNC-SQL/div[12]/p[4]", "#XFUNC-SQL/div[12]/p[5]", "#XFUNC-SQL/div[12]/p[6]", "#XFUNC-SQL/div[12]/p[8]", "#XFUNC-SQL/div[13]/p[10]", "#XFUNC-SQL/div[13]/p[12]", "#XFUNC-SQL/div[13]/p[13]", "#XFUNC-SQL/div[13]/p[15]", "#XFUNC-SQL/div[13]/p[17]", "#XFUNC-SQL/div[13]/p[19]", "#XFUNC-SQL/div[13]/p[1]", "#XFUNC-SQL/div[13]/p[3]", "#XFUNC-SQL/div[13]/p[4]", "#XFUNC-SQL/div[13]/p[6]", "#XFUNC-SQL/div[13]/p[8]", "#XFUNC-SQL/div[14]/div[12]/ul[0]/li[0]", "#XFUNC-SQL/div[14]/div[12]/ul[0]/li[1]", "#XFUNC-SQL/div[14]/p[10]", "#XFUNC-SQL/div[14]/p[11]", "#XFUNC-SQL/div[14]/p[13]", "#XFUNC-SQL/div[14]/p[15]", "#XFUNC-SQL/div[14]/p[16]", "#XFUNC-SQL/div[14]/p[18]", "#XFUNC-SQL/div[14]/p[1]", "#XFUNC-SQL/div[14]/p[20]", "#XFUNC-SQL/div[14]/p[21]", "#XFUNC-SQL/div[14]/p[23]", "#XFUNC-SQL/div[14]/p[25]", "#XFUNC-SQL/div[14]/p[27]", "#XFUNC-SQL/div[14]/p[28]", "#XFUNC-SQL/div[14]/p[3]", "#XFUNC-SQL/div[14]/p[5]", "#XFUNC-SQL/div[14]/p[6]", "#XFUNC-SQL/div[14]/p[8]", "#XFUNC-SQL/div[15]/p[11]", "#XFUNC-SQL/div[15]/p[2]", "#XFUNC-SQL/div[15]/p[4]", "#XFUNC-SQL/div[15]/p[6]", "#XFUNC-SQL/div[15]/p[8]", "#XFUNC-SQL/div[15]/p[9]", "#XFUNC-SQL/div[16]/p[2]", "#XFUNC-SQL/div[16]/p[4]", "#XFUNC-SQL/div[16]/p[6]", "#XFUNC-SQL/div[16]/p[7]", "#XFUNC-SQL/div[17]/p[10]", "#XFUNC-SQL/div[17]/p[11]", "#XFUNC-SQL/div[17]/p[13]", "#XFUNC-SQL/div[17]/p[14]", "#XFUNC-SQL/div[17]/p[16]", "#XFUNC-SQL/div[17]/p[3]", "#XFUNC-SQL/div[17]/p[5]", "#XFUNC-SQL/div[17]/p[7]", "#XFUNC-SQL/div[17]/p[8]", "#XFUNC-SQL/div[18]/p[2]", "#XFUNC-SQL/div[18]/p[3]", "#XFUNC-SQL/div[18]/p[5]", "#XFUNC-SQL/div[19]/p[1]", "#XFUNC-SQL/div[19]/p[2]", "#XFUNC-SQL/div[19]/p[4]", "#XFUNC-SQL/div[19]/p[5]", "#XFUNC-SQL/div[1]/dl[0]/dt[0]", "#XFUNC-SQL/div[1]/dl[0]/dt[10]", "#XFUNC-SQL/div[1]/dl[0]/dt[11]", "#XFUNC-SQL/div[1]/dl[0]/dt[1]", "#XFUNC-SQL/div[1]/dl[0]/dt[2]", "#XFUNC-SQL/div[1]/dl[0]/dt[3]", "#XFUNC-SQL/div[1]/dl[0]/dt[4]", "#XFUNC-SQL/div[1]/dl[0]/dt[5]", "#XFUNC-SQL/div[1]/dl[0]/dt[6]", "#XFUNC-SQL/div[1]/dl[0]/dt[7]", "#XFUNC-SQL/div[1]/dl[0]/dt[8]", "#XFUNC-SQL/div[1]/dl[0]/dt[9]", "#XFUNC-SQL/div[20]/div[29]/p[1]", "#XFUNC-SQL/div[20]/div[29]/p[3]", "#XFUNC-SQL/div[20]/div[29]/p[5]", "#XFUNC-SQL/div[20]/p[10]", "#XFUNC-SQL/div[20]/p[12]", "#XFUNC-SQL/div[20]/p[13]", "#XFUNC-SQL/div[20]/p[15]", "#XFUNC-SQL/div[20]/p[16]", "#XFUNC-SQL/div[20]/p[18]", "#XFUNC-SQL/div[20]/p[20]", "#XFUNC-SQL/div[20]/p[21]", "#XFUNC-SQL/div[20]/p[22]", "#XFUNC-SQL/div[20]/p[24]", "#XFUNC-SQL/div[20]/p[25]", "#XFUNC-SQL/div[20]/p[2]", "#XFUNC-SQL/div[20]/p[3]", "#XFUNC-SQL/div[20]/p[5]", "#XFUNC-SQL/div[20]/p[7]", "#XFUNC-SQL/div[20]/p[9]", "#XFUNC-SQL/div[21]/p[2]", "#XFUNC-SQL/div[21]/p[3]", "#XFUNC-SQL/div[21]/p[5]", "#XFUNC-SQL/div[22]/p[11]", "#XFUNC-SQL/div[22]/p[13]", "#XFUNC-SQL/div[22]/p[15]", "#XFUNC-SQL/div[22]/p[1]", "#XFUNC-SQL/div[22]/p[3]", "#XFUNC-SQL/div[22]/p[5]", "#XFUNC-SQL/div[22]/p[7]", "#XFUNC-SQL/div[22]/p[9]", "#XFUNC-SQL/div[23]/p[10]", "#XFUNC-SQL/div[23]/p[2]", "#XFUNC-SQL/div[23]/p[4]", "#XFUNC-SQL/div[23]/p[6]", "#XFUNC-SQL/div[23]/p[8]", "#XFUNC-SQL/div[23]/p[9]", "#XFUNC-SQL/p[10]", "#XFUNC-SQL/p[11]", "#XFUNC-SQL/p[3]", "#XFUNC-SQL/p[4]", "#XFUNC-SQL/p[6]", "#XFUNC-SQL/p[8]"]}], "language": "zh", "original_text": {"/summary": "SQL-language functions", "/category": "Native function languages", "/versions/20/description/0": "SQL-language functions", "/versions/20/facts/0/label": "Kind", "/versions/20/facts/0/value": "Native function language", "/versions/20/facts/1/label": "Trusted", "/versions/20/facts/2/label": "Validator"}, "fallback_fields": [], "source_language": "en", "original_snapshot_sha256": "2870a72a7070e2bb62876f554241540894ec499ea1f8a0a3029f293b5c264c23"}, "comparison_data": {"kind": "Native function language", "handler": "", "trusted": "t", "validator": "fmgr_sql_validator"}, "comparison_hash": "a4af9cf453d140d941e865b952c6a41e2b704a4b30cb77b61c1cdda8a77c5035", "manual_language": "zh"}}}, "snapshot": {"facts": [{"label": "\u79cd\u7c7b", "value": "\u539f\u751f\u51fd\u6570\u8bed\u8a00"}, {"label": "\u53ef\u4fe1", "value": "t"}, {"label": "\u6821\u9a8c\u51fd\u6570", "value": "fmgr_sql_validator"}], "tables": [], "aliases": [], "catalog": {"oid": "14", "descr": "SQL-language functions", "lanacl": "_null_", "lanispl": "f", "lanname": "sql", "lanowner": "POSTGRES", "laninline": "0", "oid_symbol": "SQLlanguageId", "lanpltrusted": "t", "lanvalidator": "fmgr_sql_validator", "lanplcallfoid": "0"}, "related": [], "release": {"ref": "https://ftp.postgresql.org/pub/source/v18.6/postgresql-18.6.tar.bz2", "label": "18.6", "major": "18", "channel": "stable", "revision": "555610c24d53e4316da5b7d3fc25c279d96856d5e0e23ee308c328c5fa881d9f", "source_sha256": "555610c24d53e4316da5b7d3fc25c279d96856d5e0e23ee308c328c5fa881d9f", "catalog_fingerprint": "65c93d6048ef30e61023a84f9680fa6a92b1c383b7eb226741170077eb078502"}, "sources": [{"url": "https://ftp.postgresql.org/pub/source/v18.6/postgresql-18.6.tar.bz2", "label": "Matching PostgreSQL source archive", "sha256": "555610c24d53e4316da5b7d3fc25c279d96856d5e0e23ee308c328c5fa881d9f"}, {"url": "https://pg.center/docs/18/xfunc-sql.html", "path": "xfunc-sql.html", "label": "PostgreSQL 18 English manual", "sha256": "be6325441b9ed269d0566ef02c9e01bf4729ef7da9beef41463be00a7df3ad9c", "language": "en", "original_url": "/docs/18/xfunc-sql.html"}], "sections": [], "signature": "", "attributes": {"kind": "Native function language", "handler": "", "trusted": "t", "validator": "fmgr_sql_validator"}, "description": ["SQL \u8bed\u8a00\u51fd\u6570"], "manual_html": "<div class=\"sect1\" id=\"XFUNC-SQL\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h2 class=\"title\" lang=\"zh\">36.5. \u67e5\u8be2\u8bed\u8a00\uff08SQL\uff09\u51fd\u6570</h2>\n</div>\n</div>\n</div>\n<p lang=\"zh\">SQL \u51fd\u6570\u6267\u884c\u7531\u4efb\u610f SQL \u8bed\u53e5\u7ec4\u6210\u7684\u4e00\u4e2a\u5217\u8868\uff0c\u5e76\u8fd4\u56de\u5217\u8868\u4e2d\u6700\u540e\u4e00\u4e2a\u67e5\u8be2\u7684\u7ed3\u679c\u3002\u5728\u7b80\u5355\uff08\u975e\u96c6\u5408\uff09\u60c5\u51b5\u4e0b\uff0c\u5c06\u8fd4\u56de\u6700\u540e\u4e00\u4e2a\u67e5\u8be2\u7ed3\u679c\u7684\u7b2c\u4e00\u884c\u3002\uff08\u8bf7\u8bb0\u4f4f\uff0c\u9664\u975e\u4f7f\u7528 <code class=\"literal\">ORDER BY</code>\uff0c\u5426\u5219\u591a\u884c\u7ed3\u679c\u4e2d\u7684<span class=\"quote\">\u201c<span class=\"quote\">\u7b2c\u4e00\u884c</span>\u201d</span>\u5e76\u6ca1\u6709\u660e\u786e\u5b9a\u4e49\u3002\uff09\u5982\u679c\u6700\u540e\u4e00\u4e2a\u67e5\u8be2\u5b8c\u5168\u6ca1\u6709\u8fd4\u56de\u4efb\u4f55\u884c\uff0c\u5219\u8fd4\u56de\u7a7a\u503c\u3002</p>\n<p lang=\"zh\">\u6216\u8005\uff0c\u4e00\u4e2a SQL \u51fd\u6570\u53ef\u4ee5\u901a\u8fc7\u6307\u5b9a\u51fd\u6570\u7684\u8fd4\u56de\u7c7b\u578b\u4e3a<code class=\"literal\">SETOF <em class=\"replaceable\"><code>sometype</code></em></code>\u88ab\u58f0\u660e\u4e3a\u8fd4\u56de\u4e00\u4e2a\u96c6\u5408\uff08\u4e5f\u5c31\u662f\u591a\u4e2a\u884c\uff09\uff0c\u6216\u8005\u7b49\u6548\u5730\u58f0\u660e\u5b83\u4e3a<code class=\"literal\">RETURNS TABLE(<em class=\"replaceable\"><code>columns</code></em>)</code>\u3002\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b\uff0c\u6700\u540e\u4e00\u4e2a\u67e5\u8be2\u7684\u7ed3\u679c\u7684\u6240\u6709\u884c\u4f1a\u88ab\u8fd4\u56de\u3002\u4e0b\u6587\u5c06\u7ed9\u51fa\u8fdb\u4e00\u6b65\u7684\u7ec6\u8282\u3002</p>\n<p lang=\"zh\">SQL \u51fd\u6570\u4f53\u5fc5\u987b\u662f\u4e00\u7ec4\u7528\u5206\u53f7\u5206\u9694\u7684 SQL \u8bed\u53e5\uff0c\u6700\u540e\u4e00\u6761\u8bed\u53e5\u540e\u7684\u5206\u53f7\u53ef\u7701\u7565\u3002\u9664\u975e\u51fd\u6570\u58f0\u660e\u4e3a\u8fd4\u56de void\uff0c\u5426\u5219\u6700\u540e\u4e00\u6761\u8bed\u53e5\u5fc5\u987b\u662f SELECT\uff0c\u6216\u5305\u542b RETURNING \u5b50\u53e5\u7684 INSERT\u3001UPDATE\u3001DELETE \u6216 MERGE\u3002</p>\n<p lang=\"zh\">\u4efb\u610f\u4e00\u7ec4 <acronym class=\"acronym\">SQL</acronym> \u8bed\u8a00\u547d\u4ee4\u90fd\u53ef\u4ee5\u6253\u5305\u5e76\u5b9a\u4e49\u6210\u51fd\u6570\u3002\u9664 <code class=\"command\">SELECT</code> \u67e5\u8be2\u5916\uff0c\u8fd9\u4e9b\u547d\u4ee4\u8fd8\u53ef\u4ee5\u5305\u542b\u6570\u636e\u4fee\u6539\u67e5\u8be2\uff08<code class=\"command\">INSERT</code>\u3001<code class=\"command\">UPDATE</code>\u3001<code class=\"command\">DELETE</code> \u548c <code class=\"command\">MERGE</code>\uff09\uff0c\u4ee5\u53ca\u5176\u4ed6 SQL \u547d\u4ee4\u3002\uff08\u5728 <acronym class=\"acronym\">SQL</acronym> \u51fd\u6570\u4e2d\u4e0d\u80fd\u4f7f\u7528\u4e8b\u52a1\u63a7\u5236\u547d\u4ee4\uff0c\u4f8b\u5982 <code class=\"command\">COMMIT</code>\u3001<code class=\"command\">SAVEPOINT</code>\uff0c\u4e5f\u4e0d\u80fd\u4f7f\u7528\u67d0\u4e9b\u5de5\u5177\u547d\u4ee4\uff0c\u4f8b\u5982 <code class=\"literal\">VACUUM</code>\u3002\uff09\u4e0d\u8fc7\uff0c\u6700\u540e\u4e00\u6761\u547d\u4ee4\u5fc5\u987b\u662f <code class=\"command\">SELECT</code>\uff0c\u6216\u8005\u5e26\u6709 <code class=\"literal\">RETURNING</code> \u5b50\u53e5\uff0c\u5e76\u8fd4\u56de\u4e0e\u51fd\u6570\u58f0\u660e\u8fd4\u56de\u7c7b\u578b\u76f8\u7b26\u7684\u7ed3\u679c\u3002\u6216\u8005\uff0c\u5982\u679c\u4f60\u60f3\u5b9a\u4e49\u4e00\u4e2a\u6267\u884c\u52a8\u4f5c\u4f46\u6ca1\u6709\u6709\u7528\u8fd4\u56de\u503c\u7684 SQL \u51fd\u6570\uff0c\u4e5f\u53ef\u4ee5\u628a\u5b83\u5b9a\u4e49\u4e3a\u8fd4\u56de <code class=\"type\">void</code>\u3002\u4f8b\u5982\uff0c\u4e0b\u9762\u8fd9\u4e2a\u51fd\u6570\u4f1a\u4ece <code class=\"literal\">emp</code> \u8868\u4e2d\u5220\u9664\u85aa\u8d44\u4e3a\u8d1f\u7684\u884c\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION clean_emp() RETURNS void AS '\n    DELETE FROM emp\n        WHERE salary &lt; 0;\n' LANGUAGE SQL;\n\nSELECT clean_emp();\n\n clean_emp\n-----------\n\n(1 row)\n</pre>\n<p lang=\"zh\">\u4f60\u4e5f\u53ef\u4ee5\u628a\u8fd9\u4e2a\u5199\u4e3a\u4e00\u4e2a\u8fc7\u7a0b\uff0c\u90a3\u6837\u907f\u514d\u8fd4\u56de\u7c7b\u578b\u7684\u95ee\u9898\u3002\u4f8b\u5982\uff1a</p>\n<pre class=\"screen\">CREATE PROCEDURE clean_emp() AS '\n    DELETE FROM emp\n        WHERE salary &lt; 0;\n' LANGUAGE SQL;\n\nCALL clean_emp();\n</pre>\n<p lang=\"zh\">\u5728\u50cf\u8fd9\u6837\u7684\u7b80\u5355\u60c5\u51b5\u4e2d\uff0c\u8fd4\u56de<code class=\"type\">void</code>\u7684\u51fd\u6570\u4e0e\u8fc7\u7a0b\u4e4b\u95f4\u7684\u5dee\u5f02\u4e3b\u8981\u662f\u98ce\u683c\u4e0a\u9762\u7684\u3002\u4e0d\u8fc7\uff0c\u8fc7\u7a0b\u8fd8\u63d0\u4f9b\u4e86\u51fd\u6570\u6240\u6ca1\u6709\u7684\u989d\u5916\u80fd\u529b\uff0c\u4f8b\u5982\u4e8b\u52a1\u63a7\u5236\u3002\u6b64\u5916\uff0c\u8fc7\u7a0b\u662f SQL \u6807\u51c6\u7684\u4e00\u90e8\u5206\uff0c\u800c\u8fd4\u56de<code class=\"type\">void</code>\u5219\u662f PostgreSQL \u6269\u5c55\u3002</p>\n<p lang=\"zh\"><code class=\"command\">CREATE FUNCTION</code> \u547d\u4ee4\u7684\u8bed\u6cd5\u8981\u6c42\u628a\u51fd\u6570\u4f53\u5199\u6210\u4e00\u4e2a\u5b57\u7b26\u4e32\u5e38\u91cf\u3002\u5bf9\u4e8e\u5b57\u7b26\u4e32\u5e38\u91cf\uff0c\u901a\u5e38\u4f7f\u7528\u7f8e\u5143\u5f15\u7528\u6700\u65b9\u4fbf\uff08\u89c1<a class=\"xref\" href=\"/docs/18/sql-syntax-lexical.html#SQL-SYNTAX-DOLLAR-QUOTING\" title=\"4.1.2.4.\u00a0\u7f8e\u5143\u5f15\u7528\u7684\u5b57\u7b26\u4e32\u5e38\u91cf\">\u7b2c\u00a04.1.2.4\u00a0\u8282</a>\uff09\u3002\u5982\u679c\u4f60\u9009\u62e9\u4f7f\u7528\u5e38\u89c4\u7684\u5355\u5f15\u53f7\u5b57\u7b26\u4e32\u5e38\u91cf\u8bed\u6cd5\uff0c\u90a3\u4e48\u5fc5\u987b\u5728\u51fd\u6570\u4f53\u4e2d\u5c06\u5355\u5f15\u53f7\uff08<code class=\"literal\">'</code>\uff09\u548c\u53cd\u659c\u7ebf\uff08<code class=\"literal\">\\</code>\uff09\u5199\u6210\u53cc\u4efd\uff08\u5047\u5b9a\u4f7f\u7528\u8f6c\u4e49\u5b57\u7b26\u4e32\u8bed\u6cd5\uff0c\u89c1<a class=\"xref\" href=\"/docs/18/sql-syntax-lexical.html#SQL-SYNTAX-STRINGS\" title=\"4.1.2.1.\u00a0\u5b57\u7b26\u4e32\u5e38\u91cf\">\u7b2c\u00a04.1.2.1\u00a0\u8282</a>\uff09\u3002</p>\n<div class=\"sect2\" id=\"XFUNC-SQL-FUNCTION-ARGUMENTS\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/18/xfunc-sql.html#XFUNC-SQL-FUNCTION-ARGUMENTS\">36.5.1. <acronym class=\"acronym\">SQL</acronym>\u51fd\u6570\u7684\u53c2\u6570</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\">\u4e00\u4e2a SQL \u51fd\u6570\u7684\u53c2\u6570\u53ef\u4ee5\u5728\u51fd\u6570\u4f53\u4e2d\u7528\u540d\u79f0\u6216\u7f16\u53f7\u5f15\u7528\u3002\u4e0b\u9762\u4f1a\u6709\u4e24\u79cd\u65b9\u6cd5\u7684\u793a\u4f8b\u3002</p>\n<p lang=\"zh\">\u8981\u4f7f\u7528\u4e00\u4e2a\u540d\u79f0\uff0c\u5c06\u51fd\u6570\u53c2\u6570\u58f0\u660e\u4e3a\u5e26\u6709\u4e00\u4e2a\u540d\u79f0\uff0c\u7136\u540e\u5728\u51fd\u6570\u4f53\u4e2d\u53ea\u5199\u8be5\u540d\u79f0\u3002\u5982\u679c\u53c2\u6570\u540d\u79f0\u4e0e\u51fd\u6570\u5185\u5f53\u524d SQL \u547d\u4ee4\u4e2d\u7684\u4efb\u610f\u5217\u540d\u76f8\u540c\uff0c\u5217\u540d\u5c06\u4f18\u5148\u3002\u5982\u679c\u4e0d\u60f3\u8fd9\u6837\uff0c\u53ef\u4ee5\u7528\u51fd\u6570\u672c\u8eab\u7684\u540d\u79f0\u6765\u9650\u5b9a\u53c2\u6570\u540d\uff0c\u4e5f\u5c31\u662f<code class=\"literal\"><em class=\"replaceable\"><code>function_name</code></em>.<em class=\"replaceable\"><code>argument_name</code></em></code>\uff08\u5982\u679c\u8fd9\u4f1a\u4e0e\u4e00\u4e2a\u88ab\u9650\u5b9a\u7684\u5217\u540d\u51b2\u7a81\uff0c\u7167\u4f8b\u8fd8\u662f\u5217\u540d\u8d62\u5f97\u4f18\u5148\u3002\u4f60\u53ef\u4ee5\u901a\u8fc7\u4e3a SQL \u547d\u4ee4\u4e2d\u7684\u8868\u9009\u62e9\u4e00\u4e2a\u4e0d\u540c\u7684\u522b\u540d\u6765\u907f\u514d\u8fd9\u79cd\u6df7\u6dc6\uff09\u3002</p>\n<p lang=\"zh\">\u5728\u66f4\u65e7\u7684\u6570\u5b57\u65b9\u6cd5\u4e2d\uff0c\u53c2\u6570\u53ef\u4ee5\u7528\u8bed\u6cd5<code class=\"literal\">$<em class=\"replaceable\"><code>n</code></em></code>\u5f15\u7528\uff1a<code class=\"literal\">$1</code>\u6307\u7684\u662f\u7b2c\u4e00\u4e2a\u8f93\u5165\u53c2\u6570\uff0c<code class=\"literal\">$2</code>\u6307\u7684\u662f\u7b2c\u4e8c\u4e2a\uff0c\u4ee5\u6b64\u7c7b\u63a8\u3002\u4e0d\u7ba1\u7279\u5b9a\u7684\u53c2\u6570\u662f\u5426\u4f7f\u7528\u540d\u79f0\u58f0\u660e\uff0c\u8fd9\u79cd\u65b9\u6cd5\u90fd\u6709\u6548\u3002</p>\n<p lang=\"zh\">\u5982\u679c\u4e00\u4e2a\u53c2\u6570\u662f\u4e00\u79cd\u590d\u5408\u7c7b\u578b\uff0c\u90a3\u4e48\u70b9\u53f7\u8bb0\u6cd5\uff08\u5982 <code class=\"literal\"><em class=\"replaceable\"><code>argname</code></em>.<em class=\"replaceable\"><code>fieldname</code></em></code> \u6216<code class=\"literal\">$1.<em class=\"replaceable\"><code>fieldname</code></em></code>\uff09\u4e5f\u53ef\u4ee5\u88ab\u7528\u6765\u8bbf\u95ee\u8be5\u53c2\u6570\u7684\u5c5e\u6027\u3002\u540c\u6837\uff0c\u4f60\u53ef\u80fd\u9700\u8981\u7528\u51fd\u6570\u7684\u540d\u79f0\u6765\u9650\u5b9a\u53c2\u6570\u7684\u540d\u79f0\u4ee5\u907f\u514d\u6b67\u4e49\u3002</p>\n<p lang=\"zh\">SQL \u51fd\u6570\u53c2\u6570\u53ea\u80fd\u88ab\u7528\u4f5c\u6570\u636e\u503c\u800c\u4e0d\u80fd\u4f5c\u4e3a\u6807\u8bc6\u7b26\u3002\u4f8b\u5982\u8fd9\u662f\u5408\u7406\u7684\uff1a</p>\n<pre class=\"programlisting\">INSERT INTO mytable VALUES ($1);\n</pre>\n<p lang=\"zh\">\u4f46\u8fd9\u6837\u5c31\u4e0d\u884c\uff1a</p>\n<pre class=\"programlisting\">INSERT INTO $1 VALUES (42);\n</pre>\n<div class=\"note\">\n<h3 class=\"title\" lang=\"zh\">\u6ce8\u610f</h3>\n<p lang=\"zh\">PostgreSQL 9.2 \u5f00\u59cb\u652f\u6301\u901a\u8fc7\u540d\u79f0\u5f15\u7528 SQL \u51fd\u6570\u53c2\u6570\u3002\u9700\u8981\u7528\u4e8e\u66f4\u65e9\u7248\u672c\u670d\u52a1\u5668\u7684\u51fd\u6570\u5fc5\u987b\u4f7f\u7528 $n \u8bb0\u6cd5\u3002</p>\n</div>\n</div>\n<div class=\"sect2\" id=\"XFUNC-SQL-BASE-FUNCTIONS\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/18/xfunc-sql.html#XFUNC-SQL-BASE-FUNCTIONS\">36.5.2. \u57fa\u7840\u7c7b\u578b\u4e0a\u7684<acronym class=\"acronym\">SQL</acronym>\u51fd\u6570</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\">\u6700\u7b80\u5355\u7684 <acronym class=\"acronym\">SQL</acronym> \u51fd\u6570\u6ca1\u6709\u53c2\u6570\uff0c\u53ea\u662f\u8fd4\u56de\u4e00\u4e2a\u57fa\u7840\u7c7b\u578b\uff0c\u4f8b\u5982 <code class=\"type\">integer</code>\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION one() RETURNS integer AS $$\n    SELECT 1 AS result;\n$$ LANGUAGE SQL;\n\n-- Alternative syntax for string literal:\nCREATE FUNCTION one() RETURNS integer AS '\n    SELECT 1 AS result;\n' LANGUAGE SQL;\n\nSELECT one();\n\n one\n-----\n   1\n</pre>\n<p lang=\"zh\">\u6ce8\u610f\u6211\u4eec\u4e3a\u8be5\u51fd\u6570\u7684\u7ed3\u679c\u5728\u51fd\u6570\u4f53\u5185\u5b9a\u4e49\u4e86\u4e00\u4e2a\u5217\u522b\u540d\uff08\u540d\u4e3a<code class=\"literal\">result</code>\uff09\uff0c\u4f46\u662f\u8fd9\u4e2a\u5217\u522b\u540d\u5728\u51fd\u6570\u4ee5\u5916\u662f\u4e0d\u53ef\u89c1\u7684\u3002\u56e0\u6b64\uff0c\u7ed3\u679c\u88ab\u6807\u8bb0\u4e3a<code class=\"literal\">one</code>\u800c\u4e0d\u662f<code class=\"literal\">result</code>\u3002</p>\n<p lang=\"zh\">\u5b9a\u4e49\u63a5\u53d7\u57fa\u7840\u7c7b\u578b\u53c2\u6570\u7684 <acronym class=\"acronym\">SQL</acronym> \u51fd\u6570\u4e5f\u51e0\u4e4e\u540c\u6837\u5bb9\u6613\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION add_em(x integer, y integer) RETURNS integer AS $$\n    SELECT x + y;\n$$ LANGUAGE SQL;\n\nSELECT add_em(1, 2) AS answer;\n\n answer\n--------\n      3\n</pre>\n<p lang=\"zh\">\u6216\u8005\uff0c\u6211\u4eec\u4e5f\u53ef\u4ee5\u4e0d\u7528\u53c2\u6570\u540d\uff0c\u800c\u6539\u7528\u6570\u5b57\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION add_em(integer, integer) RETURNS integer AS $$\n    SELECT $1 + $2;\n$$ LANGUAGE SQL;\n\nSELECT add_em(1, 2) AS answer;\n\n answer\n--------\n      3\n</pre>\n<p lang=\"zh\">\u4e0b\u9762\u662f\u4e00\u4e2a\u66f4\u6709\u7528\u7684\u51fd\u6570\uff0c\u5b83\u53ef\u4ee5\u7528\u6765\u4ece\u94f6\u884c\u8d26\u6237\u4e2d\u6263\u6b3e\uff1a</p>\n<pre class=\"programlisting\">CREATE FUNCTION tf1 (accountno integer, debit numeric) RETURNS numeric AS $$\n    UPDATE bank\n        SET balance = balance - debit\n        WHERE accountno = tf1.accountno;\n    SELECT 1;\n$$ LANGUAGE SQL;\n</pre>\n<p lang=\"zh\">\u7528\u6237\u53ef\u4ee5\u8fd9\u6837\u6267\u884c\u8be5\u51fd\u6570\uff0c\u4ece 17 \u53f7\u8d26\u6237\u4e2d\u6263\u9664 $100.00\uff1a</p>\n<pre class=\"programlisting\">SELECT tf1(17, 100.0);\n</pre>\n<p lang=\"zh\">\u5728\u8fd9\u4e2a\u793a\u4f8b\u4e2d\uff0c\u6211\u4eec\u4e3a\u7b2c\u4e00\u4e2a\u53c2\u6570\u9009\u62e9\u4e86\u540d\u79f0<code class=\"literal\">accountno</code>\uff0c\u4f46\u662f\u8fd9\u548c\u8868<code class=\"literal\">bank</code>\u4e2d\u7684\u4e00\u4e2a\u5217\u540d\u76f8\u540c\u3002\u5728<code class=\"command\">UPDATE</code>\u547d\u4ee4\u4e2d\uff0c<code class=\"literal\">accountno</code>\u5f15\u7528\u5217<code class=\"literal\">bank.accountno</code>\uff0c\u56e0\u6b64 <code class=\"literal\">tf1.accountno</code>\u5fc5\u987b\u88ab\u7528\u6765\u5f15\u7528\u8be5\u53c2\u6570\u3002\u6211\u4eec\u5f53\u7136\u53ef\u4ee5\u901a\u8fc7\u4e3a\u8be5\u53c2\u6570\u4f7f\u7528\u4e00\u4e2a\u4e0d\u540c\u7684\u540d\u79f0\u6765\u907f\u514d\u8fd9\u6837\u7684\u95ee\u9898\u3002</p>\n<p lang=\"zh\">\u5b9e\u9645\u4e0a\u6211\u4eec\u53ef\u80fd\u559c\u6b22\u4ece\u8be5\u51fd\u6570\u5f97\u5230\u4e00\u4e2a\u66f4\u6709\u7528\u7684\u7ed3\u679c\u800c\u4e0d\u662f\u4e00\u4e2a\u5e38\u6570 1\uff0c\u56e0\u6b64\u4e00\u4e2a\u66f4\u53ef\u80fd\u7684\u5b9a\u4e49\u662f\uff1a</p>\n<pre class=\"programlisting\">CREATE FUNCTION tf1 (accountno integer, debit numeric) RETURNS numeric AS $$\n    UPDATE bank\n        SET balance = balance - debit\n        WHERE accountno = tf1.accountno;\n    SELECT balance FROM bank WHERE accountno = tf1.accountno;\n$$ LANGUAGE SQL;\n</pre>\n<p lang=\"zh\">\u5b83\u4f1a\u8c03\u6574\u4f59\u989d\u5e76\u4e14\u8fd4\u56de\u65b0\u7684\u4f59\u989d\u3002\u540c\u6837\u7684\u4e8b\u60c5\u4e5f\u53ef\u4ee5\u7528\u4e00\u4e2a\u4f7f\u7528<code class=\"literal\">RETURNING</code>\u7684\u547d\u4ee4\u5b9e\u73b0\uff1a</p>\n<pre class=\"programlisting\">CREATE FUNCTION tf1 (accountno integer, debit numeric) RETURNS numeric AS $$\n    UPDATE bank\n        SET balance = balance - debit\n        WHERE accountno = tf1.accountno\n    RETURNING balance;\n$$ LANGUAGE SQL;\n</pre>\n<p lang=\"zh\">\u5982\u679c\u5728<code class=\"literal\">SELECT</code>\u6216<code class=\"literal\">RETURNING</code>\u5b50\u53e5\u4e2d\uff0c<acronym class=\"acronym\">SQL</acronym>\u51fd\u6570\u7684\u6700\u7ec8\u8fd4\u56de\u503c\u7c7b\u578b\u4e0e\u51fd\u6570\u58f0\u660e\u7684\u7ed3\u679c\u7c7b\u578b\u4e0d\u5b8c\u5168\u5339\u914d\uff0c\u5982\u679c\u53ef\u4ee5\u4f7f\u7528\u9690\u5f0f\u6216\u8d4b\u503c\u8f6c\u6362\uff0c<span class=\"productname\">PostgreSQL</span>\u5c06\u81ea\u52a8\u5c06\u8be5\u503c\u8f6c\u6362\u4e3a\u6240\u9700\u7c7b\u578b\u3002\u5426\u5219\uff0c\u4f60\u5fc5\u987b\u5199\u51fa\u663e\u5f0f\u7c7b\u578b\u8f6c\u6362\u3002\u4f8b\u5982\uff0c\u5047\u8bbe\u6211\u4eec\u5e0c\u671b\u524d\u9762\u7684<code class=\"function\">add_em</code>\u51fd\u6570\u8fd4\u56de<code class=\"type\">float8</code>\u7c7b\u578b\u3002\u53ea\u9700\u7f16\u5199</p>\n<pre class=\"programlisting\">CREATE FUNCTION add_em(integer, integer) RETURNS float8 AS $$\n    SELECT $1 + $2;\n$$ LANGUAGE SQL;\n</pre>\n<p lang=\"zh\">\u56e0\u4e3a<code class=\"type\">integer</code>\u7684\u548c\u53ef\u4ee5\u9690\u5f0f\u8f6c\u6362\u4e3a<code class=\"type\">float8</code>\u3002\uff08\u6709\u5173\u8f6c\u6362\u7684\u66f4\u591a\u4fe1\u606f\uff0c\u8bf7\u53c2\u89c1<a class=\"xref\" href=\"/docs/18/typeconv.html\" title=\"\u7b2c\u00a010\u00a0\u7ae0\u00a0\u7c7b\u578b\u8f6c\u6362\">\u7b2c\u00a010\u00a0\u7ae0</a>\u6216<a class=\"xref\" href=\"/docs/18/sql-createcast.html\" title=\"CREATE CAST\"><span class=\"refentrytitle\">CREATE CAST</span></a>\u3002\uff09</p>\n</div>\n<div class=\"sect2\" id=\"XFUNC-SQL-COMPOSITE-FUNCTIONS\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/18/xfunc-sql.html#XFUNC-SQL-COMPOSITE-FUNCTIONS\">36.5.3. \u590d\u5408\u7c7b\u578b\u4e0a\u7684<acronym class=\"acronym\">SQL</acronym>\u51fd\u6570</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\">\u7f16\u5199\u63a5\u53d7\u590d\u5408\u7c7b\u578b\u53c2\u6570\u7684\u51fd\u6570\u65f6\uff0c\u6211\u4eec\u4e0d\u4ec5\u5fc5\u987b\u6307\u5b9a\u8981\u7528\u54ea\u4e2a\u53c2\u6570\uff0c\u8fd8\u5fc5\u987b\u6307\u5b9a\u8be5\u53c2\u6570\u7684\u54ea\u4e2a\u5c5e\u6027\uff08\u5b57\u6bb5\uff09\u3002\u4f8b\u5982\uff0c\u5047\u8bbe <code class=\"type\">emp</code> \u662f\u4e00\u4e2a\u5305\u542b\u96c7\u5458\u6570\u636e\u7684\u8868\uff0c\u56e0\u6b64\u5b83\u4e5f\u662f\u8be5\u8868\u6bcf\u4e00\u884c\u5bf9\u5e94\u7684\u590d\u5408\u7c7b\u578b\u540d\u79f0\u3002\u4e0b\u9762\u7684\u51fd\u6570 <code class=\"function\">double_salary</code> \u7528\u6765\u8ba1\u7b97\u67d0\u4eba\u7684\u5de5\u8d44\u7ffb\u500d\u540e\u4f1a\u662f\u591a\u5c11\uff1a</p>\n<pre class=\"screen\">CREATE TABLE emp (\n    name        text,\n    salary      numeric,\n    age         integer,\n    cubicle     point\n);\n\nINSERT INTO emp VALUES ('Bill', 4200, 45, '(2,1)');\n\nCREATE FUNCTION double_salary(emp) RETURNS numeric AS $$\n    SELECT $1.salary * 2 AS salary;\n$$ LANGUAGE SQL;\n\nSELECT name, double_salary(emp.*) AS dream\n    FROM emp\n    WHERE emp.cubicle ~= point '(2,1)';\n\n name | dream\n------+-------\n Bill |  8400\n</pre>\n<p lang=\"zh\">\u6ce8\u610f\u8fd9\u91cc\u7528 <code class=\"literal\">$1.salary</code> \u8bed\u6cd5\u6765\u9009\u53d6\u53c2\u6570\u884c\u503c\u4e2d\u7684\u4e00\u4e2a\u5b57\u6bb5\u3002\u8fd8\u8981\u6ce8\u610f\uff0c\u8c03\u7528\u65f6\u7684 <code class=\"command\">SELECT</code> \u547d\u4ee4\u4f7f\u7528 <em class=\"replaceable\"><code>table_name</code></em><code class=\"literal\">.*</code> \u5c06\u8868\u7684\u5f53\u524d\u6574\u884c\u53d6\u4f5c\u4e00\u4e2a\u590d\u5408\u503c\u3002\u8be5\u8868\u884c\u4e5f\u53ef\u4ee5\u4ec5\u7528\u8868\u540d\u6765\u5f15\u7528\uff1a</p>\n<pre class=\"screen\">SELECT name, double_salary(emp) AS dream\n    FROM emp\n    WHERE emp.cubicle ~= point '(2,1)';\n</pre>\n<p lang=\"zh\">\u4f46\u8fd9\u79cd\u7528\u6cd5\u5df2\u88ab\u5f03\u7528\uff0c\u56e0\u4e3a\u5b83\u5f88\u5bb9\u6613\u8ba9\u4eba\u6df7\u6dc6\uff08\u5173\u4e8e\u8868\u884c\u590d\u5408\u503c\u8fd9\u4e24\u79cd\u8bb0\u6cd5\u7684\u66f4\u591a\u7ec6\u8282\uff0c\u89c1<a class=\"xref\" href=\"/docs/18/rowtypes.html#ROWTYPES-USAGE\" title=\"8.16.5.\u00a0\u5728\u67e5\u8be2\u4e2d\u4f7f\u7528\u590d\u5408\u7c7b\u578b\">\u7b2c\u00a08.16.5\u00a0\u8282</a>\uff09\u3002</p>\n<p lang=\"zh\">\u6709\u65f6\u5019\u5373\u65f6\u6784\u9020\u4e00\u4e2a\u590d\u5408\u53c2\u6570\u503c\u4f1a\u5f88\u65b9\u4fbf\u3002\u8fd9\u53ef\u4ee5\u7528<code class=\"literal\">ROW</code>\u6784\u9020\u5668\u5b8c\u6210\u3002\u4f8b\u5982\uff0c\u6211\u4eec\u53ef\u4ee5\u8c03\u6574\u88ab\u4f20\u9012\u7ed9\u51fd\u6570\u7684\u6570\u636e\uff1a</p>\n<pre class=\"screen\">SELECT name, double_salary(ROW(name, salary*1.1, age, cubicle)) AS dream\n    FROM emp;\n</pre>\n<p lang=\"zh\">\u4e5f\u53ef\u4ee5\u6784\u5efa\u4e00\u4e2a\u8fd4\u56de\u590d\u5408\u7c7b\u578b\u7684\u51fd\u6570\u3002\u8fd9\u662f\u4e00\u4e2a\u8fd4\u56de\u5355\u4e00<code class=\"type\">emp</code>\u884c\u7684\u51fd\u6570\u793a\u4f8b\uff1a</p>\n<pre class=\"programlisting\">CREATE FUNCTION new_emp() RETURNS emp AS $$\n    SELECT text 'None' AS name,\n        1000.0 AS salary,\n        25 AS age,\n        point '(2,2)' AS cubicle;\n$$ LANGUAGE SQL;\n</pre>\n<p lang=\"zh\">\u5728\u8fd9\u4e2a\u793a\u4f8b\u4e2d\uff0c\u6211\u4eec\u4e3a\u6bcf\u4e00\u4e2a\u5c5e\u6027\u6307\u5b9a\u4e86\u4e00\u4e2a\u5e38\u91cf\u503c\uff0c\u4f46\u662f\u53ef\u4ee5\u7528\u4efb\u4f55\u8ba1\u7b97\u6765\u66ff\u6362\u8fd9\u4e9b\u5e38\u91cf\u3002</p>\n<p lang=\"zh\">\u5b9a\u4e49\u8be5\u51fd\u6570\u65f6\u6709\u4e24\u70b9\u91cd\u8981\u6ce8\u610f\u4e8b\u9879\uff1a</p>\n<div class=\"itemizedlist\">\n<ul class=\"itemizedlist\">\n<li class=\"listitem\" lang=\"zh\">\n<p>\u67e5\u8be2\u4e2d\u7684\u9009\u62e9\u5217\u8868\u987a\u5e8f\u5fc5\u987b\u4e0e\u5217\u5728\u590d\u5408\u7c7b\u578b\u4e2d\u51fa\u73b0\u7684\u987a\u5e8f\u5b8c\u5168\u76f8\u540c\u3002\uff08\u7cfb\u7edf\u4e0d\u8003\u8651\u50cf\u4e0a\u9762\u8fd9\u6837\u6307\u5b9a\u7684\u5217\u540d\u3002\uff09</p>\n</li>\n<li class=\"listitem\" lang=\"zh\">\n<p>\u6211\u4eec\u5fc5\u987b\u786e\u4fdd\u6bcf\u4e2a\u8868\u8fbe\u5f0f\u7684\u7c7b\u578b\u90fd\u53ef\u4ee5\u8f6c\u6362\u4e3a\u590d\u5408\u7c7b\u578b\u7684\u76f8\u5e94\u5217\u7684\u7c7b\u578b\u3002\u5426\u5219\u6211\u4eec\u4f1a\u5f97\u5230\u8fd9\u6837\u7684\u9519\u8bef\uff1a</p>\n<pre class=\"screen\">\n<code class=\"computeroutput\">\nERROR:  return type mismatch in function declared to return emp\nDETAIL:  Final statement returns text instead of point at column 4.\n</code>\n</pre>\n<p>\u4e0e\u57fa\u7840\u7c7b\u578b\u7684\u60c5\u51b5\u4e00\u6837\uff0c\u7cfb\u7edf\u4e0d\u4f1a\u81ea\u52a8\u63d2\u5165\u663e\u5f0f\u8f6c\u6362\uff0c\u53ea\u4f1a\u63d2\u5165\u9690\u5f0f\u6216\u8d4b\u503c\u8f6c\u6362\u3002</p>\n</li>\n</ul>\n</div>\n<p lang=\"zh\">\u5b9a\u4e49\u540c\u6837\u7684\u51fd\u6570\u7684\u4e00\u79cd\u4e0d\u540c\u7684\u65b9\u6cd5\u662f\uff1a</p>\n<pre class=\"programlisting\">CREATE FUNCTION new_emp() RETURNS emp AS $$\n    SELECT ROW('None', 1000.0, 25, '(2,2)')::emp;\n$$ LANGUAGE SQL;\n</pre>\n<p lang=\"zh\">\u8fd9\u91cc\u6211\u4eec\u5199\u4e86\u4e00\u4e2a\u53ea\u8fd4\u56de\u5355\u5217\u3001\u4e14\u8be5\u5217\u5177\u6709\u6b63\u786e\u590d\u5408\u7c7b\u578b\u7684 <code class=\"command\">SELECT</code>\u3002\u5728\u8fd9\u79cd\u573a\u666f\u4e0b\uff0c\u8fd9\u6837\u5199\u5e76\u4e0d\u89c1\u5f97\u66f4\u597d\uff0c\u4f46\u5728\u67d0\u4e9b\u60c5\u51b5\u4e0b\u4f1a\u5f88\u65b9\u4fbf \u2014 \u4f8b\u5982\uff0c\u9700\u8981\u901a\u8fc7\u8c03\u7528\u53e6\u4e00\u4e2a\u8fd4\u56de\u76ee\u6807\u590d\u5408\u503c\u7684\u51fd\u6570\u6765\u8ba1\u7b97\u7ed3\u679c\u65f6\u3002\u8fd8\u6709\u4e00\u79cd\u60c5\u51b5\u662f\uff0c\u5982\u679c\u6211\u4eec\u8981\u7f16\u5199\u7684\u51fd\u6570\u8fd4\u56de\u7684\u662f\u57fa\u4e8e\u590d\u5408\u7c7b\u578b\u7684\u57df\uff0c\u800c\u4e0d\u662f\u666e\u901a\u590d\u5408\u7c7b\u578b\uff0c\u90a3\u4e48\u5c31\u5fc5\u987b\u5199\u6210\u8fd4\u56de\u5355\u5217\u7684\u5f62\u5f0f\uff0c\u56e0\u4e3a\u6ca1\u6709\u529e\u6cd5\u8ba9\u6574\u884c\u7ed3\u679c\u53d1\u751f\u6240\u9700\u7684\u5f3a\u5236\u8f6c\u6362\u3002</p>\n<p lang=\"zh\">\u6211\u4eec\u65e2\u53ef\u4ee5\u628a\u8fd9\u4e2a\u51fd\u6570\u76f4\u63a5\u5f53\u4f5c\u503c\u8868\u8fbe\u5f0f\u8c03\u7528\uff1a</p>\n<pre class=\"screen\">SELECT new_emp();\n\n         new_emp\n--------------------------\n (None,1000.0,25,\"(2,2)\")\n</pre>\n<p lang=\"zh\">\u4e5f\u53ef\u4ee5\u628a\u5b83\u5f53\u4f5c\u8868\u51fd\u6570\u6765\u8c03\u7528\uff1a</p>\n<pre class=\"screen\">SELECT * FROM new_emp();\n\n name | salary | age | cubicle\n------+--------+-----+---------\n None | 1000.0 |  25 | (2,2)\n</pre>\n<p lang=\"zh\">\u7b2c\u4e8c\u79cd\u65b9\u5f0f\u4f1a\u5728<a class=\"xref\" href=\"/docs/18/xfunc-sql.html#XFUNC-SQL-TABLE-FUNCTIONS\" title=\"36.5.8.\u00a0SQL \u51fd\u6570\u4f5c\u4e3a\u8868\u6765\u6e90\">\u7b2c\u00a036.5.8\u00a0\u8282</a>\u4e2d\u8fdb\u4e00\u6b65\u8bf4\u660e\u3002</p>\n<p lang=\"zh\">\u5f53\u4f60\u4f7f\u7528\u8fd4\u56de\u590d\u5408\u7c7b\u578b\u7684\u51fd\u6570\u65f6\uff0c\u53ef\u80fd\u53ea\u9700\u8981\u53d6\u5176\u7ed3\u679c\u4e2d\u7684\u4e00\u4e2a\u5b57\u6bb5\uff08\u5c5e\u6027\uff09\u3002\u53ef\u4ee5\u4f7f\u7528\u4e0b\u9762\u8fd9\u6837\u7684\u8bed\u6cd5\uff1a</p>\n<pre class=\"screen\">SELECT (new_emp()).name;\n\n name\n------\n None\n</pre>\n<p lang=\"zh\">\u8fd9\u91cc\u9700\u8981\u989d\u5916\u7684\u62ec\u53f7\uff0c\u4ee5\u514d\u89e3\u6790\u5668\u4ea7\u751f\u6b67\u4e49\u3002\u5982\u679c\u4e0d\u52a0\u62ec\u53f7\uff0c\u7ed3\u679c\u4f1a\u662f\u8fd9\u6837\uff1a</p>\n<pre class=\"screen\">SELECT new_emp().name;\nERROR:  syntax error at or near \".\"\nLINE 1: SELECT new_emp().name;\n                        ^\n</pre>\n<p lang=\"zh\">\u53e6\u4e00\u79cd\u9009\u62e9\u662f\u4f7f\u7528\u51fd\u6570\u8bb0\u6cd5\u6765\u63d0\u53d6\u5c5e\u6027\uff1a</p>\n<pre class=\"screen\">SELECT name(new_emp());\n\n name\n------\n None\n</pre>\n<p lang=\"zh\">\u5982<a class=\"xref\" href=\"/docs/18/rowtypes.html#ROWTYPES-USAGE\" title=\"8.16.5.\u00a0\u5728\u67e5\u8be2\u4e2d\u4f7f\u7528\u590d\u5408\u7c7b\u578b\">\u7b2c\u00a08.16.5\u00a0\u8282</a>\u6240\u8ff0\uff0c\u5b57\u6bb5\u8bb0\u6cd5\u548c\u51fd\u6570\u8bb0\u6cd5\u662f\u7b49\u4ef7\u7684\u3002</p>\n<p lang=\"zh\">\u53e6\u4e00\u79cd\u4f7f\u7528\u51fd\u6570\u8fd4\u56de\u590d\u5408\u7c7b\u578b\u7684\u65b9\u6cd5\u662f\u5c06\u7ed3\u679c\u4f20\u9012\u7ed9\u53e6\u4e00\u4e2a\u63a5\u53d7\u6b63\u786e\u884c\u7c7b\u578b\u4f5c\u4e3a\u8f93\u5165\u7684\u51fd\u6570\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION getname(emp) RETURNS text AS $$\n    SELECT $1.name;\n$$ LANGUAGE SQL;\n\nSELECT getname(new_emp());\n getname\n---------\n None\n(1 row)\n</pre>\n</div>\n<div class=\"sect2\" id=\"XFUNC-OUTPUT-PARAMETERS\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/18/xfunc-sql.html#XFUNC-OUTPUT-PARAMETERS\">36.5.4. \u5e26\u6709\u8f93\u51fa\u53c2\u6570\u7684<acronym class=\"acronym\">SQL</acronym>\u51fd\u6570</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\">\u63cf\u8ff0\u51fd\u6570\u7ed3\u679c\u7684\u53e6\u4e00\u79cd\u65b9\u6cd5\u662f\u4f7f\u7528<em class=\"firstterm\">\u8f93\u51fa\u53c2\u6570</em>\uff0c\u4f8b\u5982\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION add_em (IN x int, IN y int, OUT sum int)\nAS 'SELECT x + y'\nLANGUAGE SQL;\n\nSELECT add_em(3,7);\n add_em\n--------\n     10\n(1 row)\n</pre>\n<p lang=\"zh\">\u8fd9\u4e0e<a class=\"xref\" href=\"/docs/18/xfunc-sql.html#XFUNC-SQL-BASE-FUNCTIONS\" title=\"36.5.2.\u00a0\u57fa\u7840\u7c7b\u578b\u4e0a\u7684SQL\u51fd\u6570\">\u7b2c\u00a036.5.2\u00a0\u8282</a>\u4e2d\u5c55\u793a\u7684 <code class=\"literal\">add_em</code> \u7248\u672c\u672c\u8d28\u4e0a\u5e76\u65e0\u4e0d\u540c\u3002\u8f93\u51fa\u53c2\u6570\u7684\u771f\u6b63\u4ef7\u503c\u5728\u4e8e\uff0c\u5b83\u4eec\u4e3a\u5b9a\u4e49\u8fd4\u56de\u591a\u5217\u7684\u51fd\u6570\u63d0\u4f9b\u4e86\u4e00\u79cd\u65b9\u4fbf\u7684\u65b9\u6cd5\u3002\u4f8b\u5982\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION sum_n_product (x int, y int, OUT sum int, OUT product int)\nAS 'SELECT x + y, x * y'\nLANGUAGE SQL;\n\n SELECT * FROM sum_n_product(11,42);\n sum | product\n-----+---------\n  53 |     462\n(1 row)\n</pre>\n<p lang=\"zh\">\u8fd9\u91cc\u672c\u8d28\u4e0a\u53d1\u751f\u7684\u4e8b\u60c5\u662f\uff1a\u6211\u4eec\u4e3a\u8be5\u51fd\u6570\u7684\u7ed3\u679c\u521b\u5efa\u4e86\u4e00\u4e2a\u533f\u540d\u590d\u5408\u7c7b\u578b\u3002\u4e0a\u9762\u7684\u793a\u4f8b\u4e0e\u4e0b\u9762\u8fd9\u79cd\u5199\u6cd5\u7684\u6700\u7ec8\u6548\u679c\u76f8\u540c\uff1a</p>\n<pre class=\"screen\">CREATE TYPE sum_prod AS (sum int, product int);\n\nCREATE FUNCTION sum_n_product (int, int) RETURNS sum_prod\nAS 'SELECT $1 + $2, $1 * $2'\nLANGUAGE SQL;\n</pre>\n<p lang=\"zh\">\u4f46\u901a\u5e38\u4e0d\u5fc5\u989d\u5916\u5b9a\u4e49\u4e00\u4e2a\u72ec\u7acb\u7684\u590d\u5408\u7c7b\u578b\u4f1a\u66f4\u65b9\u4fbf\u3002\u6ce8\u610f\uff0c\u9644\u5728\u8f93\u51fa\u53c2\u6570\u4e0a\u7684\u540d\u79f0\u5e76\u975e\u53ea\u662f\u88c5\u9970\uff0c\u5b83\u4eec\u51b3\u5b9a\u4e86\u8fd9\u4e2a\u533f\u540d\u590d\u5408\u7c7b\u578b\u7684\u5217\u540d\u3002\uff08\u5982\u679c\u7701\u7565\u8f93\u51fa\u53c2\u6570\u540d\u79f0\uff0c\u7cfb\u7edf\u4f1a\u81ea\u884c\u9009\u62e9\u4e00\u4e2a\u540d\u79f0\u3002\uff09</p>\n<p lang=\"zh\">\u5728\u4ece SQL \u8c03\u7528\u8fd9\u6837\u4e00\u4e2a\u51fd\u6570\u65f6\uff0c\u8f93\u51fa\u53c2\u6570\u4e0d\u4f1a\u88ab\u5305\u62ec\u5728\u8c03\u7528\u53c2\u6570\u5217\u8868\u4e2d\u3002\u8fd9\u662f\u56e0\u4e3a<span class=\"productname\">PostgreSQL</span>\u53ea\u8003\u8651\u8f93\u5165\u53c2\u6570\u6765\u5b9a\u4e49\u51fd\u6570\u7684\u8c03\u7528\u7b7e\u540d\u3002\u8fd9\u4e5f\u610f\u5473\u7740\u5728\u4e3a\u8bf8\u5982\u5220\u9664\u51fd\u6570\u7b49\u76ee\u7684\u5f15\u7528\u8be5\u51fd\u6570\u65f6\u53ea\u6709\u8f93\u5165\u53c2\u6570\u6709\u5173\u7cfb\u3002\u6211\u4eec\u53ef\u4ee5\u7528\u4e0b\u9762\u7684\u547d\u4ee4\u4e4b\u4e00\u5220\u9664\u4e0a\u8ff0\u51fd\u6570</p>\n<pre class=\"screen\">DROP FUNCTION sum_n_product (x int, y int, OUT sum int, OUT product int);\nDROP FUNCTION sum_n_product (int, int);\n</pre>\n<p lang=\"zh\">\u53c2\u6570\u53ef\u4ee5\u88ab\u6807\u8bb0\u4e3a<code class=\"literal\">IN</code>\uff08\u9ed8\u8ba4\uff09\u3001<code class=\"literal\">OUT</code>\u3001<code class=\"literal\">INOUT</code>\u6216\u8005<code class=\"literal\">VARIADIC</code>\u3002\u4e00\u4e2a<code class=\"literal\">INOUT</code>\u53c2\u6570\u65e2\u4f5c\u4e3a\u4e00\u4e2a\u8f93\u5165\u53c2\u6570\uff08\u8c03\u7528\u53c2\u6570\u5217\u8868\u7684\u4e00\u90e8\u5206\uff09\u53c8\u4f5c\u4e3a\u4e00\u4e2a\u8f93\u51fa\u53c2\u6570\uff08\u7ed3\u679c\u8bb0\u5f55\u7c7b\u578b\u7684\u4e00\u90e8\u5206\uff09\u3002<code class=\"literal\">VARIADIC</code>\u53c2\u6570\u662f\u8f93\u5165\u53c2\u6570\uff0c\u4f46\u88ab\u6309\u7167\u4e0b\u6587\u6240\u8ff0\u7279\u6b8a\u5bf9\u5f85\u3002</p>\n</div>\n<div class=\"sect2\" id=\"XFUNC-OUTPUT-PARAMETERS-PROC\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/18/xfunc-sql.html#XFUNC-OUTPUT-PARAMETERS-PROC\">36.5.5. \u5e26\u6709\u8f93\u51fa\u53c2\u6570\u7684<acronym class=\"acronym\">SQL</acronym>\u8fc7\u7a0b</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\">\u8fc7\u7a0b\u4e5f\u652f\u6301\u8f93\u51fa\u53c2\u6570\uff0c\u4f46\u662f\u5b83\u4eec\u7684\u5de5\u4f5c\u65b9\u5f0f\u4e0e\u51fd\u6570\u7565\u6709\u4e0d\u540c\u3002\u5728<code class=\"command\">CALL</code>\u547d\u4ee4\u4e2d\uff0c\u8f93\u51fa\u53c2\u6570\u5fc5\u987b\u5305\u62ec\u5728\u53c2\u6570\u5217\u8868\u4e2d\u3002\u4f8b\u5982\uff0c\u524d\u9762\u7684\u94f6\u884c\u8d26\u6237\u501f\u8bb0\u4f8b\u7a0b\u53ef\u4ee5\u50cf\u8fd9\u6837\u5199\uff1a</p>\n<pre class=\"programlisting\">CREATE PROCEDURE tp1 (accountno integer, debit numeric, OUT new_balance numeric) AS $$\n    UPDATE bank\n        SET balance = balance - debit\n        WHERE accountno = tp1.accountno\n    RETURNING balance;\n$$ LANGUAGE SQL;\n</pre>\n<p lang=\"zh\">\u8981\u8c03\u7528\u8fd9\u4e2a\u4f8b\u7a0b\uff0c\u5fc5\u987b\u5305\u62ec\u5339\u914d<code class=\"literal\">OUT</code>\u53c2\u6570\u7684\u53c2\u6570\u3002\u901a\u5e38\u5199\u6210<code class=\"literal\">NULL</code>\uff1a</p>\n<pre class=\"programlisting\">CALL tp1(17, 100.0, NULL);\n</pre>\n<p lang=\"zh\">\u5982\u679c\u4f60\u5199\u7684\u662f\u5176\u4ed6\u5185\u5bb9\uff0c\u5b83\u5fc5\u987b\u662f\u4e00\u4e2a\u80fd\u591f\u50cf\u8f93\u5165\u53c2\u6570\u90a3\u6837\u88ab\u9690\u5f0f\u5f3a\u5236\u8f6c\u6362\u6210\u8be5\u53c2\u6570\u58f0\u660e\u7c7b\u578b\u7684\u8868\u8fbe\u5f0f\u3002\u4e0d\u8fc7\u8981\u6ce8\u610f\uff0c\u8fd9\u6837\u7684\u8868\u8fbe\u5f0f\u4e0d\u4f1a\u88ab\u6c42\u503c\u3002</p>\n<p lang=\"zh\">\u5f53\u4ece<span class=\"application\">PL/pgSQL</span>\u8c03\u7528\u8fc7\u7a0b\u65f6\uff0c\u4f60\u4e0d\u80fd\u5199<code class=\"literal\">NULL</code>\uff0c\u800c\u5fc5\u987b\u5199\u4e00\u4e2a\u7528\u4e8e\u63a5\u6536\u8fc7\u7a0b\u8f93\u51fa\u7684\u53d8\u91cf\u3002\u8be6\u89c1<a class=\"xref\" href=\"/docs/18/plpgsql-control-structures.html#PLPGSQL-STATEMENTS-CALLING-PROCEDURE\" title=\"41.6.3.\u00a0\u8c03\u7528\u8fc7\u7a0b\">\u7b2c\u00a041.6.3\u00a0\u8282</a>\u3002</p>\n</div>\n<div class=\"sect2\" id=\"XFUNC-SQL-VARIADIC-FUNCTIONS\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/18/xfunc-sql.html#XFUNC-SQL-VARIADIC-FUNCTIONS\">36.5.6. \u5e26\u6709\u53ef\u53d8\u6570\u91cf\u53c2\u6570\u7684<acronym class=\"acronym\">SQL</acronym>\u51fd\u6570</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\"><acronym class=\"acronym\">SQL</acronym> \u51fd\u6570\u53ef\u4ee5\u88ab\u58f0\u660e\u4e3a\u63a5\u53d7\u53ef\u53d8\u6570\u91cf\u7684\u53c2\u6570\uff0c\u53ea\u8981\u6240\u6709<span class=\"quote\">\u201c<span class=\"quote\">\u53ef\u9009</span>\u201d</span>\u53c2\u6570\u90fd\u5c5e\u4e8e\u540c\u4e00\u79cd\u6570\u636e\u7c7b\u578b\u3002\u53ef\u9009\u53c2\u6570\u4f1a\u4ee5\u6570\u7ec4\u5f62\u5f0f\u4f20\u9012\u7ed9\u51fd\u6570\u3002\u5b9a\u4e49\u8fd9\u7c7b\u51fd\u6570\u65f6\uff0c\u9700\u8981\u628a\u6700\u540e\u4e00\u4e2a\u53c2\u6570\u6807\u8bb0\u4e3a <code class=\"literal\">VARIADIC</code>\uff1b\u8be5\u53c2\u6570\u5fc5\u987b\u88ab\u58f0\u660e\u4e3a\u6570\u7ec4\u7c7b\u578b\u3002\u4f8b\u5982\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION mleast(VARIADIC arr numeric[]) RETURNS numeric AS $$\n    SELECT min($1[i]) FROM generate_subscripts($1, 1) g(i);\n$$ LANGUAGE SQL;\n\nSELECT mleast(10, -1, 5, 4.4);\n mleast\n--------\n     -1\n(1 row)\n</pre>\n<p lang=\"zh\">\u5b9e\u9645\u4e0a\uff0c\u4f4d\u4e8e <code class=\"literal\">VARIADIC</code> \u4f4d\u7f6e\u53ca\u4e4b\u540e\u7684\u6240\u6709\u5b9e\u53c2\u90fd\u4f1a\u88ab\u6536\u96c6\u6210\u4e00\u4e2a\u4e00\u7ef4\u6570\u7ec4\uff0c\u5c31\u50cf\u4f60\u5199\u6210\u4e86\uff1a</p>\n<pre class=\"screen\">SELECT mleast(ARRAY[10, -1, 5, 4.4]);    -- doesn't work\n</pre>\n<p lang=\"zh\">\u4e0d\u8fc7\u4f60\u5b9e\u9645\u4e0a\u4e0d\u80fd\u8fd9\u6837\u5199\uff0c\u81f3\u5c11\u5b83\u4e0d\u4f1a\u5339\u914d\u8fd9\u4e2a\u51fd\u6570\u5b9a\u4e49\u3002\u88ab\u6807\u8bb0\u4e3a <code class=\"literal\">VARIADIC</code> \u7684\u53c2\u6570\u5339\u914d\u7684\u662f\u5176\u5143\u7d20\u7c7b\u578b\u51fa\u73b0\u4e00\u6b21\u6216\u591a\u6b21\uff0c\u800c\u4e0d\u662f\u5b83\u81ea\u8eab\u7684\u6570\u7ec4\u7c7b\u578b\u3002</p>\n<p lang=\"zh\">\u6709\u65f6\u5019\uff0c\u80fd\u591f\u628a\u4e00\u4e2a\u5df2\u7ecf\u6784\u9020\u597d\u7684\u6570\u7ec4\u4f20\u7ed9\u53ef\u53d8\u53c2\u6570\u51fd\u6570\u4f1a\u5f88\u6709\u7528\uff0c\u5c24\u5176\u662f\u5f53\u4e00\u4e2a\u53ef\u53d8\u53c2\u6570\u51fd\u6570\u60f3\u628a\u5b83\u7684\u6570\u7ec4\u53c2\u6570\u518d\u4f20\u7ed9\u53e6\u4e00\u4e2a\u51fd\u6570\u65f6\u3002\u6b64\u5916\uff0c\u5728\u5141\u8bb8\u4e0d\u53d7\u4fe1\u4efb\u7528\u6237\u521b\u5efa\u5bf9\u8c61\u7684\u6a21\u5f0f\u4e2d\u8c03\u7528\u53ef\u53d8\u53c2\u6570\u51fd\u6570\u65f6\uff0c\u8fd9\u662f\u552f\u4e00\u5b89\u5168\u7684\u65b9\u5f0f\uff0c\u89c1<a class=\"xref\" href=\"/docs/18/typeconv-func.html\" title=\"10.3.\u00a0\u51fd\u6570\">\u7b2c\u00a010.3\u00a0\u8282</a>\u3002\u4f60\u53ef\u4ee5\u5728\u8c03\u7528\u4e2d\u6307\u5b9a<code class=\"literal\">VARIADIC</code>\u6765\u505a\u5230\u8fd9\u4e00\u70b9\uff1a</p>\n<pre class=\"screen\">SELECT mleast(VARIADIC ARRAY[10, -1, 5, 4.4]);\n</pre>\n<p lang=\"zh\">\u8fd9\u6837\u4f1a\u963b\u6b62\u51fd\u6570\u7684\u53ef\u53d8\u53c2\u6570\u6309\u5176\u5143\u7d20\u7c7b\u578b\u5c55\u5f00\uff0c\u4ece\u800c\u8ba9\u6570\u7ec4\u5b9e\u53c2\u80fd\u591f\u6309\u5e38\u89c4\u65b9\u5f0f\u5339\u914d\u3002<code class=\"literal\">VARIADIC</code> \u53ea\u80fd\u9644\u52a0\u5728\u51fd\u6570\u8c03\u7528\u7684\u6700\u540e\u4e00\u4e2a\u5b9e\u53c2\u4e0a\u3002</p>\n<p lang=\"zh\">\u5728\u8c03\u7528\u4e2d\u6307\u5b9a<code class=\"literal\">VARIADIC</code>\u4e5f\u662f\u5411\u53ef\u53d8\u53c2\u6570\u51fd\u6570\u4f20\u9012\u7a7a\u6570\u7ec4\u7684\u552f\u4e00\u65b9\u5f0f\uff0c\u4f8b\u5982\uff1a</p>\n<pre class=\"screen\">SELECT mleast(VARIADIC ARRAY[]::numeric[]);\n</pre>\n<p lang=\"zh\">\u4ec5\u4ec5\u5199\u6210<code class=\"literal\">SELECT mleast()</code>\u662f\u884c\u4e0d\u901a\u7684\uff0c\u56e0\u4e3a\u53ef\u53d8\u53c2\u6570\u5fc5\u987b\u5339\u914d\u81f3\u5c11\u4e00\u4e2a\u5b9e\u53c2\u3002\uff08\u5982\u679c\u4f60\u5e0c\u671b\u5141\u8bb8\u8fd9\u79cd\u8c03\u7528\uff0c\u53ef\u4ee5\u518d\u5b9a\u4e49\u4e00\u4e2a\u540c\u540d\u4e14\u4e0d\u5e26\u53c2\u6570\u7684\u51fd\u6570<code class=\"literal\">mleast</code>\u3002\uff09</p>\n<p lang=\"zh\">\u4ece\u53ef\u53d8\u53c2\u6570\u6d3e\u751f\u51fa\u7684\u6570\u7ec4\u5143\u7d20\u53c2\u6570\u4f1a\u88ab\u89c6\u4e3a\u6ca1\u6709\u81ea\u5df1\u7684\u540d\u5b57\u3002\u8fd9\u610f\u5473\u7740\u9664\u975e\u4f60\u6307\u5b9a\u4e86 <code class=\"literal\">VARIADIC</code>\uff0c\u5426\u5219\u4e0d\u80fd\u4f7f\u7528\u547d\u540d\u53c2\u6570\u6765\u8c03\u7528\u53ef\u53d8\u53c2\u6570\u51fd\u6570\uff08<a class=\"xref\" href=\"/docs/18/sql-syntax-calling-funcs.html\" title=\"4.3.\u00a0\u8c03\u7528\u51fd\u6570\">\u7b2c\u00a04.3\u00a0\u8282</a>\uff09\u3002\u4f8b\u5982\uff0c\u4e0b\u9762\u7684\u8c03\u7528\u662f\u53ef\u884c\u7684\uff1a</p>\n<pre class=\"screen\">SELECT mleast(VARIADIC arr =&gt; ARRAY[10, -1, 5, 4.4]);\n</pre>\n<p lang=\"zh\">\u4f46\u8fd9\u4e9b\u5c31\u4e0d\u884c\uff1a</p>\n<pre class=\"screen\">SELECT mleast(arr =&gt; 10);\nSELECT mleast(arr =&gt; ARRAY[10, -1, 5, 4.4]);\n</pre>\n</div>\n<div class=\"sect2\" id=\"XFUNC-SQL-PARAMETER-DEFAULTS\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/18/xfunc-sql.html#XFUNC-SQL-PARAMETER-DEFAULTS\">36.5.7. \u5e26\u6709\u53c2\u6570\u9ed8\u8ba4\u503c\u7684<acronym class=\"acronym\">SQL</acronym>\u51fd\u6570</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\">\u51fd\u6570\u53ef\u4ee5\u88ab\u58f0\u660e\u4e3a\u5bf9\u4e00\u4e9b\u6216\u8005\u6240\u6709\u8f93\u5165\u53c2\u6570\u5177\u6709\u9ed8\u8ba4\u503c\u3002\u53ea\u8981\u8c03\u7528\u51fd\u6570\u65f6\u6ca1\u6709\u7ed9\u51fa\u8db3\u591f\u591a\u7684\u5b9e\u53c2\uff0c\u5c31\u4f1a\u63d2\u5165\u9ed8\u8ba4\u503c\u6765\u5f25\u8865\u7f3a\u5931\u7684\u5b9e\u53c2\u3002\u7531\u4e8e\u53c2\u6570\u53ea\u80fd\u4ece\u5b9e\u53c2\u5217\u8868\u7684\u5c3e\u90e8\u5f00\u59cb\u88ab\u7701\u7565\uff0c\u5728\u4e00\u4e2a\u6709\u9ed8\u8ba4\u503c\u7684\u53c2\u6570\u4e4b\u540e\u7684\u6240\u6709\u53c2\u6570\u90fd\u4e0d\u5f97\u4e0d\u4e5f\u5177\u6709\u9ed8\u8ba4\u503c\uff08\u5c3d\u7ba1\u4f7f\u7528\u547d\u540d\u53c2\u6570\u8bb0\u6cd5\u53ef\u4ee5\u5141\u8bb8\u653e\u677e\u8fd9\u79cd\u9650\u5236\uff0c\u8fd9\u79cd\u9650\u5236\u4ecd\u7136\u4f1a\u88ab\u5f3a\u5236\u4ee5\u4fbf\u4f4d\u7f6e\u53c2\u6570\u8bb0\u6cd5\u80fd\u5de5\u4f5c\uff09\u3002\u4e0d\u7ba1\u4f60\u662f\u5426\u4f7f\u7528\u5b83\uff0c\u8fd9\u79cd\u80fd\u529b\u90fd\u8981\u6c42\u5728\u67d0\u4e9b\u7528\u6237\u4e0d\u4fe1\u4efb\u5176\u4ed6\u7528\u6237\u7684\u6570\u636e\u5e93\u4e2d\u8c03\u7528\u51fd\u6570\u65f6\u91c7\u53d6\u4e00\u4e9b\u9884\u9632\u63aa\u65bd\uff0c\u89c1<a class=\"xref\" href=\"/docs/18/typeconv-func.html\" title=\"10.3.\u00a0\u51fd\u6570\">\u7b2c\u00a010.3\u00a0\u8282</a>\u3002</p>\n<p lang=\"zh\">\u4f8b\u5982\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION foo(a int, b int DEFAULT 2, c int DEFAULT 3)\nRETURNS int\nLANGUAGE SQL\nAS $$\n    SELECT $1 + $2 + $3;\n$$;\n\nSELECT foo(10, 20, 30);\n foo\n-----\n  60\n(1 row)\n\nSELECT foo(10, 20);\n foo\n-----\n  33\n(1 row)\n\nSELECT foo(10);\n foo\n-----\n  15\n(1 row)\n\nSELECT foo();  -- fails since there is no default for the first argument\nERROR:  function foo() does not exist\n</pre>\n<p lang=\"zh\">\u4e5f\u53ef\u4ee5\u7528 <code class=\"literal\">=</code> \u7b26\u53f7\u4ee3\u66ff\u5173\u952e\u5b57 <code class=\"literal\">DEFAULT</code>\u3002</p>\n</div>\n<div class=\"sect2\" id=\"XFUNC-SQL-TABLE-FUNCTIONS\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/18/xfunc-sql.html#XFUNC-SQL-TABLE-FUNCTIONS\">36.5.8. <acronym class=\"acronym\">SQL</acronym> \u51fd\u6570\u4f5c\u4e3a\u8868\u6765\u6e90</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\">\u6240\u6709\u7684 SQL \u51fd\u6570\u90fd\u53ef\u4ee5\u88ab\u7528\u5728\u67e5\u8be2\u7684<code class=\"literal\">FROM</code>\u5b50\u53e5\u4e2d\uff0c\u4f46\u662f\u5bf9\u4e8e\u8fd4\u56de\u590d\u5408\u7c7b\u578b\u7684\u51fd\u6570\u7279\u522b\u6709\u7528\u3002\u5982\u679c\u51fd\u6570\u88ab\u5b9a\u4e49\u4e3a\u8fd4\u56de\u4e00\u79cd\u57fa\u7840\u7c7b\u578b\uff0c\u8be5\u8868\u51fd\u6570\u4f1a\u4ea7\u751f\u4e00\u4e2a\u5355\u5217\u8868\u3002\u5982\u679c\u8be5\u51fd\u6570\u88ab\u5b9a\u4e49\u4e3a\u8fd4\u56de\u4e00\u79cd\u590d\u5408\u7c7b\u578b\uff0c\u8be5\u8868\u51fd\u6570\u4f1a\u4e3a\u8be5\u590d\u5408\u7c7b\u578b\u7684\u6bcf\u4e00\u4e2a\u5c5e\u6027\u4ea7\u751f\u4e00\u5217\u3002</p>\n<p lang=\"zh\">\u4ee5\u4e0b\u662f\u4e00\u4e2a\u793a\u4f8b\uff1a</p>\n<pre class=\"screen\">CREATE TABLE foo (fooid int, foosubid int, fooname text);\nINSERT INTO foo VALUES (1, 1, 'Joe');\nINSERT INTO foo VALUES (1, 2, 'Ed');\nINSERT INTO foo VALUES (2, 1, 'Mary');\n\nCREATE FUNCTION getfoo(int) RETURNS foo AS $$\n    SELECT * FROM foo WHERE fooid = $1;\n$$ LANGUAGE SQL;\n\nSELECT *, upper(fooname) FROM getfoo(1) AS t1;\n\n fooid | foosubid | fooname | upper\n-------+----------+---------+-------\n     1 |        1 | Joe     | JOE\n(1 row)\n</pre>\n<p lang=\"zh\">\u5982\u793a\u4f8b\u6240\u793a\uff0c\u6211\u4eec\u53ef\u4ee5\u50cf\u64cd\u4f5c\u666e\u901a\u8868\u7684\u5217\u4e00\u6837\u64cd\u4f5c\u51fd\u6570\u7ed3\u679c\u4e2d\u7684\u5217\u3002</p>\n<p lang=\"zh\">\u6ce8\u610f\u6211\u4eec\u53ea\u4ece\u51fd\u6570\u5f97\u5230\u4e86\u4e00\u884c\u3002\u8fd9\u662f\u56e0\u4e3a\u6211\u4eec\u6ca1\u6709\u4f7f\u7528<code class=\"literal\">SETOF</code>\u3002\u8fd9\u4f1a\u5728\u4e0b\u4e00\u8282\u4e2d\u4ecb\u7ecd\u3002</p>\n</div>\n<div class=\"sect2\" id=\"XFUNC-SQL-FUNCTIONS-RETURNING-SET\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/18/xfunc-sql.html#XFUNC-SQL-FUNCTIONS-RETURNING-SET\">36.5.9. \u8fd4\u56de\u96c6\u5408\u7684<acronym class=\"acronym\">SQL</acronym>\u51fd\u6570</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\">\u5f53\u4e00\u4e2a SQL \u51fd\u6570\u88ab\u58f0\u660e\u4e3a\u8fd4\u56de<code class=\"literal\">SETOF <em class=\"replaceable\"><code>sometype</code></em></code>\u65f6\uff0c\u8be5\u51fd\u6570\u7684\u6700\u540e\u4e00\u4e2a\u67e5\u8be2\u4f1a\u88ab\u6267\u884c\u5b8c\uff0c\u5e76\u4e14\u5b83\u8f93\u51fa\u7684\u6bcf\u4e00\u884c\u90fd\u4f1a\u88ab\u4f5c\u4e3a\u7ed3\u679c\u96c6\u7684\u4e00\u4e2a\u5143\u7d20\u8fd4\u56de\u3002</p>\n<p lang=\"zh\">\u8fd9\u4e00\u7279\u6027\u901a\u5e38\u662f\u5728\u67e5\u8be2\u7684 <code class=\"literal\">FROM</code> \u5b50\u53e5\u4e2d\u8c03\u7528\u51fd\u6570\u65f6\u4f7f\u7528\u7684\u3002\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b\uff0c\u51fd\u6570\u8fd4\u56de\u7684\u6bcf\u4e00\u884c\u90fd\u4f1a\u6210\u4e3a\u67e5\u8be2\u6240\u89c1\u8868\u4e2d\u7684\u4e00\u884c\u3002\u4f8b\u5982\uff0c\u5047\u8bbe\u8868 <code class=\"literal\">foo</code> \u4e0e\u4e0a\u6587\u76f8\u540c\uff0c\u6211\u4eec\u5199\uff1a</p>\n<pre class=\"programlisting\">CREATE FUNCTION getfoo(int) RETURNS SETOF foo AS $$\n    SELECT * FROM foo WHERE fooid = $1;\n$$ LANGUAGE SQL;\n\nSELECT * FROM getfoo(1) AS t1;\n</pre>\n<p lang=\"zh\">\u90a3\u4e48\u4f1a\u5f97\u5230\uff1a</p>\n<pre class=\"screen\"> fooid | foosubid | fooname\n-------+----------+---------\n     1 |        1 | Joe\n     1 |        2 | Ed\n(2 rows)\n</pre>\n<p lang=\"zh\">\u4e5f\u53ef\u4ee5\u901a\u8fc7\u8f93\u51fa\u53c2\u6570\u5b9a\u4e49\u7684\u5217\u6765\u8fd4\u56de\u591a\u884c\uff0c\u4f8b\u5982\uff1a</p>\n<pre class=\"programlisting\">CREATE TABLE tab (y int, z int);\nINSERT INTO tab VALUES (1, 2), (3, 4), (5, 6), (7, 8);\n\nCREATE FUNCTION sum_n_product_with_tab (x int, OUT sum int, OUT product int)\nRETURNS SETOF record\nAS $$\n    SELECT $1 + tab.y, $1 * tab.y FROM tab;\n$$ LANGUAGE SQL;\n\nSELECT * FROM sum_n_product_with_tab(10);\n sum | product\n-----+---------\n  11 |      10\n  13 |      30\n  15 |      50\n  17 |      70\n(4 rows)\n</pre>\n<p lang=\"zh\">\u8fd9\u91cc\u7684\u5173\u952e\u70b9\u662f\uff1a\u4f60\u5fc5\u987b\u5199\u6210 <code class=\"literal\">RETURNS SETOF record</code>\uff0c\u4ee5\u8868\u660e\u8be5\u51fd\u6570\u8fd4\u56de\u7684\u662f\u591a\u884c\u800c\u4e0d\u662f\u5355\u884c\u3002\u5982\u679c\u53ea\u6709\u4e00\u4e2a\u8f93\u51fa\u53c2\u6570\uff0c\u5219\u5199\u8be5\u53c2\u6570\u7684\u7c7b\u578b\uff0c\u800c\u4e0d\u662f <code class=\"type\">record</code>\u3002</p>\n<p lang=\"zh\">\u901a\u8fc7\u591a\u6b21\u8c03\u7528\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u6765\u6784\u9020\u67e5\u8be2\u7ed3\u679c\u901a\u5e38\u5f88\u6709\u7528\uff0c\u5176\u4e2d\u6bcf\u6b21\u8c03\u7528\u7684\u53c2\u6570\u90fd\u6765\u81ea\u8868\u6216\u5b50\u67e5\u8be2\u7684\u8fde\u7eed\u884c\u3002\u9996\u9009\u65b9\u5f0f\u662f\u4f7f\u7528 <code class=\"literal\">LATERAL</code> \u5173\u952e\u5b57\uff0c\u8be6\u89c1<a class=\"xref\" href=\"/docs/18/queries-table-expressions.html#QUERIES-LATERAL\" title=\"7.2.1.5.\u00a0LATERAL\u5b50\u67e5\u8be2\">\u7b2c\u00a07.2.1.5\u00a0\u8282</a>\u3002\u4e0b\u9762\u662f\u4e00\u4e2a\u4f7f\u7528\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u679a\u4e3e\u6811\u7ed3\u6784\u5143\u7d20\u7684\u793a\u4f8b\uff1a</p>\n<pre class=\"screen\">SELECT * FROM nodes;\n   name    | parent\n-----------+--------\n Top       |\n Child1    | Top\n Child2    | Top\n Child3    | Top\n SubChild1 | Child1\n SubChild2 | Child1\n(6 rows)\n\nCREATE FUNCTION listchildren(text) RETURNS SETOF text AS $$\n    SELECT name FROM nodes WHERE parent = $1\n$$ LANGUAGE SQL STABLE;\n\nSELECT * FROM listchildren('Top');\n listchildren\n--------------\n Child1\n Child2\n Child3\n(3 rows)\n\nSELECT name, child FROM nodes, LATERAL listchildren(name) AS child;\n  name  |   child\n--------+-----------\n Top    | Child1\n Top    | Child2\n Top    | Child3\n Child1 | SubChild1\n Child1 | SubChild2\n(5 rows)\n</pre>\n<p lang=\"zh\">\u8fd9\u4e2a\u4f8b\u5b50\u5e76\u6ca1\u6709\u505a\u51fa\u4efb\u4f55\u65e0\u6cd5\u7528\u7b80\u5355\u8fde\u63a5\u5b9e\u73b0\u7684\u4e8b\uff0c\u4f46\u5728\u66f4\u590d\u6742\u7684\u8ba1\u7b97\u4e2d\uff0c\u628a\u4e00\u90e8\u5206\u5de5\u4f5c\u653e\u8fdb\u51fd\u6570\u91cc\u901a\u5e38\u4f1a\u975e\u5e38\u65b9\u4fbf\u3002</p>\n<p lang=\"zh\">\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u4e5f\u53ef\u4ee5\u51fa\u73b0\u5728\u67e5\u8be2\u7684\u9009\u62e9\u5217\u8868\u4e2d\u3002\u5bf9\u4e8e\u67e5\u8be2\u672c\u8eab\u751f\u6210\u7684\u6bcf\u4e00\u884c\uff0c\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u90fd\u4f1a\u88ab\u8c03\u7528\uff0c\u5e76\u4e3a\u5176\u7ed3\u679c\u96c6\u4e2d\u7684\u6bcf\u4e00\u4e2a\u5143\u7d20\u751f\u6210\u4e00\u884c\u8f93\u51fa\u3002\u524d\u9762\u7684\u4f8b\u5b50\u4e5f\u53ef\u4ee5\u5199\u6210\u8fd9\u6837\uff1a</p>\n<pre class=\"screen\">SELECT listchildren('Top');\n listchildren\n--------------\n Child1\n Child2\n Child3\n(3 rows)\n\nSELECT name, listchildren(name) FROM nodes;\n  name  | listchildren\n--------+--------------\n Top    | Child1\n Top    | Child2\n Top    | Child3\n Child1 | SubChild1\n Child1 | SubChild2\n(5 rows)\n</pre>\n<p lang=\"zh\">\u5728\u6700\u540e\u4e00\u4e2a <code class=\"command\">SELECT</code> \u4e2d\uff0c\u6ce8\u610f\u6ca1\u6709\u4e3a <code class=\"literal\">Child2</code>\u3001<code class=\"literal\">Child3</code> \u7b49\u663e\u793a\u4efb\u4f55\u8f93\u51fa\u884c\u3002\u8fd9\u662f\u56e0\u4e3a <code class=\"function\">listchildren</code> \u5bf9\u8fd9\u4e9b\u53c2\u6570\u8fd4\u56de\u7684\u662f\u7a7a\u96c6\uff0c\u56e0\u6b64\u4e0d\u4f1a\u751f\u6210\u7ed3\u679c\u884c\u3002\u8fd9\u4e0e\u4f7f\u7528 <code class=\"literal\">LATERAL</code> \u8bed\u6cd5\u628a\u51fd\u6570\u7ed3\u679c\u505a\u5185\u8fde\u63a5\u65f6\u5f97\u5230\u7684\u884c\u4e3a\u76f8\u540c\u3002</p>\n<p lang=\"zh\"><span class=\"productname\">PostgreSQL</span>\u4e2d\uff0c\u5199\u5728\u67e5\u8be2\u7684\u9009\u62e9\u5217\u8868\u4e2d\u7684\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u7684\u884c\u4e3a\u51e0\u4e4e\u548c\u5199\u5728<code class=\"literal\">LATERAL FROM</code>\u5b50\u53e5\u9879\u4e2d\u7684\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u5b8c\u5168\u4e00\u6837\u3002\u4f8b\u5982\uff1a</p>\n<pre class=\"programlisting\">SELECT x, generate_series(1,5) AS g FROM tab;\n</pre>\n<p lang=\"zh\">\u51e0\u4e4e\u7b49\u6548\u4e8e</p>\n<pre class=\"programlisting\">SELECT x, g FROM tab, LATERAL generate_series(1,5) AS g;\n</pre>\n<p lang=\"zh\">\u8fd9\u4f1a\u662f\u5b8c\u5168\u4e00\u6837\u7684\uff0c\u9664\u4e86\u5728\u8fd9\u4e2a\u7279\u522b\u7684\u793a\u4f8b\u4e2d\uff0c\u89c4\u5212\u5668\u53ef\u4ee5\u9009\u62e9\u628a<code class=\"structname\">g</code>\u653e\u5728\u5d4c\u5957\u5faa\u73af\u8fde\u63a5\u7684\u5916\u4fa7\uff0c\u56e0\u4e3a<code class=\"structname\">g</code>\u5bf9<code class=\"structname\">tab</code>\u6ca1\u6709\u5b9e\u9645\u7684\u6a2a\u5411\u4f9d\u8d56\u3002\u90a3\u4f1a\u5bfc\u81f4\u4e00\u79cd\u4e0d\u540c\u7684\u8f93\u51fa\u884c\u987a\u5e8f\u3002\u9009\u62e9\u5217\u8868\u4e2d\u7684\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u603b\u662f\u4f1a\u88ab\u8ba1\u7b97\uff0c\u5c31\u597d\u50cf\u5b83\u4eec\u5728<code class=\"literal\">FROM</code>\u5b50\u53e5\u5269\u4f59\u90e8\u5206\u7684\u5d4c\u5957\u5faa\u73af\u8fde\u63a5\u7684\u5185\u4fa7\u4e00\u6837\uff0c\u56e0\u6b64\u5728\u8003\u8651\u6765\u81ea<code class=\"literal\">FROM</code>\u5b50\u53e5\u7684\u4e0b\u4e00\u884c\u4e4b\u524d\uff0c\u8fd9\u4e9b\u51fd\u6570\u4f1a\u8fd0\u884c\u5230\u5b8c\u6210\u3002</p>\n<p lang=\"zh\">\u5982\u679c\u5728\u67e5\u8be2\u7684\u9009\u62e9\u5217\u8868\u4e2d\u6709\u4e0d\u6b62\u4e00\u4e2a\u96c6\u5408\u8fd4\u56de\u51fd\u6570\uff0c\u5219\u884c\u4e3a\u7c7b\u4f3c\u4e8e\u628a\u90a3\u4e9b\u51fd\u6570\u653e\u5230\u4e00\u4e2a\u5355\u4e00\u7684<code class=\"literal\">LATERAL ROWS FROM( ... )</code> <code class=\"literal\">FROM</code>\u5b50\u53e5\u9879\u4e2d\u7684\u884c\u4e3a\u3002\u5bf9\u4e8e\u6765\u81ea\u5e95\u5c42\u67e5\u8be2\u7684\u6bcf\u4e00\u884c\uff0c\u90fd\u6709\u4e00\u4e2a\u7528\u5230\u6bcf\u4e2a\u51fd\u6570\u9996\u4e2a\u7ed3\u679c\u7684\u8f93\u51fa\u884c\uff0c\u7136\u540e\u662f\u4e00\u4e2a\u4f7f\u7528\u6bcf\u4e2a\u51fd\u6570\u7b2c\u4e8c\u4e2a\u7ed3\u679c\u7684\u8f93\u51fa\u884c\uff0c\u4ee5\u6b64\u7c7b\u63a8\u3002\u5982\u679c\u67d0\u4e9b\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u4ea7\u751f\u7684\u8f93\u51fa\u6bd4\u5176\u4ed6\u51fd\u6570\u5c11\uff0c\u4f1a\u7528\u7a7a\u503c\u4ee3\u66ff\u7f3a\u5931\u7684\u6570\u636e\uff0c\u56e0\u6b64\u4e3a\u4e00\u4e2a\u5e95\u5c42\u884c\u5f62\u6210\u7684\u603b\u884c\u6570\u7b49\u4e8e\u4ea7\u751f\u6700\u591a\u8f93\u51fa\u7684\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u7684\u8f93\u51fa\u884c\u6570\u3002\u56e0\u6b64\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u4f1a<span class=\"quote\">\u201c<span class=\"quote\">\u6b65\u8c03\u4e00\u81f4</span>\u201d</span>\u5730\u8fd0\u884c\u76f4\u5230\u5b83\u4eec\u7684\u8f93\u51fa\u88ab\u8017\u5c3d\uff0c\u7136\u540e\u7528\u4e0b\u4e00\u4e2a\u5e95\u5c42\u884c\u7ee7\u7eed\u6267\u884c\u3002</p>\n<p lang=\"zh\">\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u53ef\u4ee5\u88ab\u5d4c\u5957\u5728\u4e00\u4e2a\u9009\u62e9\u5217\u8868\u4e2d\uff0c\u4e0d\u8fc7\u5728<code class=\"literal\">FROM</code>\u5b50\u53e5\u9879\u4e2d\u4e0d\u5141\u8bb8\u8fd9\u6837\u505a\u3002\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b\uff0c\u5d4c\u5957\u7684\u6bcf\u4e00\u5c42\u4f1a\u88ab\u5355\u72ec\u5bf9\u5f85\uff0c\u5c31\u50cf\u5b83\u662f\u4e00\u4e2a\u5355\u72ec\u7684<code class=\"literal\">LATERAL ROWS FROM( ... )</code>\u9879\u4e00\u6837\u3002\u4f8b\u5982\uff0c\u5728</p>\n<pre class=\"programlisting\">SELECT srf1(srf2(x), srf3(y)), srf4(srf5(z)) FROM tab;\n</pre>\n<p lang=\"zh\">\u4e2d\uff0c\u96c6\u5408\u8fd4\u56de\u51fd\u6570<code class=\"function\">srf2</code>\u3001<code class=\"function\">srf3</code>\u548c<code class=\"function\">srf5</code>\u5c06\u4e3a<code class=\"structname\">tab</code>\u7684\u6bcf\u4e00\u884c\u6b65\u8c03\u4e00\u81f4\u5730\u8fd0\u884c\uff0c\u7136\u540e\u4f1a\u5bf9\u8f83\u4f4e\u5c42\u7684\u51fd\u6570\u4ea7\u751f\u7684\u6bcf\u4e00\u884c\u4ee5\u6b65\u8c03\u4e00\u81f4\u7684\u5f62\u5f0f\u5e94\u7528<code class=\"function\">srf1</code>\u548c<code class=\"function\">srf4</code>\u3002</p>\n<p lang=\"zh\">\u5728<code class=\"literal\">CASE</code>\u6216<code class=\"literal\">COALESCE</code>\u8fd9\u6837\u7684\u6761\u4ef6\u8ba1\u7b97\u7ed3\u6784\u4e2d\uff0c\u4e0d\u80fd\u4f7f\u7528\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u3002\u4f8b\u5982\uff0c\u8003\u8651</p>\n<pre class=\"programlisting\">SELECT x, CASE WHEN x &gt; 0 THEN generate_series(1, 5) ELSE 0 END FROM tab;\n</pre>\n<p lang=\"zh\">\u8868\u9762\u4e0a\u770b\uff0c\u8fd9\u5e94\u5f53\u8ba9 x &gt; 0 \u7684\u8f93\u5165\u884c\u91cd\u590d\u4e94\u6b21\uff0c\u5176\u4f59\u884c\u53ea\u51fa\u73b0\u4e00\u6b21\uff1b\u4f46\u5b9e\u9645\u4e0a\uff0cgenerate_series(1, 5) \u4f1a\u5728 CASE \u8868\u8fbe\u5f0f\u6c42\u503c\u4e4b\u524d\uff0c\u4f5c\u4e3a\u9690\u5f0f LATERAL FROM \u9879\u6267\u884c\uff0c\u56e0\u6b64\u6bcf\u4e2a\u8f93\u5165\u884c\u90fd\u4f1a\u91cd\u590d\u4e94\u6b21\u3002\u4e3a\u907f\u514d\u6df7\u6dc6\uff0c\u6b64\u7c7b\u5199\u6cd5\u4f1a\u5728\u89e3\u6790\u9636\u6bb5\u62a5\u9519\u3002</p>\n<div class=\"note\">\n<h3 class=\"title\" lang=\"zh\">\u6ce8\u610f</h3>\n<p lang=\"zh\">\u5982\u679c\u51fd\u6570\u7684\u6700\u540e\u4e00\u6761\u547d\u4ee4\u662f\u5e26 RETURNING \u7684 INSERT\u3001UPDATE\u3001DELETE \u6216 MERGE\uff0c\u8be5\u547d\u4ee4\u59cb\u7ec8\u6267\u884c\u5230\u5b8c\u6210\uff0c\u5373\u4f7f\u51fd\u6570\u672a\u58f0\u660e SETOF\uff0c\u6216\u8c03\u7528\u67e5\u8be2\u672a\u83b7\u53d6\u5168\u90e8\u7ed3\u679c\u884c\u4e5f\u662f\u5982\u6b64\u3002RETURNING \u5b50\u53e5\u4ea7\u751f\u7684\u989d\u5916\u884c\u4f1a\u88ab\u9759\u9ed8\u4e22\u5f03\uff0c\u4f46\u6307\u5b9a\u7684\u8868\u4fee\u6539\u4ecd\u4f1a\u53d1\u751f\uff0c\u5e76\u5728\u51fd\u6570\u8fd4\u56de\u4e4b\u524d\u5168\u90e8\u5b8c\u6210\u3002</p>\n</div>\n<div class=\"note\">\n<h3 class=\"title\" lang=\"zh\">\u6ce8\u610f</h3>\n<p lang=\"zh\">\u5728 <span class=\"productname\">PostgreSQL</span> 10 \u4e4b\u524d\uff0c\u9664\u975e\u591a\u4e2a\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u59cb\u7ec8\u4ea7\u751f\u76f8\u540c\u6570\u91cf\u7684\u884c\uff0c\u5426\u5219\u628a\u5b83\u4eec\u653e\u5728\u540c\u4e00\u4e2a\u9009\u62e9\u5217\u8868\u4e2d\u7684\u884c\u4e3a\u5e76\u4e0d\u5408\u7406\u3002\u5426\u5219\uff0c\u5f97\u5230\u7684\u8f93\u51fa\u884c\u6570\u4f1a\u662f\u8fd9\u4e9b\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u5404\u81ea\u4ea7\u751f\u884c\u6570\u7684\u6700\u5c0f\u516c\u500d\u6570\u3002\u6b64\u5916\uff0c\u5d4c\u5957\u7684\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u4e5f\u4e0d\u50cf\u4e0a\u6587\u6240\u63cf\u8ff0\u7684\u90a3\u6837\u5de5\u4f5c\uff1b\u76f8\u53cd\uff0c\u4e00\u4e2a\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u81f3\u591a\u53ea\u80fd\u6709\u4e00\u4e2a\u96c6\u5408\u8fd4\u56de\u53c2\u6570\uff0c\u5e76\u4e14\u6bcf\u4e00\u7ec4\u5d4c\u5957\u7684\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u90fd\u4f1a\u72ec\u7acb\u8fd0\u884c\u3002\u518d\u52a0\u4e0a\u8fc7\u53bb\u8fd8\u5141\u8bb8\u6761\u4ef6\u6267\u884c\uff08\u5373\u5728 <code class=\"literal\">CASE</code> \u7b49\u7ed3\u6784\u5185\u90e8\u4f7f\u7528\u96c6\u5408\u8fd4\u56de\u51fd\u6570\uff09\uff0c\u4e8b\u60c5\u5c31\u66f4\u52a0\u590d\u6742\u4e86\u3002\u5982\u679c\u4f60\u8981\u7f16\u5199\u9700\u8981\u5728\u65e7\u7248 <span class=\"productname\">PostgreSQL</span> \u4e0a\u8fd0\u884c\u7684\u67e5\u8be2\uff0c\u5efa\u8bae\u4f7f\u7528 <code class=\"literal\">LATERAL</code> \u8bed\u6cd5\uff0c\u56e0\u4e3a\u8fd9\u6837\u5728\u4e0d\u540c\u7248\u672c\u4e4b\u95f4\u80fd\u591f\u5f97\u5230\u4e00\u81f4\u7684\u7ed3\u679c\u3002\u5982\u679c\u4f60\u7684\u67e5\u8be2\u4f9d\u8d56\u4e8e\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u7684\u6761\u4ef6\u6267\u884c\uff0c\u6216\u8bb8\u53ef\u4ee5\u628a\u6761\u4ef6\u5224\u65ad\u79fb\u52a8\u5230\u81ea\u5b9a\u4e49\u96c6\u5408\u8fd4\u56de\u51fd\u6570\u5185\u90e8\u6765\u4fee\u590d\u3002\u4f8b\u5982\uff0c</p>\n<pre class=\"programlisting\">SELECT x, CASE WHEN y &gt; 0 THEN generate_series(1, z) ELSE 5 END FROM tab;\n</pre>\n<p lang=\"zh\">\u53ef\u4ee5\u53d8\u6210</p>\n<pre class=\"programlisting\">CREATE FUNCTION case_generate_series(cond bool, start int, fin int, els int)\n  RETURNS SETOF int AS $$\nBEGIN\n  IF cond THEN\n    RETURN QUERY SELECT generate_series(start, fin);\n  ELSE\n    RETURN QUERY SELECT els;\n  END IF;\nEND$$ LANGUAGE plpgsql;\n\nSELECT x, case_generate_series(y &gt; 0, 1, z, 5) FROM tab;\n</pre>\n<p lang=\"zh\">\u8fd9\u79cd\u5199\u6cd5\u5728\u6240\u6709\u7248\u672c\u7684 <span class=\"productname\">PostgreSQL</span> \u4e2d\u7684\u884c\u4e3a\u90fd\u76f8\u540c\u3002</p>\n</div>\n</div>\n<div class=\"sect2\" id=\"XFUNC-SQL-FUNCTIONS-RETURNING-TABLE\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/18/xfunc-sql.html#XFUNC-SQL-FUNCTIONS-RETURNING-TABLE\">36.5.10. \u8fd4\u56de<code class=\"literal\">TABLE</code>\u7684<acronym class=\"acronym\">SQL</acronym>\u51fd\u6570</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\">\u8fd8\u6709\u53e6\u4e00\u79cd\u65b9\u6cd5\u53ef\u4ee5\u628a\u51fd\u6570\u58f0\u660e\u4e3a\u8fd4\u56de\u4e00\u4e2a\u96c6\u5408\uff0c\u5373\u4f7f\u7528 <code class=\"literal\">RETURNS TABLE(<em class=\"replaceable\"><code>columns</code></em>)</code>\u8bed\u6cd5\u3002\u8fd9\u7b49\u6548\u4e8e\u4f7f\u7528\u4e00\u4e2a\u6216\u8005\u591a\u4e2a<code class=\"literal\">OUT</code>\u53c2\u6570\u5916\u52a0\u628a\u51fd\u6570\u6807\u8bb0\u4e3a\u8fd4\u56de <code class=\"literal\">SETOF record</code>\uff08\u6216\u8005\u662f<code class=\"literal\">SETOF</code>\u5355\u4e2a\u8f93\u51fa\u53c2\u6570\u7684\u7c7b\u578b\uff09\u3002\u8fd9\u79cd\u5199\u6cd5\u662f\u5728\u6700\u8fd1\u7684 SQL \u6807\u51c6\u4e2d\u6307\u5b9a\u7684\uff0c\u56e0\u6b64\u53ef\u80fd\u6bd4\u4f7f\u7528 <code class=\"literal\">SETOF</code>\u7684\u79fb\u690d\u6027\u66f4\u597d\u3002</p>\n<p lang=\"zh\">\u4f8b\u5982\uff0c\u524d\u9762\u7684\u6c42\u548c\u5e76\u4e14\u76f8\u4e58\u7684\u793a\u4f8b\u4e5f\u53ef\u4ee5\u8fd9\u6837\u6765\u505a\uff1a</p>\n<pre class=\"programlisting\">CREATE FUNCTION sum_n_product_with_tab (x int)\nRETURNS TABLE(sum int, product int) AS $$\n    SELECT $1 + tab.y, $1 * tab.y FROM tab;\n$$ LANGUAGE SQL;\n</pre>\n<p lang=\"zh\">\u4e0d\u5141\u8bb8\u628a\u663e\u5f0f\u7684<code class=\"literal\">OUT</code>\u6216\u8005<code class=\"literal\">INOUT</code>\u53c2\u6570\u7528\u4e8e <code class=\"literal\">RETURNS TABLE</code>\u8bb0\u6cd5 \u2014 \u5fc5\u987b\u628a\u6240\u6709\u8f93\u51fa\u5217\u653e\u5728 <code class=\"literal\">TABLE</code>\u5217\u8868\u4e2d\u3002</p>\n</div>\n<div class=\"sect2\" id=\"XFUNC-SQL-POLYMORPHIC-FUNCTIONS\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/18/xfunc-sql.html#XFUNC-SQL-POLYMORPHIC-FUNCTIONS\">36.5.11. \u591a\u6001<acronym class=\"acronym\">SQL</acronym>\u51fd\u6570</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\"><acronym class=\"acronym\">SQL</acronym> \u51fd\u6570\u53ef\u4ee5\u88ab\u58f0\u660e\u4e3a\u63a5\u53d7\u5e76\u8fd4\u56de<a class=\"xref\" href=\"/docs/18/extend-type-system.html#EXTEND-TYPES-POLYMORPHIC\" title=\"36.2.5.\u00a0\u591a\u6001\u7c7b\u578b\">\u7b2c\u00a036.2.5\u00a0\u8282</a>\u4e2d\u63cf\u8ff0\u7684\u591a\u6001\u7c7b\u578b\u3002\u4e0b\u9762\u8fd9\u4e2a\u591a\u6001\u51fd\u6570 <code class=\"function\">make_array</code> \u4f1a\u6839\u636e\u4e24\u4e2a\u4efb\u610f\u6570\u636e\u7c7b\u578b\u7684\u5143\u7d20\u6784\u9020\u4e00\u4e2a\u6570\u7ec4\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION make_array(anyelement, anyelement) RETURNS anyarray AS $$\n    SELECT ARRAY[$1, $2];\n$$ LANGUAGE SQL;\n\nSELECT make_array(1, 2) AS intarray, make_array('a'::text, 'b') AS textarray;\n intarray | textarray\n----------+-----------\n {1,2}    | {a,b}\n(1 row)\n</pre>\n<p lang=\"zh\">\u6ce8\u610f\u7c7b\u578b\u8f6c\u6362<code class=\"literal\">'a'::text</code>\u7684\u4f7f\u7528\u662f\u4e3a\u4e86\u6307\u5b9a\u8be5\u53c2\u6570\u7684\u7c7b\u578b\u662f<code class=\"type\">text</code>\u3002\u5982\u679c\u8be5\u53c2\u6570\u53ea\u662f\u4e00\u4e2a\u5b57\u7b26\u4e32\u5b57\u9762\u91cf\uff0c\u8fd9\u5c31\u662f\u5fc5\u987b\u7684\uff0c\u56e0\u4e3a\u5426\u5219\u5b83\u4f1a\u88ab\u5f53\u4f5c<code class=\"type\">unknown</code>\u7c7b\u578b\uff0c\u5e76\u4e14 <code class=\"type\">unknown</code>\u7684\u6570\u7ec4\u4e5f\u4e0d\u662f\u4e00\u79cd\u5408\u6cd5\u7684\u7c7b\u578b\u3002\u5982\u679c\u6ca1\u6709\u8be5\u7c7b\u578b\u8f6c\u6362\uff0c\u5c06\u5f97\u5230\u8fd9\u6837\u7684\u9519\u8bef\uff1a</p>\n<pre class=\"screen\">ERROR:  could not determine polymorphic type because input has type unknown\n</pre>\n<p lang=\"zh\">\u6309\u7167\u4e0a\u9762\u7684\u65b9\u5f0f\u58f0\u660e <code class=\"function\">make_array</code> \u65f6\uff0c\u4f60\u5fc5\u987b\u63d0\u4f9b\u4e24\u4e2a\u6570\u636e\u7c7b\u578b\u5b8c\u5168\u76f8\u540c\u7684\u53c2\u6570\uff1b\u7cfb\u7edf\u4e0d\u4f1a\u5c1d\u8bd5\u89e3\u51b3\u5b83\u4eec\u4e4b\u95f4\u7684\u7c7b\u578b\u5dee\u5f02\u3002\u4f8b\u5982\uff0c\u4e0b\u9762\u8fd9\u6837\u662f\u4e0d\u884c\u7684\uff1a</p>\n<pre class=\"screen\">SELECT make_array(1, 2.5) AS numericarray;\nERROR:  function make_array(integer, numeric) does not exist\n</pre>\n<p lang=\"zh\">\u53e6\u4e00\u79cd\u65b9\u6cd5\u662f\u4f7f\u7528<span class=\"quote\">\u201c<span class=\"quote\">common</span>\u201d</span>\u8fd9\u4e00\u65cf\u591a\u6001\u7c7b\u578b\uff0c\u5b83\u5141\u8bb8\u7cfb\u7edf\u5c1d\u8bd5\u8bc6\u522b\u4e00\u4e2a\u5408\u9002\u7684\u516c\u5171\u7c7b\u578b\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION make_array2(anycompatible, anycompatible)\nRETURNS anycompatiblearray AS $$\n    SELECT ARRAY[$1, $2];\n$$ LANGUAGE SQL;\n\nSELECT make_array2(1, 2.5) AS numericarray;\n numericarray\n--------------\n {1,2.5}\n(1 row)\n</pre>\n<p lang=\"zh\">\u7531\u4e8e\u516c\u5171\u7c7b\u578b\u89e3\u6790\u89c4\u5219\u5728\u6240\u6709\u8f93\u5165\u90fd\u662f\u672a\u77e5\u7c7b\u578b\u65f6\u9ed8\u8ba4\u9009\u62e9 <code class=\"type\">text</code>\uff0c\u6240\u4ee5\u4e0b\u9762\u7684\u5199\u6cd5\u4e5f\u80fd\u5de5\u4f5c\uff1a</p>\n<pre class=\"screen\">SELECT make_array2('a', 'b') AS textarray;\n textarray\n-----------\n {a,b}\n(1 row)\n</pre>\n<p lang=\"zh\">\u5141\u8bb8\u5b58\u5728\u5177\u6709\u56fa\u5b9a\u8fd4\u56de\u7c7b\u578b\u7684\u591a\u6001\u53c2\u6570\uff0c\u4f46\u53cd\u8fc7\u6765\u5219\u4e0d\u5141\u8bb8\u3002\u4f8b\u5982\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION is_greater(anyelement, anyelement) RETURNS boolean AS $$\n    SELECT $1 &gt; $2;\n$$ LANGUAGE SQL;\n\nSELECT is_greater(1, 2);\n is_greater\n------------\n f\n(1 row)\n\nCREATE FUNCTION invalid_func() RETURNS anyelement AS $$\n    SELECT 1;\n$$ LANGUAGE SQL;\nERROR:  cannot determine result data type\nDETAIL:  A result of type anyelement requires at least one input of type anyelement, anyarray, anynonarray, anyenum, or anyrange.\n</pre>\n<p lang=\"zh\">\u591a\u6001\u4e5f\u53ef\u4ee5\u548c\u5e26\u8f93\u51fa\u53c2\u6570\u7684\u51fd\u6570\u4e00\u8d77\u4f7f\u7528\u3002\u4f8b\u5982\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION dup (f1 anyelement, OUT f2 anyelement, OUT f3 anyarray)\nAS 'select $1, array[$1,$1]' LANGUAGE SQL;\n\nSELECT * FROM dup(22);\n f2 |   f3\n----+---------\n 22 | {22,22}\n(1 row)\n</pre>\n<p lang=\"zh\">\u591a\u6001\u4e5f\u53ef\u4ee5\u7528\u4e8e\u53ef\u53d8\u53c2\u6570\u51fd\u6570\u3002\u4f8b\u5982\uff1a</p>\n<pre class=\"screen\">CREATE FUNCTION anyleast (VARIADIC anyarray) RETURNS anyelement AS $$\n    SELECT min($1[i]) FROM generate_subscripts($1, 1) g(i);\n$$ LANGUAGE SQL;\n\nSELECT anyleast(10, -1, 5, 4);\n anyleast\n----------\n       -1\n(1 row)\n\nSELECT anyleast('abc'::text, 'def');\n anyleast\n----------\n abc\n(1 row)\n\nCREATE FUNCTION concat_values(text, VARIADIC anyarray) RETURNS text AS $$\n    SELECT array_to_string($2, $1);\n$$ LANGUAGE SQL;\n\nSELECT concat_values('|', 1, 4, 2);\n concat_values\n---------------\n 1|4|2\n(1 row)\n</pre>\n</div>\n<div class=\"sect2\" id=\"XFUNC-SQL-COLLATIONS\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/18/xfunc-sql.html#XFUNC-SQL-COLLATIONS\">36.5.12. \u5e26\u6709\u6392\u5e8f\u89c4\u5219\u7684<acronym class=\"acronym\">SQL</acronym>\u51fd\u6570</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\">\u5f53\u4e00\u4e2a SQL \u51fd\u6570\u6709\u4e00\u4e2a\u6216\u591a\u4e2a\u652f\u6301\u6392\u5e8f\u89c4\u5219\u7684\u6570\u636e\u7c7b\u578b\u53c2\u6570\u65f6\uff0c\u4f1a\u6309<a class=\"xref\" href=\"/docs/18/collation.html\" title=\"23.2.\u00a0\u6392\u5e8f\u89c4\u5219\u652f\u6301\">\u7b2c\u00a023.2\u00a0\u8282</a>\u4e2d\u7684\u8bf4\u660e\uff0c\u6839\u636e\u5206\u914d\u7ed9\u5b9e\u53c2\u7684\u6392\u5e8f\u89c4\u5219\uff0c\u4e3a\u6bcf\u6b21\u51fd\u6570\u8c03\u7528\u786e\u5b9a\u4e00\u4e2a\u6392\u5e8f\u89c4\u5219\u3002\u5982\u679c\u80fd\u591f\u6210\u529f\u786e\u5b9a\uff08\u4e5f\u5c31\u662f\u8bf4\uff0c\u53c2\u6570\u4e4b\u95f4\u4e0d\u5b58\u5728\u9690\u5f0f\u6392\u5e8f\u89c4\u5219\u51b2\u7a81\uff09\uff0c\u90a3\u4e48\u6240\u6709\u652f\u6301\u6392\u5e8f\u89c4\u5219\u7684\u53c2\u6570\u90fd\u4f1a\u88ab\u89c6\u4e3a\u9690\u5f0f\u5e26\u6709\u8be5\u6392\u5e8f\u89c4\u5219\u3002\u8fd9\u4f1a\u5f71\u54cd\u51fd\u6570\u4e2d\u5bf9\u6392\u5e8f\u89c4\u5219\u654f\u611f\u7684\u64cd\u4f5c\u7684\u884c\u4e3a\u3002\u4f8b\u5982\uff0c\u4f7f\u7528\u4e0a\u6587\u7684 <code class=\"function\">anyleast</code> \u51fd\u6570\u65f6\uff0c</p>\n<pre class=\"programlisting\">SELECT anyleast('abc'::text, 'ABC');\n</pre>\n<p lang=\"zh\">\u5176\u7ed3\u679c\u5c06\u53d6\u51b3\u4e8e\u6570\u636e\u5e93\u7684\u9ed8\u8ba4\u6392\u5e8f\u89c4\u5219\u3002\u5728 <code class=\"literal\">C</code> \u533a\u57df\u8bbe\u7f6e\u4e0b\uff0c\u7ed3\u679c\u4f1a\u662f <code class=\"literal\">ABC</code>\uff0c\u4f46\u5728\u8bb8\u591a\u5176\u4ed6\u533a\u57df\u8bbe\u7f6e\u4e0b\u5219\u4f1a\u662f <code class=\"literal\">abc</code>\u3002\u53ef\u4ee5\u5728\u4efb\u610f\u53c2\u6570\u4e0a\u6dfb\u52a0 <code class=\"literal\">COLLATE</code> \u5b50\u53e5\u6765\u5f3a\u5236\u6307\u5b9a\u8981\u4f7f\u7528\u7684\u6392\u5e8f\u89c4\u5219\uff0c\u4f8b\u5982\uff1a</p>\n<pre class=\"programlisting\">SELECT anyleast('abc'::text, 'ABC' COLLATE \"C\");\n</pre>\n<p lang=\"zh\">\u53e6\u5916\uff0c\u5982\u679c\u4f60\u5e0c\u671b\u67d0\u4e2a\u51fd\u6570\u65e0\u8bba\u4ee5\u4ec0\u4e48\u6392\u5e8f\u89c4\u5219\u8c03\u7528\uff0c\u90fd\u59cb\u7ec8\u6309\u7279\u5b9a\u6392\u5e8f\u89c4\u5219\u5de5\u4f5c\uff0c\u53ef\u4ee5\u5728\u51fd\u6570\u5b9a\u4e49\u4e2d\u6309\u9700\u63d2\u5165 <code class=\"literal\">COLLATE</code> \u5b50\u53e5\u3002\u4e0b\u9762\u8fd9\u4e2a\u7248\u672c\u7684 <code class=\"function\">anyleast</code> \u5c06\u59cb\u7ec8\u4f7f\u7528 <code class=\"literal\">en_US</code> \u533a\u57df\u8bbe\u7f6e\u6765\u6bd4\u8f83\u5b57\u7b26\u4e32\uff1a</p>\n<pre class=\"programlisting\">CREATE FUNCTION anyleast (VARIADIC anyarray) RETURNS anyelement AS $$\n    SELECT min($1[i] COLLATE \"en_US\") FROM generate_subscripts($1, 1) g(i);\n$$ LANGUAGE SQL;\n</pre>\n<p lang=\"zh\">\u4f46\u8bf7\u6ce8\u610f\uff0c\u5982\u679c\u628a\u5b83\u7528\u4e8e\u4e0d\u652f\u6301\u6392\u5e8f\u89c4\u5219\u7684\u6570\u636e\u7c7b\u578b\uff0c\u5c31\u4f1a\u629b\u51fa\u9519\u8bef\u3002</p>\n<p lang=\"zh\">\u5982\u679c\u65e0\u6cd5\u5728\u5b9e\u53c2\u4e4b\u95f4\u786e\u5b9a\u5171\u540c\u7684\u6392\u5e8f\u89c4\u5219\uff0c\u90a3\u4e48 SQL \u51fd\u6570\u4f1a\u628a\u53c2\u6570\u89c6\u4e3a\u5e26\u6709\u5176\u6570\u636e\u7c7b\u578b\u7684\u9ed8\u8ba4\u6392\u5e8f\u89c4\u5219\uff08\u901a\u5e38\u662f\u6570\u636e\u5e93\u7684\u9ed8\u8ba4\u6392\u5e8f\u89c4\u5219\uff0c\u4f46\u5bf9\u57df\u7c7b\u578b\u53c2\u6570\u6765\u8bf4\u4e5f\u53ef\u80fd\u4e0d\u540c\uff09\u3002</p>\n<p lang=\"zh\">\u8fd9\u79cd\u652f\u6301\u6392\u5e8f\u89c4\u5219\u7684\u53c2\u6570\u7684\u884c\u4e3a\uff0c\u53ef\u4ee5\u770b\u4f5c\u662f\u4ec5\u9002\u7528\u4e8e\u6587\u672c\u6570\u636e\u7c7b\u578b\u7684\u4e00\u79cd\u53d7\u9650\u591a\u6001\u5f62\u5f0f\u3002</p>\n</div>\n</div>", "manual_path": "/docs/18/xfunc-sql.html", "localization": {"status": "complete", "sources": [{"url": "/docs/18/xfunc-sql.html", "method": "same-major semantic node", "sha256": "60b2418e84c338cf6ad7405b672cb84df094f1298945bf222fdc7c2645afde07", "language": "zh", "matched_nodes": ["#XFUNC-SQL/div[12]/div[10]/h3[0]", "#XFUNC-SQL/div[12]/p[2]", "#XFUNC-SQL/div[12]/p[3]", "#XFUNC-SQL/div[12]/p[4]", "#XFUNC-SQL/div[12]/p[5]", "#XFUNC-SQL/div[12]/p[6]", "#XFUNC-SQL/div[12]/p[8]", "#XFUNC-SQL/div[13]/p[10]", "#XFUNC-SQL/div[13]/p[12]", "#XFUNC-SQL/div[13]/p[13]", "#XFUNC-SQL/div[13]/p[15]", "#XFUNC-SQL/div[13]/p[17]", "#XFUNC-SQL/div[13]/p[19]", "#XFUNC-SQL/div[13]/p[1]", "#XFUNC-SQL/div[13]/p[3]", "#XFUNC-SQL/div[13]/p[4]", "#XFUNC-SQL/div[13]/p[6]", "#XFUNC-SQL/div[13]/p[8]", "#XFUNC-SQL/div[14]/div[12]/ul[0]/li[0]", "#XFUNC-SQL/div[14]/div[12]/ul[0]/li[1]", "#XFUNC-SQL/div[14]/p[10]", "#XFUNC-SQL/div[14]/p[11]", "#XFUNC-SQL/div[14]/p[13]", "#XFUNC-SQL/div[14]/p[15]", "#XFUNC-SQL/div[14]/p[16]", "#XFUNC-SQL/div[14]/p[18]", "#XFUNC-SQL/div[14]/p[1]", "#XFUNC-SQL/div[14]/p[20]", "#XFUNC-SQL/div[14]/p[21]", "#XFUNC-SQL/div[14]/p[23]", "#XFUNC-SQL/div[14]/p[25]", "#XFUNC-SQL/div[14]/p[27]", "#XFUNC-SQL/div[14]/p[28]", "#XFUNC-SQL/div[14]/p[3]", "#XFUNC-SQL/div[14]/p[5]", "#XFUNC-SQL/div[14]/p[6]", "#XFUNC-SQL/div[14]/p[8]", "#XFUNC-SQL/div[15]/p[11]", "#XFUNC-SQL/div[15]/p[2]", "#XFUNC-SQL/div[15]/p[4]", "#XFUNC-SQL/div[15]/p[6]", "#XFUNC-SQL/div[15]/p[8]", "#XFUNC-SQL/div[15]/p[9]", "#XFUNC-SQL/div[16]/p[2]", "#XFUNC-SQL/div[16]/p[4]", "#XFUNC-SQL/div[16]/p[6]", "#XFUNC-SQL/div[16]/p[7]", "#XFUNC-SQL/div[17]/p[10]", "#XFUNC-SQL/div[17]/p[11]", "#XFUNC-SQL/div[17]/p[13]", "#XFUNC-SQL/div[17]/p[14]", "#XFUNC-SQL/div[17]/p[16]", "#XFUNC-SQL/div[17]/p[3]", "#XFUNC-SQL/div[17]/p[5]", "#XFUNC-SQL/div[17]/p[7]", "#XFUNC-SQL/div[17]/p[8]", "#XFUNC-SQL/div[18]/p[2]", "#XFUNC-SQL/div[18]/p[3]", "#XFUNC-SQL/div[18]/p[5]", "#XFUNC-SQL/div[19]/p[1]", "#XFUNC-SQL/div[19]/p[2]", "#XFUNC-SQL/div[19]/p[4]", "#XFUNC-SQL/div[19]/p[5]", "#XFUNC-SQL/div[1]/dl[0]/dt[0]", "#XFUNC-SQL/div[1]/dl[0]/dt[10]", "#XFUNC-SQL/div[1]/dl[0]/dt[11]", "#XFUNC-SQL/div[1]/dl[0]/dt[1]", "#XFUNC-SQL/div[1]/dl[0]/dt[2]", "#XFUNC-SQL/div[1]/dl[0]/dt[3]", "#XFUNC-SQL/div[1]/dl[0]/dt[4]", "#XFUNC-SQL/div[1]/dl[0]/dt[5]", "#XFUNC-SQL/div[1]/dl[0]/dt[6]", "#XFUNC-SQL/div[1]/dl[0]/dt[7]", "#XFUNC-SQL/div[1]/dl[0]/dt[8]", "#XFUNC-SQL/div[1]/dl[0]/dt[9]", "#XFUNC-SQL/div[20]/div[29]/p[1]", "#XFUNC-SQL/div[20]/div[29]/p[3]", "#XFUNC-SQL/div[20]/div[29]/p[5]", "#XFUNC-SQL/div[20]/p[10]", "#XFUNC-SQL/div[20]/p[12]", "#XFUNC-SQL/div[20]/p[13]", "#XFUNC-SQL/div[20]/p[15]", "#XFUNC-SQL/div[20]/p[16]", "#XFUNC-SQL/div[20]/p[18]", "#XFUNC-SQL/div[20]/p[20]", "#XFUNC-SQL/div[20]/p[21]", "#XFUNC-SQL/div[20]/p[22]", "#XFUNC-SQL/div[20]/p[24]", "#XFUNC-SQL/div[20]/p[25]", "#XFUNC-SQL/div[20]/p[2]", "#XFUNC-SQL/div[20]/p[3]", "#XFUNC-SQL/div[20]/p[5]", "#XFUNC-SQL/div[20]/p[7]", "#XFUNC-SQL/div[20]/p[9]", "#XFUNC-SQL/div[21]/p[2]", "#XFUNC-SQL/div[21]/p[3]", "#XFUNC-SQL/div[21]/p[5]", "#XFUNC-SQL/div[22]/p[11]", "#XFUNC-SQL/div[22]/p[13]", "#XFUNC-SQL/div[22]/p[15]", "#XFUNC-SQL/div[22]/p[1]", "#XFUNC-SQL/div[22]/p[3]", "#XFUNC-SQL/div[22]/p[5]", "#XFUNC-SQL/div[22]/p[7]", "#XFUNC-SQL/div[22]/p[9]", "#XFUNC-SQL/div[23]/p[10]", "#XFUNC-SQL/div[23]/p[2]", "#XFUNC-SQL/div[23]/p[4]", "#XFUNC-SQL/div[23]/p[6]", "#XFUNC-SQL/div[23]/p[8]", "#XFUNC-SQL/div[23]/p[9]", "#XFUNC-SQL/p[10]", "#XFUNC-SQL/p[11]", "#XFUNC-SQL/p[3]", "#XFUNC-SQL/p[4]", "#XFUNC-SQL/p[6]", "#XFUNC-SQL/p[8]"]}], "language": "zh", "original_text": {"/versions/18/description/0": "SQL-language functions", "/versions/18/facts/0/label": "Kind", "/versions/18/facts/0/value": "Native function language", "/versions/18/facts/1/label": "Trusted", "/versions/18/facts/2/label": "Validator"}, "fallback_fields": [], "source_language": "en", "original_snapshot_sha256": "2c71c51328a44a8e6a88cade6bc94ac82db6db5e702fc7ca7993cc6bee524eb0"}, "comparison_data": {"kind": "Native function language", "handler": "", "trusted": "t", "validator": "fmgr_sql_validator"}, "comparison_hash": "a4af9cf453d140d941e865b952c6a41e2b704a4b30cb77b61c1cdda8a77c5035", "manual_language": "zh"}, "comparison": {"left": "17", "right": "18", "status": "unchanged", "diff": ""}}