Postgresql 存儲過程(plpgsql)兩層for循環(huán)的操作
項目中遇到測試,需要造4500數(shù)據(jù),而且需要分部門和日期,一個部門一天30條數(shù)據(jù),剩下的鋪墊數(shù)據(jù)可以一個部門一天100w左右數(shù)據(jù),這里,每次變換部門,日期,需要操作至少300次,想到用存儲過程寫一個函數(shù)進(jìn)行
首先,了解存儲過程的語法:
CREATE [ OR REPLACE ] FUNCTION name( [ [argmode] [argname]argtype[ { DEFAULT | = }default_expr] [, ...] ] ) [ RETURNSrettype | RETURNS TABLE (column_namecolumn_type[, ...] ) ] { LANGUAGElang_name | WINDOW | IMMUTABLE | STABLE | VOLATILE | CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT | [ EXTERNAL ] SECURITY INVOKER | [ EXTERNAL ] SECURITY DEFINER | COSTexecution_cost | ROWSresult_rows | SETconfiguration_parameter{ TOvalue| =value| FROM CURRENT } | AS 'definition' | AS 'obj_file', 'link_symbol' } ... [ WITH (attribute[, ...] ) ] ————————————————
CREATE [ OR REPLACE ] FUNCTION--創(chuàng)建一個函數(shù),若有此函數(shù),即取代重新創(chuàng)建 name -------函數(shù)名稱
RETURNS---函數(shù)返回類型
具體的函數(shù)聲明,請參考[postgresql存儲過程]
下面說我寫的函數(shù):
CREATE OR REPLACE FUNCTION "xue"."insert_into_table"() RETURNS "pg_catalog"."void" AS $BODY$ DECLARE tmp VARCHAR(1024); DECLARE n integer; DECLARE i integer; DECLARE inst_seq_no CURSOR FOR SELECT inst_seq_no FROM t where no in ( '111','22','223','33','4358', '233','449','315','35335'); BEGIN RAISE NOTICE '------------start----------'; i := 30; FOR stmt IN no LOOP n := 30; FOR n IN n..i LOOP insert into test2 (NO, test_NO,TIME,USER_NO,SEQ_NO, NAME,USER_NO1,USER_NAME,CODE,USER_NO2,OPROR_NAME, REVIEW_TIME,DESC, VAL1,VAL2,DATE,UPD_TIME,DEL_FLAG) values (nextval('seq_test2'),n,'20190910',n,stmt.seq_no,n,n,n,n,n,n,'20190910','01','',n,n,'20190910', '20190909','0'); END LOOP; n = n+30; i = i+30; END LOOP; RAISE NOTICE '-----------finished---------'; END; $BODY$ LANGUAGE plpgsql VOLATILE COST 100`
很簡單的邏輯,但是在修改了三四遍才實現(xiàn),這個第二次寫存儲過程,很多語法不是很熟悉,要注意的如:
1.`變量聲明要用DECLARE
2.``游標(biāo) CURSOR 的用法
3.for循環(huán)要在begin中執(zhí)行,
4.循環(huán)中要用“:=”
補(bǔ)充:Postgresql中存儲過程(函數(shù))調(diào)用存儲過程(函數(shù))時應(yīng)用注意的問題
在postgresql中我們在執(zhí)行存儲過程中往往會使用select 存儲過程,但是如果存儲過程中再調(diào)用 存儲過程時,就不能這樣用了,應(yīng)該用perform 存儲過程,可以去參考官方文檔的說明
執(zhí)行一個沒有結(jié)果的表達(dá)式或者命令
有時候我們希望計算一個表達(dá)式或者一個命令,但是卻丟棄其結(jié)果(通常因為我們經(jīng)常調(diào)用一些存在有用的副作用但是不存在有用結(jié)果值的函數(shù))。 要在 PL/pgSQL 里干這件事, 你可以使用PERFORM語句:
PERFORM query;
這條語句執(zhí)行一個 query并且丟棄結(jié)果。 query 的寫法和你平常寫 SQL SELECT 命令是一樣的, 只是把開頭的關(guān)鍵字 SELECT 替換成 PERFORM。 PL/pgSQL 的變量和平常一樣代換到命令中。 同樣,如果命令生成至少一行,那么特殊的變量 FOUND 設(shè)置為真,如果沒有生成行,則為假。
注意: 我們可能希望沒有INTO子句的SELECT也能滿足這樣的需要, 但是目前可以接受的唯一的方法是PERFORM。
一個例子:
PERFORM create_mv('cs_session_page_requests_mv', my_query);
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。
相關(guān)文章
postgresql如何查詢重復(fù)計數(shù)及去重查詢
這篇文章主要介紹了postgresql如何查詢重復(fù)計數(shù)及去重查詢問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-11-11PostgreSQL數(shù)據(jù)庫字符串拼接、大小寫轉(zhuǎn)換以及substring詳解
在日常工作中會遇到將多行的值拼接為一個值展現(xiàn),下面這篇文章主要給大家介紹了關(guān)于PostgreSQL數(shù)據(jù)庫字符串拼接、大小寫轉(zhuǎn)換以及substring的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-04-04利用OGG實現(xiàn)PostgreSQL實時同步的過程詳解
本文詳細(xì)闡述了利用OGG實現(xiàn)PostgreSQL實時同步的全過程,文章通過代碼示例和圖文結(jié)合講解的非常詳細(xì),對大家的學(xué)習(xí)或工作有一定的參考價值,需要的朋友可以參考下2023-11-11Postgresql psql文件執(zhí)行與批處理多個sql文件操作
這篇文章主要介紹了Postgresql psql文件執(zhí)行與批處理多個sql文件操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-01-01postgresql 實現(xiàn)修改jsonb字段中的某一個值
這篇文章主要介紹了postgresql 實現(xiàn)修改jsonb字段中的某一個值操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-01-01Windows下Postgresql數(shù)據(jù)庫的下載與配置方法
這篇文章主要介紹了Windows下Postgresql數(shù)據(jù)庫的下載與配置方法 ,需要的朋友可以參考下2014-06-06Mac系統(tǒng)重置PostgreSQL密碼的方法示例代碼
PostgreSQL 是一個免費(fèi)的對象-關(guān)系數(shù)據(jù)庫服務(wù)器(ORDBMS),在靈活的BSD許可證下發(fā)行。這篇文章主要介紹了Mac系統(tǒng)重置PostgreSQL密碼的方法示例代碼,需要的朋友可以參考下2020-02-02