PostgreSQL數(shù)據(jù)庫(kù)中匿名塊的寫法實(shí)例
看代碼吧~
test=# DO $$DECLARE i record; test$# BEGIN test$# FOR i IN 1..10 test$# LOOP test$# execute 'select loop_insert(1)'; test$# END LOOP; test$# END$$; DO test=#
看匿名塊的執(zhí)行效果:
test=# select count(*) from lineitem; count ------- 7000 (1 row) test=# select count(*) from lineitem; count ------- 17000 ------------->>>>匿名塊插入了10000條記錄. (1 row) test=#
補(bǔ)充:PostgreSql 的PL/pgSQL 塊結(jié)構(gòu) (在pgAdmin查詢工具中如何執(zhí)行語(yǔ)句塊)
PostgreSql 的PL/pgSQL 塊結(jié)構(gòu)
本文我們學(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ù)或過(guò)程是通過(guò)結(jié)構(gòu)塊進(jìn)行組織。完整結(jié)構(gòu)塊的語(yǔ)法如下:
[ <<label>> ] [ DECLARE declarations ] BEGIN statements; ... END [ label ];
詳細(xì)說(shuō)明如下:
塊有兩部分組成:聲明部分和主體部分。聲明部分是可選的,而主體部分是必須的。塊在end關(guān)鍵字后面使用分號(hào)(;)表示結(jié)束。
塊可以有個(gè)可選的標(biāo)簽在開(kāi)始和結(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,通過(guò)RAISE NOTICE語(yǔ)句輸出其值。
first_block 標(biāo)簽僅為了演示需要,本例中沒(méi)有啥意義。
** 什么是雙 ($$) 符號(hào)?**
($$) 符號(hào) 是單引號(hào)(')的替代符號(hào)。開(kāi)發(fā)PL/pgSQL 時(shí),無(wú)論是函數(shù)或過(guò)程,必須把主體部分放在一個(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)問(wèn)題。也可以在$之間使用標(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è)與外部變量同名的變量,外部變量在子塊中被隱藏。如果需要訪問(wèn)外部塊的變量,可以使用塊標(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變量。
然后,我們通過(guò)標(biāo)簽限定符引用外部變量:outer_block.counter
最后,我們打印外部塊變量,其值保持不變。
總結(jié)
本文我們學(xué)習(xí)PL/pgSQL塊結(jié)構(gòu),通過(guò)DO語(yǔ)句可以執(zhí)行匿名塊。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。
- postgreSQL數(shù)據(jù)庫(kù)默認(rèn)用戶postgres常用命令分享
- postgresql修改完端口后直接psql連接數(shù)據(jù)庫(kù)報(bào)錯(cuò)的解決
- postgresql數(shù)據(jù)庫(kù)安裝部署搭建主從節(jié)點(diǎn)的詳細(xì)過(guò)程(業(yè)務(wù)庫(kù))
- 如何獲取PostgreSQL數(shù)據(jù)庫(kù)中的JSON值
- postgreSQL數(shù)據(jù)庫(kù)的監(jiān)控及數(shù)據(jù)維護(hù)操作
- SpringBoot連接使用PostgreSql數(shù)據(jù)庫(kù)的方法
- PostgreSql 導(dǎo)入導(dǎo)出sql文件格式的表數(shù)據(jù)實(shí)例
- PostgreSQL upsert(插入更新)數(shù)據(jù)的操作詳解
- 使用postgresql 模擬批量數(shù)據(jù)插入的案例
相關(guān)文章
PostgreSql觸發(fā)器創(chuàng)建、使用以及刪除示例詳解
在PostgreSQL中觸發(fā)器函數(shù)是一個(gè)沒(méi)有參數(shù)并且返回trigger類型的函數(shù),這篇文章主要給大家介紹了關(guān)于PostgreSql觸發(fā)器創(chuàng)建、使用以及刪除的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-03-03使用psql操作PostgreSQL數(shù)據(jù)庫(kù)命令詳解
這篇文章主要為大家介紹了使用psql操作PostgreSQL數(shù)據(jù)庫(kù)命令詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08在windows下手動(dòng)初始化PostgreSQL數(shù)據(jù)庫(kù)教程
在windows下手動(dòng)初始化PG,是一件比較麻煩的事,下面我具體寫一下過(guò)程,大家做一下參考。2014-09-09PgSQL條件語(yǔ)句與循環(huán)語(yǔ)句示例代碼詳解
這篇文章主要介紹了PgSQL條件語(yǔ)句與循環(huán)語(yǔ)句,pgSQL中有兩種條件語(yǔ)句分別為if與case語(yǔ)句,每種語(yǔ)句通過(guò)示例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-07-07用PostgreSQL數(shù)據(jù)庫(kù)做地理位置app應(yīng)用
項(xiàng)目中用到了postgreSQL中的earthdistance()函數(shù)功能計(jì)算地球上兩點(diǎn)之間的距離,中文的資料太少了,我找到了一篇 英文的、講的很好的文章,特此翻譯,希望能夠幫助到以后用到earthdistance的同學(xué)2014-03-03postgresql 實(shí)現(xiàn)數(shù)據(jù)的導(dǎo)入導(dǎo)出
這篇文章主要介紹了postgresql 實(shí)現(xiàn)數(shù)據(jù)的導(dǎo)入導(dǎo)出,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-12-12PostgreSQL字符切割:substring函數(shù)的用法說(shuō)明
這篇文章主要介紹了PostgreSQL字符切割:substring函數(shù)的用法說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-02-02Postgresql開(kāi)啟遠(yuǎn)程訪問(wèn)的步驟全紀(jì)錄
postgre一般默認(rèn)為本地連接,不支持遠(yuǎn)程訪問(wèn),所以如果要開(kāi)啟遠(yuǎn)程訪問(wèn),需要更改安裝文件的配置。下面這篇文章主要給大家介紹了關(guān)于Postgresql開(kāi)啟遠(yuǎn)程訪問(wèn)的相關(guān)資料,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。2018-03-03PostgreSQL實(shí)時(shí)查看數(shù)據(jù)庫(kù)實(shí)例正在執(zhí)行的SQL語(yǔ)句實(shí)例詳解
在任何數(shù)據(jù)庫(kù)中,分析和優(yōu)化SQL的執(zhí)行,最重要的工作就是執(zhí)行計(jì)劃的解讀,而說(shuō)到執(zhí)行計(jì)劃得先了解postgresql的查詢執(zhí)行過(guò)程,下面這篇文章主要給大家介紹了關(guān)于PostgreSQL實(shí)時(shí)查看數(shù)據(jù)庫(kù)實(shí)例正在執(zhí)行的SQL語(yǔ)句的相關(guān)資料,需要的朋友可以參考下2023-01-01如何解決PostgreSQL執(zhí)行語(yǔ)句長(zhǎng)時(shí)間卡著不動(dòng)不報(bào)錯(cuò)也不執(zhí)行的問(wèn)題
某日開(kāi)發(fā)同事上報(bào)一sql性能問(wèn)題,一條查詢好似一直跑不出結(jié)果,查詢了n小時(shí),還未返回結(jié)果,這篇文章主要給大家介紹了關(guān)于如何解決PostgreSQL執(zhí)行語(yǔ)句長(zhǎng)時(shí)間卡著不動(dòng)不報(bào)錯(cuò)也不執(zhí)行問(wèn)題的相關(guān)資料,需要的朋友可以參考下2024-02-02