Postgresql

如何將帶有數組欄位的表類型傳遞給postgresql中的函式

  • February 28, 2013

我有一張叫書的桌子

CREATE TABLE book
(
 id smallint NOT NULL DEFAULT 0,       
 bname text,       
 btype text,
 bprices numeric(11,2)[],
 CONSTRAINT key PRIMARY KEY (id )
)

和一個函式 save_book

CREATE OR REPLACE FUNCTION save_book(thebook book)
 RETURNS text AS
$BODY$
DECLARE 
myoutput text :='Nothing has occured';
BEGIN

   update book set 
   bname=thebook.bname,
   btype=thebook.btype,bprices=thebook.bprices  WHERE id=thebook.id;

   IF FOUND THEN
       myoutput:= 'Record with PK[' || thebook.id || '] successfully updated';
       RETURN myoutput;
   END IF;

   BEGIN
       INSERT INTO book values(thebook.id,thebook.bname,thebook.btype,
       thebook.bprices);
       myoutput:= 'Record successfully added';           
   END;
RETURN myoutput;

   END;
$BODY$
 LANGUAGE plpgsql VOLATILE
 COST 100;

現在當我呼叫函式時

SELECT save_book('(179,the art of war,fiction,{190,220})'::book);

我得到了錯誤

ERROR: malformed array literal: "{190"
SQL state: 22P02
Character: 18

我不明白,因為我沒有看到數組格式有任何錯誤,有什麼幫助嗎?

這種事情變得複雜。我現在正在做一些相關的項目。基本的調整是 PostgreSQL 使用一種在元組表示內部使用雙引號的格式來表示文字值,所以:

SELECT save_book('(179,the art of war,fiction,"{190,220}")'::book);

應該管用。本質上,一個巧妙的技巧是創建一個 csv 並包含在元組或數組標識符中。最大的問題是您必須處理轉義(根據需要在每個級別加倍引號)。所以以下是完全等價的:

SELECT save_book('(179,"the art of war","fiction","{""190"",""220""}")'::book);

第二種方法是使用行建構子:

SELECT save_book(row(179,'the art of war','fiction', array[190,220])::book);

第一個解決方案的明顯優勢是能夠利用現有的程式框架來生成和轉義 CSV。第二個是 SQL 中最乾淨的。它們可以混合搭配。

引用自:https://dba.stackexchange.com/questions/35565