【问题标题】:Execute INSERT INTO in PLPGSQL using variables as values使用变量作为值在 PLPGSQL 中执行 INSERT INTO
【发布时间】:2020-03-24 03:21:32
【问题描述】:

我正在尝试创建一个函数,该函数添加一条以给定变量作为值的记录。我的代码:

CREATE OR REPLACE FUNCTION ADD_FILM(id INTEGER, t VARCHAR, y INTEGER, p REAL) RETURNS VARCHAR AS $$
DECLARE
    query VARCHAR;
BEGIN
    query = 'insert into films (id_film, title, year_production, price) values ('||id||','||t||','||y||','||p||')';
    EXECUTE query;
RETURN 'OK';
EXCEPTION
    WHEN UNIQUE_VIOLATION THEN
    RAISE NOTICE 'Incorrect ID, next available ID set';
    RETURN 0;
END;
$$ LANGUAGE PLPGSQL;
SELECT ADD_FILM(1,'aaa','2020','10');

以下函数执行以错误结束。语法有什么问题?

错误:列“aaa”不存在

【问题讨论】:

  • 我不确定 Postgres 如何对函数中的错误参数做出反应,但您尝试将 '2020' string 作为 y INTEGER 参数和 '10' 字符串p REAL。然后将id, t, y, p 作为 strings 插入(因为'||id||' 语法告诉生成一个字符串值)在一个表中,该表可能具有列id_filmyear_production 和@987654328 的数字类型@
  • 哦,您可能不允许在 ' 值的末尾和查询字符串内使用单引号 '
  • 看起来我的方法太复杂了,而且有更简单的选择 :D 但是感谢您的帮助

标签: sql postgresql plpgsql


【解决方案1】:

我宁愿这样做:

CREATE OR REPLACE FUNCTION ADD_FILM(id INTEGER, t VARCHAR, y INTEGER, p REAL) RETURNS 
VARCHAR AS $$
BEGIN
    insert into films (id_film, title, year_production, price) values (id,t,y,p);
RETURN 'OK';
....
....

查看此链接:https://www.postgresqltutorial.com/postgresql-create-procedure/

并称它为:

CALL ADD_FILM(1,'aaa','2020','10');

【讨论】:

  • 我在讲座上听说过 EXECUTE,所以我想我应该使用它,但看起来没有必要:D 非常感谢。
【解决方案2】:

另一种可能的 EXECUTE 解决方案:

create table films
(
 id_film int,
 title varchar,
 year_production int,
 price real 
);
CREATE TABLE
CREATE OR REPLACE FUNCTION ADD_FILM(id INTEGER, t VARCHAR, y INTEGER, p REAL) RETURNS VARCHAR AS $$
DECLARE
    query VARCHAR;
BEGIN
    query = 'insert into films (id_film, title, year_production, price) values ($1,$2,$3,$4)';
    EXECUTE query USING id, t, y, p; 
RETURN 'OK';
EXCEPTION
    WHEN UNIQUE_VIOLATION THEN
    RAISE NOTICE 'Incorrect ID, next available ID set';
    RETURN 0;
END;
$$ LANGUAGE PLPGSQL;
CREATE FUNCTION
SELECT ADD_FILM(1,'aaa','2020','10');
 add_film 
----------
 OK
(1 row)

select * from films;
 id_film | title | year_production | price 
---------+-------+-----------------+-------
       1 | aaa   |            2020 |    10
(1 row)

【讨论】:

    猜你喜欢
    • 2012-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-30
    • 1970-01-01
    • 1970-01-01
    • 2011-01-22
    • 1970-01-01
    相关资源
    最近更新 更多