公司的項目是在開源數據庫PostgreSQL基礎之上的,項目需求是要PostgreSQL數據庫兼容oracle的函數。
在PostgreSQL數據庫中寫函數有很多方法,可以使用SQL語言,PL/pgSQL語言或者C語言都行。雖然PL/pgsql
相對於oracle中的PL/sql還有諸多不足之處,可是PL/pgsql發展很快,同樣小巧好用。剛纔得知postgres 9.5
剛剛發佈,好像修復了不少bug。加油postgres。好了,進入正題。
在寫函數的過程中經常涉及到對錶的增(insert)刪(delete)改(update)查(select)操作,最常見的需求
就是在對錶操作後,獲取操作行的某些列的值,或者獲取操作行所有的數據。最常使用的方法是使用如下方法:
- insert-select
- select-delete
- update-select
- select-into
在看postgres的官方文檔時,發現還有一種方法(returning-into方法)同樣可以實現上面的前三個功能,而
select-into方式已經相當簡潔了,就不用使用returning-into形式了。特把returning-into的使用方法總結
如下:
下面是測試表結構及數據:
create table table_name(id integer, name text, addr text);
insert into table_name values(1,'張三','南京市,玄武區');
insert into table_name values(2,'李四','南京市,雨花區');
insert into table_name values(3,'王五','南京市,鼓樓區');
一、增(insert)操作
增(insert)操作的過程中可以獲取操作行某些列的值,同樣也可以獲取操作行所有列的值。
下面分兩部分對增操作中使用returning-into進行介紹。
1.在增(insert)操作的過程中使用returning-into實現獲取部分列的值,當然你也可以只獲取特定
的某一列的值。
CREATEORREPLACEFUNCTION insert_get_column()
RETURNS text
AS $$
DECLARE
get_name text;
get_addr text;
BEGIN
INSERTINTO table_name VALUES(4,'趙六','南京市,江寧區')
RETURNING name, addr INTO get_name, get_addr;
--使用insert-select形式實現相同功能
--INSERT INTO table_name VALUES (4, '趙六', '南京市,江寧區');
--select name, addr into get_name, get_addr from table_name where id = 4;
RETURN get_name ||':'|| get_addr;
END;
$$ LANGUAGE plpgsql;
CREATEORREPLACEFUNCTION insert_get_row()
RETURNS SETOF table_name
AS $$
DECLARE
get_row table_name%ROWTYPE;
BEGIN
INSERTINTO table_name VALUES(5,'david','南京市,江寧新區')
RETURNING *INTO get_row;
--上面一行語句與下面這行命令功能相同
--INSERT INTO table_name VALUES (5, 'david', '南京市,江寧新區')
--RETURNING id, name, addr INTO get_row.id, get_row.name, get_row.addr;
--使用insert-select形式實現相同功能
--INSERT INTO table_name VALUES (5, 'david', '南京市,江寧新區');
--select * into get_row from table_name where id = 5;
RETURNNEXT get_row;
RETURN;
END;
$$ LANGUAGE plpgsql;
刪(delete)操作的過程中可以獲取操作行某些列的值,同樣也可以獲取操作行所有列的值。
下面分兩部分對刪操作中使用returning-into進行介紹。
1.在刪(delete)操作的過程中使用returning-into實現獲取部分列的值,當然你也可以只獲取特定
的某一列的值。
CREATEORREPLACEFUNCTION delete_get_column(num_id integer)
RETURNS text
AS $$
DECLARE
get_name text;
get_addr text;
BEGIN
DELETEFROM table_name WHERE id = num_id
RETURNING name, addr INTO get_name, get_addr;
--使用select-delete形式實現相同功能
--SELECT name, addr INTO get_name, get_addr FROM table_name WHERE id = num_id;
--DELETE FROM table_name WHERE id = num_id;
RETURN get_name ||':'|| get_addr;
END;
$$ LANGUAGE plpgsql;
2.在刪(delete)操作的過程中使用returning-into實現獲取所有列的值。
CREATEORREPLACEFUNCTION delete_get_row(num_id integer)
RETURNS SETOF table_name
AS $$
DECLARE
get_row table_name%ROWTYPE;
BEGIN
DELETEFROM table_name WHERE id = num_id
RETURNING *INTO get_row;
--上面一行語句與下面這行命令功能相同
--DELETE FROM table_name WHERE id = num_id
--RETURNING id, name, addr INTO get_row.id, get_row.name, get_row.addr;
--使用select-delete形式實現相同功能
--select * into get_row from table_name where id = num_id;
--DELETE FROM table_name WHERE id = num_id;
RETURNNEXT get_row;
RETURN;
END;
$$ LANGUAGE plpgsql;
三、改(update)操作
改(update)操作的過程中可以獲取操作行某些列的值,同樣也可以獲取操作行所有列的值。
下面分兩部分對刪操作中使用returning-into進行介紹。
1.在改(update)操作的過程中使用returning-into實現獲取部分列的值,當然你也可以只獲取特定
的某一列的值。
CREATEORREPLACEFUNCTION update_get_column(num_id integer)
RETURNS text
AS $$
DECLARE
get_name text;
get_addr text;
BEGIN
UPDATE table_name SET addr ='new_address'WHERE id = num_id
RETURNING name, addr into get_name, get_addr;
--使用update-select形式實現相同功能
--UPDATE table_name SET addr = 'new_address' WHERE id = num_id ;
--select name, addr into get_name, get_addr from table_name where id = num_id;
RETURN get_name ||':'|| get_addr;
END;
$$ LANGUAGE plpgsql;
2.在改(update)操作的過程中使用returning-into實現獲取所有列的值。
CREATEORREPLACEFUNCTION update_get_row(num_id integer)
RETURNS SETOF table_name
AS $$
DECLARE
get_row table_name%ROWTYPE;
BEGIN
UPDATE table_name SET addr ='new_address'WHERE id = num_id
RETURNING *into get_row;
--上面一行語句與下面一行命令功能相同
--UPDATE table_name SET addr = 'new_address' WHERE id = num_id
--RETURNING id, name, addr into get_row.id, get_row.name, get_row.addr;
--使用update-select形式實現相同功能
UPDATE table_name SET addr ='new_address'WHERE id = num_id;
select*into get_row from table_name where id = num_id;
RETURNnext get_row;
RETURN;
END;
$$ LANGUAGE plpgsql;
四、查(select)操作
查(select)操作不支持returning-into操作。使用select-into形式就能實現獲取操作行某些列的值,
同樣也可以獲取操作行所有列的值。
1.使用select-into形式實現獲取某些列的值。
2.使用select-into形式實現 獲取所有列的值。
CREATEORREPLACEFUNCTION select__get_column(num_id integer)
RETURNS text
AS $$
DECLARE
get_name text;
get_addr text;
BEGIN
SELECT name, addr INTO get_name, get_addr FROM table_name WHERE id = num_id;
IFNOTFOUNDTHEN
RAISE NOTICE 'NOT FOUND %',num_id;
ENDIF;
RETURN get_name ||':'|| get_addr;
END;
$$ LANGUAGE plpgsql;
CREATEORREPLACEFUNCTION select_get_row(num_id integer)
RETURNS SETOF table_name
AS $$
DECLARE
get_row table_name%ROWTYPE;
BEGIN
SELECT*INTO get_row FROM table_name WHERE id = num_id;
IFNOTFOUNDTHEN
RAISE NOTICE 'NOT FOUND %',num_id;
ENDIF;
RETURNNEXT get_row;
RETURN;
END;
$$ LANGUAGE plpgsql;
@end