版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、POSTGRESQL DB PL/PGSQL Procedure Fundamental INFO GLORYSOFT INC.ZP Li2011.12.24QQ:80184001目錄PL/PGSQL 函數(shù)PL/PGSQL 函數(shù)示例PL/PGSQL 的結(jié)構(gòu)PL/PGSQL變量聲明PL/PGSQL基本語句PL/PGSQL控制結(jié)構(gòu)PL/PGSQL游標(biāo)PL/PGSQL錯(cuò)誤和消息處理PL/PGSQL附錄PL/PGSQL 函數(shù)PL/PGSQL 函數(shù)的代碼都是在 CREATE FUNCTION 里以一個(gè)字符串文本的方式聲明的。且 字符串文本體 需要使用符號界定符來標(biāo)志,一般建議用美元符界定的字符串文本來寫
2、函數(shù)體。可如下寫 CREATE FUNCTION 命令,創(chuàng)建函數(shù)CREATE OR REPLACE FUNCTION testfunc(integer) RETURNS integer AS $BODY$ .$BODY$ LANGUAGE plpgsql;注:其中$BODY$ 可成對代替為$PROC$, $ 等其他界定符PL/PGSQL 函數(shù)示例CREATE FUNCTION somefunc() RETURNS integer AS $DECLARE quantity integer := 30;BEGIN RAISE NOTICE Quantity here is %, quantity;
3、 - 在這里的數(shù)量是 30 quantity := 50; - - 創(chuàng)建一個(gè)子塊 - DECLARE quantity integer := 80; BEGIN RAISE NOTICE Quantity here is %, quantity; - 在這里的數(shù)量是 80 END; RAISE NOTICE Quantity here is %, quantity; - 在這里的數(shù)量是 50 RETURN quantity;END;$ LANGUAGE plpgsql;PL/PGSQL 的結(jié)構(gòu)的結(jié)構(gòu)PL/PGSQL 是一種塊結(jié)構(gòu)的語言。如下定義一個(gè)塊: DECLARE declarations
4、 BEGIN statements END label;塊中的每個(gè)聲明和每條語句都是用一個(gè)分號終止的,如果一個(gè)子塊在另外一個(gè)塊里,那么 END 后面必須有個(gè)分號;不過結(jié)束函數(shù)體的最后的 END 可以不要這個(gè)分號。塊語句段里的任何語句都可以是一個(gè)子塊。PL/PGSQL塊組成PL/PGSQL函數(shù)體;PL/PGSQL變量聲明1.變量聲明語法name CONSTANT type NOT NULL DEFAULT | := expression;2.變量聲明例子user_id integer; quantity numeric(5); url varchar; myrow tablename%ROWTY
5、PE; myfield tablename.columnname%TYPE; arow RECORD;PL/PGSQL變量聲明3.函數(shù)輸入輸出參數(shù)變量的聲明CREATE FUNCTION sum_n_product(IN x int, IN y int, OUT sum int, OUT prod int) AS $ BEGIN sum := x + y; prod := x * y; END; $ LANGUAGE plpgsql;PL/PGSQL變量聲明4.拷貝類型拷貝類型variable%TYPE%TYPE 提供一個(gè)變量或者表字段的數(shù)據(jù)類型。 比如,假如在 users 表里面有一個(gè) us
6、er_id 字段。要聲明一個(gè)和 users.user_id 類型相同的變量,可以這樣定義:user_id users.user_id%TYPE;PL/PGSQL變量聲明5.5.行類型行類型name table_name%ROWTYPE; 一個(gè)復(fù)合類型變量叫做行變量(或者 row-type 變量)。這樣的一個(gè)變量可以保存一次 SELECT 或 FOR 命令結(jié)果的完整一行,只要命令的字段集匹配該變量聲明的類型。行數(shù)值的字段使用點(diǎn)表示法訪問,比如 rowvar.field 。6.6.記錄類型記錄類型name RECORD;記錄變量類似行類型變量,但是它們沒有預(yù)定義的結(jié)構(gòu)。它們在 SELECT 或 F
7、OR 命令中獲取實(shí)際的行結(jié)構(gòu)。附:除以上類型外,下表是基本的標(biāo)量數(shù)據(jù)類型列表附:除以上類型外,下表是基本的標(biāo)量數(shù)據(jù)類型列表名字名字別名別名描述描述bigintint8有符號 8 字節(jié)整數(shù)bigserialserial8自增 8 字節(jié)整數(shù)bit (n) 定長位串bit varying (n) varbit變長位串booleanbool邏輯布爾值(真/假)box平面中的矩形bytea二進(jìn)制數(shù)據(jù)(字節(jié)數(shù)組)character varying (n) varchar (n) 變長字符串character (n) char (n) 定長字符串cidrIPv4 或 IPv6 網(wǎng)絡(luò)地址circle平面中的圓
8、date日歷日期(年, 月, 日)double precisionfloat8雙精度浮點(diǎn)數(shù)字inetIPv4 或 IPv6 網(wǎng)絡(luò)地址integerint, int4有符號 4 字節(jié)整數(shù)interval (p) 時(shí)間間隔line平面中的無限長直線lseg平面中的線段macaddrMAC 地址numeric (p, s) decimal (p, s) 可選精度的準(zhǔn)確數(shù)字path平面中的幾何路徑point平面中的點(diǎn)polygon平面中的封閉幾何路徑realfloat4單精度浮點(diǎn)數(shù)smallintint2有符號 2 字節(jié)整數(shù)serialserial4自增 4 字節(jié)整數(shù)text變長字符串time (p)
9、 without time zone 一天中的時(shí)間time (p) with time zonetimetz一天里的時(shí)間,包括時(shí)區(qū)timestamp (p) without time zone 日期和時(shí)間timestamp (p) with time zonetimestamptz日期和時(shí)間,包括時(shí)區(qū)PL/PGSQL基本語句1.賦值語句賦值語句給一個(gè)變量或行/記錄賦值用下面方法:identifier := expression;例子:user_id := 20; tax := subtotal * 0.06;PL/PGSQL基本語句2.執(zhí)行一個(gè)僅有單行結(jié)果的執(zhí)行一個(gè)僅有單行結(jié)果的SELECT
10、INTO 查詢語句查詢語句如果一個(gè) SQL 命令的結(jié)果是一個(gè)單獨(dú)的行(可能有多個(gè)字段),那么可以將其賦予一個(gè)記錄變量、行類型變量、標(biāo)量變量的列表。這可以通過在基本 SQL 命令之后添加一個(gè) INTO 子句達(dá)到。如下:SELECT select_expressions INTO STRICT target FROM .; INSERT . RETURNING expressions INTO STRICT target; UPDATE . RETURNING expressions INTO STRICT target; DELETE . RETURNING expressions INTO S
11、TRICT target;注: 其中target 是一個(gè)變量;如果沒有指定 STRICT ,那么 target 將被設(shè)為查詢返回結(jié)果的第一行或者 NULL(查詢返回零行),可以檢查特殊變量 FOUND來判斷查詢是否至少返回一行。如果指定了 STRICT 選項(xiàng),那么查詢必須返回恰好一行,否則將產(chǎn)生 NO_DATA_FOUND(沒有行) 或者 TOO_MANY_ROWS(多于一行)運(yùn)行時(shí)錯(cuò)誤。可以使用異常塊來捕獲這些錯(cuò)誤。例子BEGINSELECT * INTO myrec FROM emp WHERE empname = myname; IF NOT FOUND THEN RAISE EXCEP
12、TION employee % not found, myname; END IF;END;BEGINSELECT * INTO STRICT myrec FROM emp WHERE empname = myname; EXCEPTION WHEN NO_DATA_FOUND THEN RAISE EXCEPTION employee % not found, myname; WHEN TOO_MANY_ROWS THEN RAISE EXCEPTION employee % not unique, myname; END;PL/PGSQL基本語句3.賦值語句賦值語句什么也不做的占位語句,可
13、以使用 NULL 語句或空語句達(dá)到這個(gè)目的。如下:NULL;例,下面兩段代碼對等:BEGIN y := x / 0; EXCEPTION WHEN division_by_zero THEN NULL; - 忽略錯(cuò)誤 END; BEGIN y := x / 0; EXCEPTION WHEN division_by_zero THEN -空語句,忽略錯(cuò)誤 END;PL/PGSQL基本語句4.執(zhí)行動(dòng)態(tài)命令執(zhí)行動(dòng)態(tài)命令EXECUTE語句語句EXECUTE 語句:EXECUTE command-string INTO STRICT target;例子例子EXECUTE UPDATE t SET ke
14、y | = | quote_literal(newkey) | WHERE id = | newid;注:給表字段賦值的變量為字符串時(shí),該語句中需使用函數(shù)注:給表字段賦值的變量為字符串時(shí),該語句中需使用函數(shù)quote_literal。PL/PGSQL控制結(jié)構(gòu)控制結(jié)構(gòu)可能是 PL/PGSQL 中最有用的(以及最重要)的部分了。1.從函數(shù)返回從函數(shù)返回有兩個(gè)命令可以用來從函數(shù)中返回?cái)?shù)據(jù):RETURN 和 RETURN NEXT 。1.1.RETURNRETURN expression;帶表達(dá)式的 RETURN 用于終止函數(shù)并把 expression的值返回給調(diào)用者。1.2.RETURN NEXTR
15、ETURN NEXT expression;RETURN NEXT 實(shí)際上并不從函數(shù)中返回,它只是簡單地把表達(dá)式的值保存起來。然后執(zhí)行繼續(xù)執(zhí)行 PL/pgSQL 函數(shù)里的下一條語句。隨著后繼的 RETURN NEXT 命令的執(zhí)行,結(jié)果集就建立起來了。最后一個(gè) RETURN 應(yīng)該沒有參數(shù),它導(dǎo)致控制退出該函數(shù)(或者你可以簡單地讓控制到達(dá)函數(shù)的結(jié)尾)。使用 RETURN NEXT 的函數(shù)應(yīng)該按照下面的風(fēng)格調(diào)用:SELECT * FROM some_func();PL/PGSQL控制結(jié)構(gòu)1.3.函數(shù)返回示例CREATE TABLE foo (fooid INT, foosubid INT, foon
16、ame TEXT); INSERT INTO foo VALUES (1, 2, three); INSERT INTO foo VALUES (4, 5, six); CREATE OR REPLACE FUNCTION getallfoo() RETURNS SETOF foo AS$BODY$ DECLARE r foo%rowtype; BEGIN FOR r IN SELECT * FROM foo WHERE fooid 0 LOOP - can do some processing here RETURN NEXT r; - return next row of SELECT E
17、ND LOOP; RETURN; END $BODY$ LANGUAGE plpgsql; SELECT * FROM getallfoo();PL/PGSQL控制結(jié)構(gòu)2.條件條件IF 語句讓你可以根據(jù)某種條件執(zhí)行命令。PL/PGSQL 有五種形式的 IF :IF . THENIF . THEN . ELSEIF . THEN . ELSE IFIF . THEN . ELSIF . THEN . ELSEIF . THEN . ELSEIF . THEN . ELSEPL/PGSQL控制結(jié)構(gòu)2.1. IF-THENIF boolean-expression THEN statementsEN
18、D IF;IF-THEN 語句是 IF 的最簡單形式。如果條件為真,在 THEN 和 END IF 之間的語句將被執(zhí)行。否則,將忽略它們。例子:IF v_user_id 0 THEN UPDATE users SET email = v_email WHERE user_id = v_user_id;END IF;PL/PGSQL控制結(jié)構(gòu) 2.2. IF-THEN-ELSEIF boolean-expression THEN statementsELSE statementsEND IF;IF-THEN-ELSE 語句增加了 IF-THEN 的分支,讓你可以聲明在條件為假的時(shí)候執(zhí)行的語句。例子
19、:IF parentid IS NULL OR parentid = THEN RETURN fullname;ELSE RETURN hp_true_filename(parentid) | / | fullname;END IF;IF v_count 0 THEN INSERT INTO users_count (count) VALUES (v_count); RETURN t;ELSE RETURN f;END IF;PL/PGSQL控制結(jié)構(gòu)2.3. IF-THEN-ELSE IFIF 語句可以像下面的例子那樣嵌套:IF demo_row.sex = m THEN pretty_sex
20、 := man;ELSE IF demo_row.sex = f THEN pretty_sex := woman; END IF;END IF;注:這種形式實(shí)際上就是在另外一個(gè) IF 語句的 ELSE 部分嵌套了另一個(gè) IF 語句。PL/PGSQL控制結(jié)構(gòu)2.4. IF-THEN-ELSIF-ELSEIF boolean-expression THEN statementsELSIF boolean-expression THEN statementsELSIF boolean-expression THEN statements .ELSE statementsEND IF;IF-THEN
21、-ELSIF-ELSE 提供了一種更方便的方法用于在一條語句中檢查許多候選條件。形式上它和嵌套的 IF-THEN-ELSE-IF-THEN 命令相同,但是只需要一個(gè) END IF 。PL/PGSQL控制結(jié)構(gòu)2.5. IF-THEN-ELSEIF-ELSEELSEIF 是 ELSIF 的別名。IF-THEN-ELSIF-ELSE 例子:IF number = 0 THEN result := zero;ELSIF number 0 THEN result := positive;ELSIF number 0 THEN result := negative;ELSE - hmm, the only
22、 other possibility is that number is null result := NULL;END IF;PL/PGSQL控制結(jié)構(gòu)3. 簡單循環(huán)簡單循環(huán)使用 LOOP, EXIT, CONTINUE, WHILE, FOR 語句,可以控制 PL/PGSQL 函數(shù)重復(fù)一系列命令。3.1. LOOPLOOP statementsEND LOOP label;LOOP 定義一個(gè)無條件的循環(huán),無限循環(huán),直到由 EXIT 或 RETURN 語句終止。可選的 label 可以由 EXIT 和 CONTINUE 語句使用,用于在嵌套循環(huán)中聲明應(yīng)該應(yīng)用于哪一層循環(huán)。PL/PGSQL控制結(jié)
23、構(gòu)3.2. EXITEXIT label WHEN expression;如果沒有給出 label ,那么退出最內(nèi)層的循環(huán),然后執(zhí)行跟在 END LOOP 后面的語句。如果給出 label ,那么它必須是當(dāng)前或者更高層的嵌套循環(huán)塊或者語句塊的標(biāo)簽。然后該命名塊或者循環(huán)就會(huì)終止,而控制落到對應(yīng)循環(huán)/塊的 END 語句后面的語句上。如果聲明了 WHEN ,循環(huán)退出只有在 expression 為真的時(shí)候才發(fā)生,否則控制會(huì)落到 EXIT 后面的語句上。EXIT 可以用于在所有的循環(huán)類型中,它并不僅僅限制于在無條件循環(huán)中使用。在和 BEGIN 塊一起使用的時(shí)候,EXIT 把控制交給塊結(jié)束后的下一個(gè)語句
24、。PL/PGSQL控制結(jié)構(gòu)EXIT例子:例子:LOOP - 一些計(jì)算 IF count 0 THEN EXIT; - 退出循環(huán) END IF;END LOOP;LOOP - 一些計(jì)算 EXIT WHEN count 0; - same result as previous exampleEND LOOP;BEGIN - 一些計(jì)算 IF stocks 100000 THEN EXIT; - 導(dǎo)致從 BEGIN 塊里退出 END IF;END;PL/PGSQL控制結(jié)構(gòu)3.3. CONTINUECONTINUE label WHEN expression;如果沒有給出 label ,那么就開始最內(nèi)層
25、循環(huán)的下一次執(zhí)行。也就是說,控制傳遞回給循環(huán)控制表達(dá)式(如果有),然后重新計(jì)算循環(huán)體。如果出現(xiàn)了 label ,它聲明即將繼續(xù)執(zhí)行的循環(huán)的標(biāo)簽。如果聲明了 WHEN ,那么循環(huán)的下一次執(zhí)行只有在 expression 為真的情況下才進(jìn)行。否則,控制傳遞給 CONTINUE 后面的語句。CONTINUE 可以用于所有類型的循環(huán);它并不僅僅限于無條件循環(huán)。CONTINUE例子:LOOP - 一些計(jì)算 EXIT WHEN count 100; CONTINUE WHEN count 50; - 一些在 count 數(shù)值在50 . 100里面時(shí)候的計(jì)算END LOOP;PL/PGSQL控制結(jié)構(gòu)3.4.
26、 WHILEWHILE expression LOOP statementsEND LOOP label;只要條件表達(dá)式為真, WHILE 語句就會(huì)不停的在一系列語句上進(jìn)行循環(huán),條件是在每次進(jìn)入循環(huán)體的時(shí)候檢查的。WHILE 例子:WHILE amount_owed 0 AND gift_certificate_balance 0 LOOP - 一些計(jì)算END LOOP;WHILE NOT boolean_expression LOOP - 一些計(jì)算END LOOP;PL/PGSQL控制結(jié)構(gòu)3.5. FOR (integer variant)FOR name IN REVERSE expres
27、sion . expression BY expression LOOP statementsEND LOOP label;這種形式的 FOR 對一定范圍的整數(shù)進(jìn)行迭代的循環(huán)。變量 name 會(huì)自動(dòng)定義為 integer 類型并且只在循環(huán)里存在(任何該變量名的現(xiàn)存定義在此循環(huán)內(nèi)都將被忽略)。給出范圍上下界的兩個(gè)表達(dá)式在進(jìn)入循環(huán)的時(shí)候計(jì)算一次。BY 子句指定迭代步長(缺省為 1),但如果聲明了 REVERSE 步長將變?yōu)橄鄳?yīng)的負(fù)值。整數(shù) FOR 循環(huán)的例子:FOR i IN 1.10 LOOP - 一些計(jì)算 RAISE NOTICE i is %, i;END LOOP;FOR i IN REV
28、ERSE 10.1 LOOP - 一些計(jì)算END LOOP;FOR i IN REVERSE 10.1 BY 2 LOOP - 一些計(jì)算 RAISE NOTICE i is %, i;END LOOP;PL/PGSQL控制結(jié)構(gòu)4. 遍歷命令結(jié)果遍歷命令結(jié)果使用不同類型的使用不同類型的 FOR 循環(huán),你可以遍歷一個(gè)命令的結(jié)果并且對其進(jìn)行相應(yīng)的操作。循環(huán),你可以遍歷一個(gè)命令的結(jié)果并且對其進(jìn)行相應(yīng)的操作。語法:語法:FOR target IN query LOOP statementsEND LOOP label;FOR-IN-EXECUTE 語句是遍歷所有行的另外一種方法:語句是遍歷所有行的另外一
29、種方法:FOR target IN EXECUTE text_expression LOOP statementsEND LOOP label;注:注:target 是一個(gè)記錄變量、行變量、逗號分隔的標(biāo)量變量列表。target 被連續(xù)不斷被賦予所有來自 query 的行,并且循環(huán)體將為每行執(zhí)行一次。PL/PGSQL控制結(jié)構(gòu)FOR遍歷記錄例子遍歷記錄例子CREATE TABLE foo (fooid INT, foosubid INT, fooname TEXT); INSERT INTO foo VALUES (1, 2, three); INSERT INTO foo VALUES (4,
30、5, six); CREATE OR REPLACE FUNCTION getallfoo() RETURNS SETOF foo AS$BODY$ DECLARE r foo%rowtype; BEGIN FOR r IN SELECT * FROM foo WHERE fooid 0 LOOP - can do some processing here RETURN NEXT r; - return next row of SELECT END LOOP; RETURN; END $BODY$ LANGUAGE plpgsql; SELECT * FROM getallfoo();PL/P
31、GSQL控制結(jié)構(gòu)5. 捕獲錯(cuò)誤捕獲錯(cuò)誤缺省時(shí),一個(gè)在 PL/pgSQL 函數(shù)里發(fā)生的錯(cuò)誤退出函數(shù)的執(zhí)行,并且實(shí)際上其周圍的事務(wù)也會(huì)退出。你可以使用一個(gè)帶有 EXCEPTION 子句的 BEGIN 塊捕獲錯(cuò)誤并且從中恢復(fù)。其語法是正常的 BEGIN 塊語法的一個(gè)擴(kuò)展:DECLARE declarationsBEGIN statementsEXCEPTION WHEN condition OR condition . THEN handler_statements WHEN condition OR condition . THEN handler_statements .END;如果沒有發(fā)生錯(cuò)誤
32、,這種形式的塊只是簡單地執(zhí)行所有 statements ,然后轉(zhuǎn)到下一個(gè) END 之后的語句。但是如果在 statements 內(nèi)部發(fā)生了一個(gè)錯(cuò)誤,則對 statements 的進(jìn)一步處理將廢棄,然后轉(zhuǎn)到 EXCEPTION 列表。系統(tǒng)搜索這個(gè)列表,尋找匹配錯(cuò)誤的第一個(gè) condition 。如果找到匹配,則執(zhí)行對應(yīng)的 handler_statements ,然后轉(zhuǎn)到 END 之后的下一個(gè)語句。如果沒有找到匹配,該錯(cuò)誤就會(huì)廣播出去,就好像根本沒有 EXCEPTION 子句一樣:該錯(cuò)誤可以被一個(gè)包圍塊用 EXCEPTION 捕獲,如果沒有包圍塊,則退出函數(shù)的處理。condition 的名字可以是
33、 附錄A里顯示的任何名字。一個(gè)范疇名匹配任意該范疇里的錯(cuò)誤。特殊的條件名 OTHERS 匹配除了 QUERY_CANCELED 之外的所有錯(cuò)誤類型??梢杂妹植东@ QUERY_CANCELED ,不過通常是不明智的。條件名是大小寫無關(guān)的。如果在選中的 handler_statements 里發(fā)生了新錯(cuò)誤,那么它不能被這個(gè) EXCEPTION 子句捕獲,而是傳播出去。一個(gè)外層的 EXCEPTION 子句可以捕獲它。PL/PGSQL控制結(jié)構(gòu)捕獲捕獲UPDATE/INSERT 異常例子異常例子CREATE TABLE db (a INT PRIMARY KEY, b TEXT);CREATE FUN
34、CTION merge_db(key INT, data TEXT) RETURNS VOID AS$BEGIN LOOP UPDATE db SET b = data WHERE a = key; IF found THEN RETURN; END IF; BEGIN INSERT INTO db(a,b) VALUES (key, data); RETURN; EXCEPTION WHEN unique_violation THEN - do nothing END; END LOOP;END;$LANGUAGE plpgsql;SELECT merge_db(1, david);SELE
35、CT merge_db(1, dennis);PL/PGSQL游標(biāo)1. 聲明游標(biāo)變量聲明游標(biāo)變量在 PL/pgSQL 里對游標(biāo)的訪問都是通過游標(biāo)變量實(shí)現(xiàn)的,它總是特殊的數(shù)據(jù)類型 refcursor 。創(chuàng)建游標(biāo)變量的一個(gè)方法是把它聲明為一個(gè)類型為 refcursor 的變量。另外一個(gè)方法是使用游標(biāo)聲明語法,如下:name CURSOR ( arguments ) FOR query;其中 FOR 可以被替換為 IS 。如果有 arguments ,那么它是一個(gè)逗號分隔的 name datatype 對的列表,它們定義那些將會(huì)用參數(shù)值替換掉的所給出命令中的名字。實(shí)際用于代換這些名字的數(shù)值將在在游標(biāo)
36、打開之后聲明。例子:DECLARE curs1 refcursor; curs2 CURSOR FOR SELECT * FROM tablename; curs3 CURSOR (key integer) IS SELECT * FROM tablename WHERE unique1 = key;所有這三個(gè)變量都是 refcursor 類型。PL/PGSQL游標(biāo)2. 打開游標(biāo)打開游標(biāo)PL/PGSQL 有三種形式的 OPEN 語句,兩種用于未綁定的游標(biāo)變量,另外一種用于已綁定的游標(biāo)變量。2.1. OPEN FOR queryOPEN unbound_cursor FOR query;例:例:
37、 OPEN curs1 FOR SELECT * FROM foo WHERE key = mykey;2.2. OPEN FOR EXECUTEOPEN unbound_cursor FOR EXECUTE query_string;例:例: OPEN curs1 FOR EXECUTE SELECT * FROM | quote_ident($1);2.3. 打開一個(gè)綁定的游標(biāo)打開一個(gè)綁定的游標(biāo)OPEN bound_cursor ( argument_values );例:例:OPEN curs2;OPEN curs3(42);PL/PGSQL游標(biāo)3. 使用游標(biāo)使用游標(biāo)一旦已經(jīng)打開了一個(gè)游
38、標(biāo),那么就可以用下面的語句操作它。3.1. FETCHFETCH cursor INTO target;FETCH 從游標(biāo)中檢索下一行到目標(biāo)中,目標(biāo)可以是一個(gè)行變量、記錄變量、逗號分隔的普通變量列表??梢允褂锰厥庾兞?FOUND 檢查是否檢索出一個(gè)行。例子:FETCH curs1 INTO rowvar;FETCH curs2 INTO foo, bar, baz;PL/PGSQL游標(biāo)3.2. CLOSECLOSE cursor;CLOSE 關(guān)閉支撐在一個(gè)打開的游標(biāo)下面的信使。這樣就可以在事務(wù)結(jié)束之前釋放資源,或者釋放掉該游標(biāo)變量,用于稍后再次打開。例:CLOSE curs1;PL/PGSQL
39、游標(biāo)3.3. 返回游標(biāo)返回游標(biāo)PL/PGSQL 函數(shù)可以向調(diào)用者返回游標(biāo)。這個(gè)功能用于從函數(shù)里返回多行或多列,特別是巨大的結(jié)果集。要想這么做,該函數(shù)必須打開游標(biāo)并且把該游標(biāo)的名字返回給調(diào)用者,或者簡單的使用指定的入口名或調(diào)用者已知的名字打開游標(biāo)。調(diào)用者然后從游標(biāo)里抓取行。游標(biāo)可以由調(diào)用者關(guān)閉,或者是在事務(wù)結(jié)束的時(shí)候自動(dòng)關(guān)閉。PL/PGSQL游標(biāo)下面的例子顯示了一個(gè)調(diào)用者聲明游標(biāo)名字的方法:CREATE TABLE test (col text);INSERT INTO test VALUES (123);select * from test ;CREATE FUNCTION reffunc(refcursor) RETURNS refcursor AS $BEGIN OPEN $1 FOR SELECT col FROM test; RETURN $1;END;$ LANGUAGE plpgsql;BEGIN;SELECT
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024游艇銷售及倉儲(chǔ)物流服務(wù)合同范本3篇
- 二零二五年度廚房設(shè)備進(jìn)出口貿(mào)易合同2篇
- 專業(yè)2024委托獵頭服務(wù)協(xié)議范本版
- 二零二五年股東股權(quán)解除及退股條件明確協(xié)議書3篇
- 個(gè)人租車合同2024年度版:租賃工程車具體條款3篇
- 2024版承包經(jīng)營權(quán)抵押合同
- 二零二五版?zhèn)€人房產(chǎn)抵押典當(dāng)經(jīng)營合同3篇
- 臺(tái)州科技職業(yè)學(xué)院《內(nèi)科學(xué)B》2023-2024學(xué)年第一學(xué)期期末試卷
- 二零二五年股權(quán)投資合同具體條款2篇
- 二零二五年度汽車環(huán)保技術(shù)改造投資合同3篇
- 醫(yī)療組長競聘
- 2024年業(yè)績換取股權(quán)的協(xié)議書模板
- 顳下頜關(guān)節(jié)疾?。谇活M面外科學(xué)課件)
- 工業(yè)自動(dòng)化設(shè)備維護(hù)保養(yǎng)指南
- 2024人教新版七年級上冊英語單詞英譯漢默寫表
- 《向心力》參考課件4
- 2024至2030年中國膨潤土行業(yè)投資戰(zhàn)略分析及發(fā)展前景研究報(bào)告
- 2024年深圳中考數(shù)學(xué)真題及答案
- 土方轉(zhuǎn)運(yùn)合同協(xié)議書
- Module 3 Unit 1 Point to the door(教學(xué)設(shè)計(jì))-2024-2025學(xué)年外研版(三起)英語三年級上冊
- 智能交通信號燈安裝合同樣本
評論
0/150
提交評論