watervalue 這個(gè)字段的名稱正確嗎?ERROR: column "watervalue" does not exist 的錯(cuò)誤是 "watervalue"這個(gè)列不存在。
創(chuàng)新互聯(lián)-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價(jià)比四川網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式四川網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋四川地區(qū)。費(fèi)用合理售后完善,十年實(shí)體公司更值得信賴。
PostgreSQL 存儲(chǔ)過程定義格式如下:
■結(jié)構(gòu) PL/pgSQL是一種塊結(jié)構(gòu)的語言,比較方便的是用pgAdmin III新建Function,填入一些參數(shù)就可以了。
基本上是這樣的:
CREATE OR REPLACE FUNCTION 函數(shù)名(參數(shù)1,[整型 int4, 整型數(shù)組 _int4, ...]) RETURNS 返回值類型 AS $BODY$ DECLARE 變量聲明 BEGIN 函數(shù)體 END; $BODY$ LANGUAGE ‘plpgsql’ VOLATILE;
■變量類型 除了postgresql內(nèi)置的變量類型外,常用的還有 RECORD ,表示一條記錄。
■賦值 賦值和Pascal有點(diǎn)像:“變量 := 表達(dá)式;” 有些奇怪的是連接字符串的是“||”,比如 sql := ‘SELECT * FROM’ || table || ‘WHERE …’;
■判斷 判斷又和VB有些像: IF 條件 THEN … ELSEIF 條件 THEN … ELSE … END IF;
■循環(huán) 循環(huán)有好幾種寫法: WHILE expression LOOP statements END LOOP; 還有常用的一種是:(從1循環(huán)到9可以寫成FOR i IN 1..9 LOOP) FOR name IN [ REVERSE ] expression .. expression LOOP statements END LOOP;
■其他 還有幾個(gè)常用的函數(shù): SELECT INTO record …; 表示將select的結(jié)果賦給record變量(RECORD類型) PERFORM query; 表示執(zhí)行query并丟棄結(jié)果 EXECUTE sql; 表示執(zhí)行sql語句,這條可以動(dòng)態(tài)執(zhí)行sql語句(特別是由參數(shù)傳入構(gòu)造sql語句的時(shí)候特別有用)
--簡單的例子:
例1:無返回值
CREATE OR REPLACE FUNCTION 函數(shù)名稱( 參數(shù)1,參數(shù)2,...)
AS
$BODY$
DECLARE --定義
BEGIN
INSERT INTO "表名" VALUES(參數(shù)1,參數(shù)2,...);
END
$BODY$
LANGUAGE 'plpgsql' VOLATILE; -- 最后別忘了這個(gè)。
例2:有返回值
CREATE OR REPLACE FUNCTION 函數(shù)名稱(deptcode VARCHAR(20) ,deptname VARCHAR(60) ,pycode VARCHAR(60),isenabled CHAR(1))
RETURNS BOOLEAN --返回值,布爾類型
AS
$body$
DECLARE
deptcode VARCHAR(20);
deptname VARCHAR(60);
pycode VARCHAR(60);
isenabled CHAR(1);
BEGIN
UPDATE "deptDict" SET deptcode=deptcode,deptname=deptname,pycode=pycode,isenabled=isenabled,updatedhisdatetime=CURRENT_TIMESTAMP
WHERE deptcode=deptcode;
RETURN TRUE;
END
$body$
LANGUAGE 'plpgsql' VOLATILE;
最后再加上如何執(zhí)行這個(gè)存儲(chǔ)過程(函數(shù))
-- 執(zhí)行存儲(chǔ)過程方法1
SELECT * FROM 函數(shù)名稱(參數(shù)1,參數(shù)2,...)
-- 執(zhí)行存儲(chǔ)過程方法2
SELECT 函數(shù)名稱('0參數(shù)1,參數(shù)2,...)
PostgreSQL的PL/pgSQL語言是支持動(dòng)態(tài)SQL語句的(說execute immediate的是ECPG所支持的)。但是,要記得重要的一點(diǎn): 是在PL/pgSQL語言中支持。而PL/pgSQL語言一個(gè)塊結(jié)構(gòu)的語言,它以begin ... end為塊的開始與結(jié)束標(biāo)識(shí)。這也就是說,要執(zhí)行動(dòng)態(tài)SQL語句,就必須放到begin ... end塊中,而不要想實(shí)現(xiàn)一個(gè)單獨(dú)的動(dòng)態(tài)SQL語句。在SQL Server中,倒是可以輕松的實(shí)現(xiàn),我們可以直接執(zhí)行一個(gè)這樣的動(dòng)態(tài)SQL:
execute?sp_executesql?N'select?1?as?val'
而在PostgreSQL中,就不要有此想法了。當(dāng)然,SQL Server的這種動(dòng)態(tài)SQL語句的執(zhí)行方法也有其局限與不便的地方。
在PL/pgSQL中,執(zhí)行動(dòng)態(tài)SQL的格式如下(摘錄自說明文檔):
EXECUTE?command-string?[?INTO?[STRICT]?target?]?[?USING?expression?[,?...?]?];
其中,
command-string就是要執(zhí)行的動(dòng)態(tài)SQL語句(一定要記?。哼@里是SQL語句,不是PL/pgSQL語句,像raise notice就不能使用);
INTO子句是把SQL查詢到的值賦給INTO指定的變量;
USING子句是前面的command-string中替代變量($1, $2, ...)的賦值;
示例:
do?$$
declare
v_c1?integer;
v_c2?integer;
begin
execute?'select?count(*)?as?c1,?count(*)?as?c2?from?(select?1?as?idx?union?select?11?as?idx?union?select?21?as?idx)?s?where?idx??$1'?
into?v_c1,?v_c2
using?10;
raise?notice?'%,?%',?v_c1,?v_c2;
與Oracle中類似,%TYPE是用來獲取一個(gè)已定義變量的類型的。這樣可以方便的定義出于已有變量或字段同類型的變量。例如:
do language plpgsql $$
declare v1 character varying(100); -- 定義變量v1類型為變長字串
declare v2 v1%type; -- 定義變量v2與v1同類型,即變長字串
begin
v2 := 'Hello World!'; -- 給v2變量賦值
raise notice '%', v2; -- 顯示出v2的內(nèi)容
end $$;
postgresql.conf是PostgreSQL的配置文件。其基本格式為: 一行就是一個(gè)配置變量的設(shè)定,采用"變量名 = 變量值"的賦值格式。 postgresql.conf一般位于postgresql的數(shù)據(jù)目錄中,它是在postgresql數(shù)據(jù)集創(chuàng)建時(shí)自動(dòng)創(chuàng)建出來的??梢酝ㄟ^修改postgresq
你是不是要把所有 2012年9月的數(shù)據(jù), 更新為 2013年5月???
例如:
2012-09-01
2012-09-02
2012-09-03
更新為
2013-05-01
2013-05-02
2013-05-03
如果是的話, 可以嘗試下面的語句:
UPDATE
monitor_server
SET
date = date + interval '8 month'
WHERE
EXTRACT(YEAR FROM date ) = 2012
AND EXTRACT(MONTH FROM date ) = 9