簡體   English   中英

如何從PostgreSQL中插入存儲過程返回字符串ID

[英]how to return string id from insert stored procedure in postgresql

我試圖在存儲過程中運行插入語句后返回一個字符串ID。

這是我的存儲過程代碼:

CREATE OR REPLACE FUNCTION create_quote(
    p_id character varying(40),
    p_name character varying(200),
    p_website character varying(200),
    p_phone character varying(100),
    p_email character varying(200),
    p_msg text,
    p_created_on timestamp without time zone,
    p_created_ip cidr,
    p_contacted boolean,
    p_contacted_on timestamp without time zone
)
RETURNS character varying(40) AS $body$
BEGIN
    INSERT INTO quote VALUES (p_id, p_name, p_website, p_phone, p_email, p_msg, p_created_on, p_created_ip, p_contacted, p_contacted_on)
    ON CONFLICT (id)
       DO UPDATE SET name = p_name, website = p_website, phone = p_phone, email = p_email, msg = p_msg, created_on = p_created_on, created_ip = p_created_ip, contacted 
= p_contacted, contacted_on = p_contacted_on RETURNING id;
END;
$body$ LANGUAGE plpgsql;

表架構:

                               Table "public.quote"
    Column    |            Type             |              Modifiers               
--------------+-----------------------------+--------------------------------------
 id           | character varying(40)       | not null
 name         | character varying(200)      | not null
 website      | character varying(200)      | not null
 phone        | character varying(100)      | not null
 email        | character varying(200)      | not null
 msg          | text                        | 
 created_on   | timestamp without time zone | default timezone('utc'::text, now())
 created_ip   | cidr                        | 
 contacted    | boolean                     | 
 contacted_on | timestamp without time zone | 
Indexes:
    "quote_pkey" PRIMARY KEY, btree (id)
    "quote_email_key" UNIQUE CONSTRAINT, btree (email)

這是我嘗試從psql客戶端調用過程時遇到的錯誤。

select * from create_quote("qw2e3r4t5y6u7i8o9i8u7y6t5r4e3w2q1", "name", "website", "phone", "email", "msg", now()::timestamp, NULL, 0, now()::timestamp);
ERROR:  column "qw2e3r4t5y6u7i8o9i8u7y6t5r4e3w2q1" does not exist
LINE 1: select * from create_quote("qw2e3r4t5y6u7i8o9i8u7y6t5r4e3w2q...

我有點困惑,因為我沒有傳遞列,而只是第一個參數的字符串id 我究竟做錯了什么?

我做了下面clemens提到的更改,但是現在出現了此錯誤:

select create_quote('qw2e3r4t5y6u7i8o9i8u7y6t5r4e3w2q1', 'name', 'website', 'phone', 'email', 'msg', now()::timestamp, NULL, 0, now()::timestamp);
ERROR:  function create_quote(unknown, unknown, unknown, unknown, unknown, unknown, timestamp without time zone, unknown, integer, timestamp without time zone) does not exist
LINE 1: select create_quote('qw2e3r4t5y6u7i8o9i8u7y6t5r4e3w2q1', 'na...
               ^
HINT:  No function matches the given name and argument types. You might need to add explicit type casts.

謝謝

您的代碼中有幾個錯誤:

  1. SQL中的字符串用單引號限制。 此處使用雙引號來保護標識符(例如,區分大小寫的列名)。 例如,使用'qw2e3r4t5y6u7i8o9i8u7y6t5r4e3w2q1'代替"qw2e3r4t5y6u7i8o9i8u7y6t5r4e3w2q1"
  2. 您的函數返回的是標量而不是集合。 您不應該從FROM子句中調用它。

     SELECT create_quote('qw2e3r4t5y6u7i8o9i8u7y6t5r4e3w2q1', 'name', 'website', 'phone', 'email', 'msg', now()::timestamp, NULL, 0, now()::timestamp); 
  3. 您的函數沒有返回值。 您可以將結果從UPSERT分配給變量,然后將其返回。 或者更容易返回輸入參數p_id ,因為您的UPSERT將始終返回該值。

     CREATE OR REPLACE FUNCTION create_quote( p_id character varying(40), p_name character varying(200), p_website character varying(200), p_phone character varying(100), p_email character varying(200), p_msg text, p_created_on timestamp without time zone, p_created_ip cidr, p_contacted boolean, p_contacted_on timestamp without time zone ) RETURNS character varying(40) AS $body$ BEGIN INSERT INTO quote VALUES (p_id, p_name, p_website, p_phone, p_email, p_msg, p_created_on, p_created_ip, p_contacted, p_contacted_on) ON CONFLICT (id) DO UPDATE SET name = p_name, website = p_website, phone = p_phone, email = p_email, msg = p_msg, created_on = p_created_on, created_ip = p_created_ip, contacted = p_contacted, contacted_on = p_contacted_on; RETURN p_id; END; $body$ LANGUAGE plpgsql; 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM