{"Entry":{"collection":"sql","key":"do","name":"DO","aliases":["do"],"metadata":{"aliases":["do"],"changed_in":[],"changes":[{"from":"8.4","purpose_changed":false,"renamed":null,"sections":{"added":[],"changed":[],"removed":[]},"status":"added","synopsis":null,"to":"9.0"},{"from":"10","purpose_changed":false,"renamed":null,"sections":{"added":[],"changed":["notes"],"removed":[]},"status":"changed","synopsis":null,"to":"11"}],"content_hash":"80eeade202486cadd0c4823c2466185ac8bced65aa1f650e4fd477cb59e396b9","editorial":{},"first_version":"9.0","group":"routine","imported_at":"2026-09-30T17:43:36.967434+08:00","last_version":"20","name":"DO","object":"","position":2001,"present_in":["9.0","9.1","9.2","9.3","9.4","9.5","9.6","10","11","12","13","14","15","16","17","18","19","20"],"purpose":"execute an anonymous code block","purpose_zh":"","related":["create-language"],"slug":"do","source_rev":"a709ab85","synopsis":"DO [ LANGUAGE lang_name ] code","verb":"DO"}},"Definition":{"Collection":"sql","Key":"do","SourceDatabase":"center","Version":"18","SourceTable":"sqlcmd","SourceKey":"do","SourceRevision":"a709ab85","Facts":{"anchor":"SQL-DO","file":"sql-do.html","lang":"en","name":"DO","purpose":"execute an anonymous code block","purpose_zh":"","related":["create-language"],"sections":[{"html":"\u003cp\u003e\u003ccode class=\"command\"\u003eDO\u003c/code\u003e executes an anonymous code block, or in other words a transient anonymous function in a procedural language.\u003c/p\u003e\u003cp\u003eThe code block is treated as though it were the body of a function with no parameters, returning \u003ccode class=\"type\"\u003evoid\u003c/code\u003e. It is parsed and executed a single time.\u003c/p\u003e\u003cp\u003eThe optional \u003ccode class=\"literal\"\u003eLANGUAGE\u003c/code\u003e clause can be written either before or after the code block.\u003c/p\u003e","key":"description","title":"Description"},{"html":"\u003cdiv class=\"variablelist\"\u003e\u003cdl class=\"variablelist\"\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e\u003cem class=\"replaceable\"\u003e\u003ccode\u003ecode\u003c/code\u003e\u003c/em\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003eThe procedural language code to be executed. This must be specified as a string literal, just as in \u003ccode class=\"command\"\u003eCREATE FUNCTION\u003c/code\u003e. Use of a dollar-quoted literal is recommended.\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e\u003cem class=\"replaceable\"\u003e\u003ccode\u003elang_name\u003c/code\u003e\u003c/em\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003eThe name of the procedural language the code is written in. If omitted, the default is \u003ccode class=\"literal\"\u003eplpgsql\u003c/code\u003e.\u003c/p\u003e\u003c/dd\u003e\u003c/dl\u003e\u003c/div\u003e","key":"parameters","title":"Parameters"},{"html":"\u003cp\u003eThe procedural language to be used must already have been installed into the current database by means of \u003ccode class=\"command\"\u003eCREATE EXTENSION\u003c/code\u003e. \u003ccode class=\"literal\"\u003eplpgsql\u003c/code\u003e is installed by default, but other languages are not.\u003c/p\u003e\u003cp\u003eThe user must have \u003ccode class=\"literal\"\u003eUSAGE\u003c/code\u003e privilege for the procedural language, or must be a superuser if the language is untrusted. This is the same privilege requirement as for creating a function in the language.\u003c/p\u003e\u003cp\u003eIf \u003ccode class=\"command\"\u003eDO\u003c/code\u003e is executed in a transaction block, then the procedure code cannot execute transaction control statements. Transaction control statements are only allowed if \u003ccode class=\"command\"\u003eDO\u003c/code\u003e is executed in its own transaction.\u003c/p\u003e","key":"notes","title":"Notes"},{"html":"\u003cp\u003eGrant all privileges on all views in schema \u003ccode class=\"literal\"\u003epublic\u003c/code\u003e to role \u003ccode class=\"literal\"\u003ewebuser\u003c/code\u003e:\u003c/p\u003e\u003cpre class=\"programlisting\"\u003eDO $$DECLARE r record;\nBEGIN\n    FOR r IN SELECT table_schema, table_name FROM information_schema.tables\n             WHERE table_type = 'VIEW' AND table_schema = 'public'\n    LOOP\n        EXECUTE 'GRANT ALL ON ' || quote_ident(r.table_schema) || '.' || quote_ident(r.table_name) || ' TO webuser';\n    END LOOP;\nEND$$;\n\u003c/pre\u003e","key":"examples","title":"Examples"},{"html":"\u003cp\u003eThere is no \u003ccode class=\"command\"\u003eDO\u003c/code\u003e statement in the SQL standard.\u003c/p\u003e","key":"compatibility","title":"Compatibility"},{"html":"\u003cspan class=\"simplelist\"\u003e\u003ca href=\"/wiki/sql/create-language/?v=18\" title=\"CREATE LANGUAGE\"\u003e\u003cspan class=\"refentrytitle\"\u003eCREATE LANGUAGE\u003c/span\u003e\u003c/a\u003e\u003c/span\u003e","key":"see_also","title":"See Also"}],"sections_same_as":"","slug":"18","synopsis_html":"DO [ LANGUAGE \u003cem class=\"replaceable\"\u003e\u003ccode\u003elang_name\u003c/code\u003e\u003c/em\u003e ] \u003cem class=\"replaceable\"\u003e\u003ccode\u003ecode\u003c/code\u003e\u003c/em\u003e","synopsis_text":"DO [ LANGUAGE lang_name ] code"},"ManualEvidence":{},"MeasuredEvidence":{}},"Text":{"Collection":"sql","Key":"do","SourceDatabase":"pgweb","Version":"18","Locale":"zh-Hans","Title":"DO","Summary":"执行匿名代码块","BodyHTML":"\u003cpre\u003eDO [ LANGUAGE lang_name ] code\u003c/pre\u003e\u003csection\u003e\u003ch2\u003e描述\u003c/h2\u003e\u003cp\u003e\u003ccode\u003eDO\u003c/code\u003e执行匿名代码块，换言之，就是执行一个以过程语言编写的瞬时匿名函数。\u003c/p\u003e\u003cp\u003e该代码块会被当作一个不带参数、返回\u003ccode\u003evoid\u003c/code\u003e的函数体。它只会被解析并执行一次。\u003c/p\u003e\u003cp\u003e可选的\u003ccode\u003eLANGUAGE\u003c/code\u003e子句可以写在代码块之前，也可以写在之后。\u003c/p\u003e\u003c/section\u003e\u003csection\u003e\u003ch2\u003e参数\u003c/h2\u003e\u003cdiv\u003e\u003cdl\u003e\u003cdt\u003e\u003cspan\u003e\u003cem\u003e\u003ccode\u003ecode\u003c/code\u003e\u003c/em\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e要执行的过程语言代码。与\u003ccode\u003eCREATE FUNCTION\u003c/code\u003e一样，它必须以字符串字面值形式指定。建议使用美元引用的字符串字面值。\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan\u003e\u003cem\u003e\u003ccode\u003elang_name\u003c/code\u003e\u003c/em\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e编写该代码所用的过程语言名称。如果省略，默认值为\u003ccode\u003eplpgsql\u003c/code\u003e。\u003c/p\u003e\u003c/dd\u003e\u003c/dl\u003e\u003c/div\u003e\u003c/section\u003e\u003csection\u003e\u003ch2\u003e注解\u003c/h2\u003e\u003cp\u003e要使用的过程语言必须已经通过\u003ccode\u003eCREATE EXTENSION\u003c/code\u003e安装到当前数据库中。\u003ccode\u003eplpgsql\u003c/code\u003e默认已安装，而其他语言则不会。\u003c/p\u003e\u003cp\u003e用户必须拥有该过程语言的\u003ccode\u003eUSAGE\u003c/code\u003e权限；如果该语言是不受信任的，则必须是超级用户。这与用该语言创建函数时的权限要求相同。\u003c/p\u003e\u003cp\u003e如果在事务块中执行\u003ccode\u003eDO\u003c/code\u003e，则该过程语言代码不能执行事务控制语句。只有当\u003ccode\u003eDO\u003c/code\u003e在其自身事务中执行时，才允许使用事务控制语句。\u003c/p\u003e\u003c/section\u003e\u003csection\u003e\u003ch2\u003e示例\u003c/h2\u003e\u003cp\u003e将模式\u003ccode\u003epublic\u003c/code\u003e中所有视图上的全部权限授予角色\u003ccode\u003ewebuser\u003c/code\u003e：\u003c/p\u003e\u003cpre\u003eDO $$DECLARE r record;\nBEGIN\n    FOR r IN SELECT table_schema, table_name FROM information_schema.tables\n             WHERE table_type = \u0026#39;VIEW\u0026#39; AND table_schema = \u0026#39;public\u0026#39;\n    LOOP\n        EXECUTE \u0026#39;GRANT ALL ON \u0026#39; || quote_ident(r.table_schema) || \u0026#39;.\u0026#39; || quote_ident(r.table_name) || \u0026#39; TO webuser\u0026#39;;\n    END LOOP;\nEND$$;\n\u003c/pre\u003e\u003c/section\u003e\u003csection\u003e\u003ch2\u003e兼容性\u003c/h2\u003e\u003cp\u003eSQL 标准中没有\u003ccode\u003eDO\u003c/code\u003e语句。\u003c/p\u003e\u003c/section\u003e\u003csection\u003e\u003ch2\u003e另见\u003c/h2\u003e\u003cspan\u003e\u003ca href=\"/wiki/sql/create-language/?v=18\" title=\"CREATE LANGUAGE\" rel=\"nofollow\"\u003e\u003cspan\u003eCREATE LANGUAGE\u003c/span\u003e\u003c/a\u003e\u003c/span\u003e\u003c/section\u003e","SourceRevision":"1b5ca64c","ContentHash":"f9905deec5bec59b10b9dc8f72a4e2d09826947ce9b2a58387ece5cb1c901efe","Payload":{"purpose_zh":"执行匿名代码块","sections":[{"html":"\u003cp\u003e\u003ccode class=\"command\"\u003eDO\u003c/code\u003e执行匿名代码块，换言之，就是执行一个以过程语言编写的瞬时匿名函数。\u003c/p\u003e\u003cp\u003e该代码块会被当作一个不带参数、返回\u003ccode class=\"type\"\u003evoid\u003c/code\u003e的函数体。它只会被解析并执行一次。\u003c/p\u003e\u003cp\u003e可选的\u003ccode class=\"literal\"\u003eLANGUAGE\u003c/code\u003e子句可以写在代码块之前，也可以写在之后。\u003c/p\u003e","key":"description","title":"描述"},{"html":"\u003cdiv class=\"variablelist\"\u003e\u003cdl class=\"variablelist\"\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e\u003cem class=\"replaceable\"\u003e\u003ccode\u003ecode\u003c/code\u003e\u003c/em\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e要执行的过程语言代码。与\u003ccode class=\"command\"\u003eCREATE FUNCTION\u003c/code\u003e一样，它必须以字符串字面值形式指定。建议使用美元引用的字符串字面值。\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e\u003cem class=\"replaceable\"\u003e\u003ccode\u003elang_name\u003c/code\u003e\u003c/em\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e编写该代码所用的过程语言名称。如果省略，默认值为\u003ccode class=\"literal\"\u003eplpgsql\u003c/code\u003e。\u003c/p\u003e\u003c/dd\u003e\u003c/dl\u003e\u003c/div\u003e","key":"parameters","title":"参数"},{"html":"\u003cp\u003e要使用的过程语言必须已经通过\u003ccode class=\"command\"\u003eCREATE EXTENSION\u003c/code\u003e安装到当前数据库中。\u003ccode class=\"literal\"\u003eplpgsql\u003c/code\u003e默认已安装，而其他语言则不会。\u003c/p\u003e\u003cp\u003e用户必须拥有该过程语言的\u003ccode class=\"literal\"\u003eUSAGE\u003c/code\u003e权限；如果该语言是不受信任的，则必须是超级用户。这与用该语言创建函数时的权限要求相同。\u003c/p\u003e\u003cp\u003e如果在事务块中执行\u003ccode class=\"command\"\u003eDO\u003c/code\u003e，则该过程语言代码不能执行事务控制语句。只有当\u003ccode class=\"command\"\u003eDO\u003c/code\u003e在其自身事务中执行时，才允许使用事务控制语句。\u003c/p\u003e","key":"notes","title":"注解"},{"html":"\u003cp\u003e将模式\u003ccode class=\"literal\"\u003epublic\u003c/code\u003e中所有视图上的全部权限授予角色\u003ccode class=\"literal\"\u003ewebuser\u003c/code\u003e：\u003c/p\u003e\u003cpre class=\"programlisting\"\u003eDO $$DECLARE r record;\nBEGIN\n    FOR r IN SELECT table_schema, table_name FROM information_schema.tables\n             WHERE table_type = 'VIEW' AND table_schema = 'public'\n    LOOP\n        EXECUTE 'GRANT ALL ON ' || quote_ident(r.table_schema) || '.' || quote_ident(r.table_name) || ' TO webuser';\n    END LOOP;\nEND$$;\n\u003c/pre\u003e","key":"examples","title":"示例"},{"html":"\u003cp\u003eSQL 标准中没有\u003ccode class=\"command\"\u003eDO\u003c/code\u003e语句。\u003c/p\u003e","key":"compatibility","title":"兼容性"},{"html":"\u003cspan class=\"simplelist\"\u003e\u003ca href=\"/wiki/sql/create-language/?v=18\" title=\"CREATE LANGUAGE\"\u003e\u003cspan class=\"refentrytitle\"\u003eCREATE LANGUAGE\u003c/span\u003e\u003c/a\u003e\u003c/span\u003e","key":"see_also","title":"另见"}],"sections_same_as":"","synopsis_html":"DO [ LANGUAGE \u003cem class=\"replaceable\"\u003e\u003ccode\u003elang_name\u003c/code\u003e\u003c/em\u003e ] \u003cem class=\"replaceable\"\u003e\u003ccode\u003ecode\u003c/code\u003e\u003c/em\u003e","synopsis_text":"DO [ LANGUAGE lang_name ] code"}},"RequestedLocale":"zh-Hans","Fallback":false,"Versions":["10","11","12","13","14","15","16","17","18","19","20","9.0","9.1","9.2","9.3","9.4","9.5","9.6"],"Locales":["en","zh-Hans"],"Signatures":null,"Spellings":null,"SQLState":null,"Evidence":null}
