當前位置:首頁 » 服務存儲 » postgres存儲過程非同步調用
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

postgres存儲過程非同步調用

發布時間: 2022-07-19 06:15:58

⑴ postgresql存儲過程 怎麼實現無返回值

PostgreSQL 存儲過程定義格式如下:
■結構 PL/pgSQL是一種塊結構的語言,比較方便的是用pgAdmin III新建Function,填入一些參數就可以了。
基本上是這樣的:
CREATE OR REPLACE FUNCTION 函數名(參數1,[整型 int4, 整型數組 _int4, ...]) RETURNS 返回值類型 AS $BODY$ DECLARE 變數聲明 BEGIN 函數體 END; $BODY$ LANGUAGE 『plpgsql』 VOLATILE;
■變數類型 除了postgresql內置的變數類型外,常用的還有 RECORD ,表示一條記錄。
■賦值 賦值和Pascal有點像:「變數 := 表達式;」 有些奇怪的是連接字元串的是「||」,比如 sql := 『SELECT * FROM』 || table || 『WHERE …』;
■判斷 判斷又和VB有些像: IF 條件 THEN … ELSEIF 條件 THEN … ELSE … END IF;
■循環 循環有好幾種寫法: WHILE expression LOOP statements END LOOP; 還有常用的一種是:(從1循環到9可以寫成FOR i IN 1..9 LOOP) FOR name IN [ REVERSE ] expression .. expression LOOP statements END LOOP;
■其他 還有幾個常用的函數: SELECT INTO record …; 表示將select的結果賦給record變數(RECORD類型) PERFORM query; 表示執行query並丟棄結果 EXECUTE sql; 表示執行sql語句,這條可以動態執行sql語句(特別是由參數傳入構造sql語句的時候特別有用)
--簡單的例子:
例1:無返回值
CREATE OR REPLACE FUNCTION 函數名稱( 參數1,參數2,...)
AS
$BODY$
DECLARE --定義
BEGIN
INSERT INTO "表名" VALUES(參數1,參數2,...);
END
$BODY$
LANGUAGE 'plpgsql' VOLATILE; -- 最後別忘了這個。
例2:有返回值
CREATE OR REPLACE FUNCTION 函數名稱(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;
最後再加上如何執行這個存儲過程(函數)
-- 執行存儲過程方法1
SELECT * FROM 函數名稱(參數1,參數2,...)
-- 執行存儲過程方法2
SELECT 函數名稱('0參數1,參數2,...)

⑵ postgresql 存儲過程的事務處理

一個PostgreSQL存儲過程的例子

需求:
給出如下條件進行批處理編排
- 開始日期時間
- 重復間隔(分鍾)
- 重復次數
要求在檔期內重復安排節目播出, 比如: 2003.01.01 08:00 開始每隔240分鍾播出一次, 一共播出100次

資料庫表格(CO_SCHEDULE)
------------------------------
N_PROGID INT
DT_STARTTIME TIMESTAMP
DT_ENDTIME TIMESTAMP

存儲過程的實現:

create table co_schele(n_progid int,dt_starttime timestamp,dt_endtime timestamp);

//創建函數:
create function add_program_time(int4,timestamp,int4,int4,int4) returns bool as '
declare
prog_id alias for $1;
ration_min alias for $3;
period_min alias for $4;
repeat_times alias for $5;
i int;
starttime timestamp;
ins_starttime timestamp;
ins_endtime timestamp;
begin
starttime :=$2;
i := 0;
while i<repeat_times loop
ins_starttime := starttime;
ins_endtime := timestamp_pl_span(ins_starttime,ration_min || ''mins'');
starttime := timestamp_pl_span(ins_starttime,period_min || ''mins'');
insert into co_schele values(prog_id,ins_starttime,ins_endtime);
i := i+1;
end loop;
if i<repeat_times then
return false;
else
return true;
end if;
end;
'language 'plpgsql';

//執行函數:
select add_program_time(1,'2002-10-20 0:0:0','5','60','5');

//查看結果:select * from co_schele;
n_progid | dt_starttime | dt_endtime
----------+------------------------+------------------------
1 | 2002-10-20 00:00:00+08 | 2002-10-20 00:05:00+08
1 | 2002-10-20 01:00:00+08 | 2002-10-20 01:05:00+08
1 | 2002-10-20 02:00:00+08 | 2002-10-20 02:05:00+08
1 | 2002-10-20 03:00:00+08 | 2002-10-20 03:05:00+08
1 | 2002-10-20 04:00:00+08 | 2002-10-20 04:05:00+08

ps:
1.資料庫一載入 plpgsql語言。如沒有,
su - postgres
createlang plpgsql dbname
2.至於返回類型為bool,是因為我不知道如何讓函數不返回值。等待改進。

⑶ postgresql存儲過程怎麼寫

寫個觸發器 插入之前執行觸發器

-- 創建一個測試表

create table test(id int primary key , name varchar(50));

-- 觸發器 插入前ID如果已經存在則替換name的值
CREATE OR REPLACE function _replace() RETURNS TRIGGER AS $INSERT$

declare

_has int ;

BEGIN

select id from test where id = NEW.id into _has;

raise notice 'ddd:%' , _has;

if _has > 0 then
update test set name = NEW.name where id = NEW.id;

RETURN null;

end if;

return NEW;

END;

$INSERT$

LANGUAGE PLPGSQL;

-- 給表加上觸發器
CREATE TRIGGER tbefore BEFORE INSERT ON test FOR EACH ROW EXECUTE PROCEDURE _replace();

-- 插入兩個值
insert into test(id , name) values(1,'1');
insert into test(id , name) values(1,'6');

select * from test;

結果:

pumpkin=> select * from test;
id | name
----+------
1 | 6
(1 行記錄)

時間:1.474 ms

⑷ 在postgresql中創建帶游標的存儲過程(function)

在postgresql中創建帶游標的存儲過程(function)
一般在plsql中執行存儲過程的方式有兩種,一種是帶參數的 begin 存儲過程名(參數1,參數2...); end; 另一種是不帶參數的 begin 存儲過程名; end; 注意標點的寫法,都是英文寫法的

⑸ postgresql如何寫存儲過程!急急急

create OR REPLACE FUNCTION test()
RETURNS int4 AS
$BODY$
declare
r RECORD;
num int4 := 0;
sql "varchar" := 'select f_data_type from t_water_arguments group by f_data_type having count(*) >= 2 limit 1';
begin
FOR r IN EXECUTE sql LOOP
num = r.f_data_type;
end LOOP;
return num;
end
$BODY$
LANGUAGE 'plpgsql' VOLATILE;

select test();

http://bianbian.org/technology/52.html
裡面有比較詳細的介紹

⑹ 這個postgreSql存儲過程如何從C#取得結果集

很小巧方便經濟實用的資料庫,開源且免費(當然也有收費版),支持視圖,存儲過程,事務,集群,觸發器等,安裝包壓縮後不到30MB攜帶也方便

⑺ postgresql 怎樣對存儲過程進行調試

PostgreSQL有pldbgapi擴展,先安裝此擴展。

首先,需要將debug的模組載入到PostgreSQL伺服器中去。做法是: 在pgAdminIII中以管理員登錄,然後選擇菜單「工具->伺服器配置->postgresql.conf」,

當然,最常用的調試方式就是自己直接調用函數來查看執行結果是否正確。

⑻ 在c#中調用postgresql存儲過程

SqlConnection con = new SqlConnection();
SqlCommand cmd = new SqlCommand("postgresql", con);
cmd.CommandType = CommandType.StoredProcere;
cmd.ExecuteNonQuery();//有查詢語句則使用cmd.ExecuteReader();
//或cmd.ExecuteScalar();

⑼ 下面這個復雜的postgresql存儲過程怎樣被hibernate調用

我先不說怎麼調用,就拿存儲過程和hibernate來說吧
存儲過程的執行對資料庫的修改等操作.hibernate是無法檢測到的.所以盡然用了hibernate就不要再把業務邏輯放到資料庫中去.把存儲過程以及觸發器什麼的都變成普通的業務邏輯放到java中來處理.這樣做你會知道他的好

⑽ postgresql存儲過程怎麼用

PostgreSQL有pldbgapi擴展,先安裝此擴展。
首先,需要將debug的模組載入到PostgreSQL伺服器中去。做法是: 在pgAdminIII中以管理員登錄,然後選擇菜單「工具->伺服器配置->postgresql.conf」,

在配置窗口中,雙擊項目"shared_preload_libraries",

在其設定窗口中,將值設置成plugin_debugger的路徑(Windows 9.3版本的為$libdir/plugin_debugger.dll, $libdir一般為PostgreSQL安裝目錄下的lib文件夾)。非Windows系統的後綴名會有所不同,可能為plugin_debugger.so。
注意,在做這一步時最好先備份配置文件,以防指定文件找不到而導致伺服器不能啟動。
在設定完成之後,重新啟動PostgreSQL服務(以啟動debug插件)。
然後在pgAdminIII中擴展安裝時選擇如下圖項目,

這樣在函數的右鍵菜單中就有調試選項了,

當然,最常用的調試方式就是自己直接調用函數來查看執行結果是否正確。