PostgreSQL DO

2021-09-10 14:18 更新

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

大綱

DO [ LANGUAGE lang_name ] code

描述

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

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

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

參數(shù)

code

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

lang_name

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

注解

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

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

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

例子

把模式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 標準中沒有DO語句。


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

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號