Postgresql的pl/pgql用法--將多條執(zhí)行語(yǔ)句作為一個(gè)事務(wù)
DO $$
DECLARE
v_id bigint;
begin
--1.
INSERT INTO r_test_a (name, value, unit, mode, uid, create_ts)
SELECT 't_t','','',2,0, extract(epoch from now())::bigint
WHERE NOT EXISTS (SELECT id FROM r_test_a WHERE name = 't_t' AND value = '' AND unit = '' AND uid =0);
--2.
SELECT id into v_id from r_test_a WHERE name = 't_t' AND value = '' AND unit = '' AND uid = 0;
--3.
DELETE FROM r_test_b a WHERE a.obj_id = 'xxx' AND a.file_id = 'ooo' AND a.id IN (SELECT id FROM r_test_a b WHERE b.name = 't_t' AND b.uid=0);
--4.
INSERT INTO r_test_b (id, obj_id, file_id, create_ts) SELECT v_id,'xxx','ooo', extract(epoch from now())::bigint ;
end
$$;
補(bǔ)充:PostgreSql 的PL/pgSQL 塊結(jié)構(gòu) (在pgAdmin查詢工具中如何執(zhí)行語(yǔ)句塊)
本文我們學(xué)習(xí)PL/pgSQL結(jié)構(gòu)塊,包括如何寫結(jié)構(gòu)塊和執(zhí)行結(jié)構(gòu)塊。
什么是結(jié)構(gòu)塊
PL/pgSQL是結(jié)構(gòu)塊語(yǔ)言,因此,PL/pgSQL函數(shù)或過程是通過結(jié)構(gòu)塊進(jìn)行組織。完整結(jié)構(gòu)塊的語(yǔ)法如下:
[ label>> ]
[ DECLARE
declarations ]
BEGIN
statements;
...
END [ label ];
詳細(xì)說明如下:
塊有兩部分組成:聲明部分和主體部分。聲明部分是可選的,而主體部分是必須的。塊在end關(guān)鍵字后面使用分號(hào)(;)表示結(jié)束。
塊可以有個(gè)可選的標(biāo)簽在開始和結(jié)尾處。如果你想在塊主體中使用exit語(yǔ)句或限定塊中聲明的變量名稱時(shí),需要使用塊標(biāo)簽。
主體部分是編寫代碼的地方,每條語(yǔ)句需要使用分號(hào)結(jié)束。
PL/pgSQL 塊結(jié)構(gòu)示例
下面示例描述一個(gè)簡(jiǎn)單塊結(jié)構(gòu),一般稱為匿名塊:
DO $$
first_block>>
DECLARE
counter integer := 0;
BEGIN
counter := counter + 1;
RAISE NOTICE 'The current value of counter is %', counter;
END first_block $$;
運(yùn)行結(jié)果:
NOTICE: The current value of counter is 1
從pgAdmin中執(zhí)行塊,點(diǎn)擊圖示按鈕:
注意DO語(yǔ)句不屬于塊結(jié)構(gòu)。它用于執(zhí)行匿名塊。PostgreSQL 在9.0版本中引入DO語(yǔ)句。
在聲明部分定義變量counter并設(shè)置為0.
在主體部分,是counter值加1,通過RAISE NOTICE語(yǔ)句輸出其值。
first_block 標(biāo)簽僅為了演示需要,本例中沒有啥意義。
** 什么是雙 ($$) 符號(hào)?**
($$) 符號(hào) 是單引號(hào)(')的替代符號(hào)。開發(fā)PL/pgSQL 時(shí),無(wú)論是函數(shù)或過程,必須把主體部分放在一個(gè)字符串中。因此必須對(duì)主體部分的單引號(hào)進(jìn)行轉(zhuǎn)義表示:
DO
'first_block>>
DECLARE
counter integer := 0;
BEGIN
counter := counter + 1;
RAISE NOTICE ''The current value of counter is %'', counter;
END first_block';
使用($$) 符號(hào)可以避免引號(hào)問題。也可以在$之間使用標(biāo)識(shí),如之間使用標(biāo)識(shí),如之間使用標(biāo)識(shí),如function$ , procedureprocedureprocedure.
PL/pgSQL 子結(jié)構(gòu)塊
PL/pgSQL可以一個(gè)塊在另一個(gè)塊的主體中。一個(gè)塊嵌入在另一個(gè)塊中稱為子塊,包含子塊的塊稱為外部塊。
子塊用于組織語(yǔ)句,這樣大塊能被分為更小和更多邏輯子塊。子塊的變量的名稱可以與外部塊變量名稱同名,雖然這在實(shí)踐中不建議。當(dāng)在子塊中聲明一個(gè)與外部變量同名的變量,外部變量在子塊中被隱藏。如果需要訪問外部塊的變量,可以使用塊標(biāo)簽作為變量的限定符,如下面示例:
DO $$
outer_block>>
DECLARE
counter integer := 0;
BEGIN
counter := counter + 1;
RAISE NOTICE 'The current value of counter is %', counter;
DECLARE
counter integer := 0;
BEGIN
counter := counter + 10;
RAISE NOTICE 'The current value of counter in the subblock is %', counter;
RAISE NOTICE 'The current value of counter in the outer block is %', outer_block.counter;
END;
RAISE NOTICE 'The current value of counter in the outer block is %', counter;
執(zhí)行結(jié)果如下:
NOTICE: The current value of counter is 1
NOTICE: The current value of counter in the subblock is 10
NOTICE: The current value of counter in the outer block is 1
NOTICE: The current value of counter in the outer block is 1
首先,在外部塊中聲明變量counter。
接著在子塊中也聲明了一個(gè)同名變量。
在進(jìn)入子塊之前,變量的值為1。在子塊中,我們給變量counter值加10,然后打印出來(lái)。注意,這個(gè)改變僅影響子塊中counter變量。
然后,我們通過標(biāo)簽限定符引用外部變量:outer_block.counter
最后,我們打印外部塊變量,其值保持不變。
總結(jié)
本文我們學(xué)習(xí)PL/pgSQL塊結(jié)構(gòu),通過DO語(yǔ)句可以執(zhí)行匿名塊。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。
您可能感興趣的文章:- PostgreSQL查看正在執(zhí)行的任務(wù)并強(qiáng)制結(jié)束的操作方法
- 解決PostgreSQL 執(zhí)行超時(shí)的情況
- PostgreSQL 實(shí)現(xiàn)定時(shí)job執(zhí)行(pgAgent)
- 在postgresql中通過命令行執(zhí)行sql文件
- Postgresql psql文件執(zhí)行與批處理多個(gè)sql文件操作
- 在postgresql中結(jié)束掉正在執(zhí)行的SQL語(yǔ)句操作
- PostgreSQL 實(shí)現(xiàn)sql放入文件批量執(zhí)行