PLpgsql語言中returning-into的使用方法 總結

    公司的項目是在開源數據庫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;


    

   2.在增(insert)操作的過程中使用returning-into實現獲取所有列的值。

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)操作

    刪(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形式實現獲取某些列的值。

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;


    2.使用select-into形式實現 獲取所有列的值。

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

發佈了25 篇原創文章 · 獲贊 11 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章