PostgreSQL DO

2021-09-10 14:18 更新

DO — 執(zhí)行一個(gè)匿名代碼塊

大綱

DO [ LANGUAGE lang_name ] code

描述

DO執(zhí)行一個(gè)匿名代碼塊,或者換句話說 執(zhí)行一個(gè)以一種過程語言編寫的瞬時(shí)匿名函數(shù)。

代碼塊就好像是一個(gè)沒有參數(shù)并且返回void的函數(shù)的函數(shù)體。 它會(huì)被在一次時(shí)間內(nèi)解析并且執(zhí)行。

可選的LANGUAGE子句可以卸載代碼塊之前或者之后。

參數(shù)

code

要被執(zhí)行的過程語言代碼。就像在 CREATE FUNCTION中一樣,必須把它指定為一個(gè) 字符串。推薦使用一個(gè)美元引用的文本。

lang_name

編寫該代碼的過程語言的名稱。如果省略,默認(rèn)為plpgsql

注解

要使用的過程語言必須已經(jīng)用CREATE EXTENSION安裝在 當(dāng)前數(shù)據(jù)庫中。默認(rèn)已經(jīng)安裝了plpgsql,但是其他語言沒有被 安裝。

用戶必須擁有該過程語言的USAGE特權(quán),如果該語言 是不可信的則必須是一個(gè)超級(jí)用戶。這和創(chuàng)建一個(gè)該語言的函數(shù)對(duì) 特權(quán)的要求相同。

如果在事務(wù)塊中執(zhí)行DO,過程代碼則無法執(zhí)行事務(wù)控制語句。只有在自己的事務(wù)中執(zhí)行DO時(shí),才允許使用事務(wù)控制語句。

例子

把模式public中所有視圖上的所有特權(quán)授予 給角色webuser

DO $$DECLARE r record;
BEGIN
    FOR r IN SELECT table_schema, table_name FROM information_schema.tables
             WHERE table_type = 'VIEW' AND table_schema = 'public'
    LOOP
        EXECUTE 'GRANT ALL ON ' || quote_ident(r.table_schema) || '.' || quote_ident(r.table_name) || ' TO webuser';
    END LOOP;
END$$;

兼容性

SQL 標(biāo)準(zhǔn)中沒有DO語句。


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)