【问题标题】:INSERT EXECUTE FORMAT Postgresql string插入执行格式 Postgresql 字符串
【发布时间】:2015-11-20 14:43:14
【问题描述】:

我想创建一个更新表格的函数。

我正在尝试运行它:

SELECT insert_function('asda', 1 ,1 , 'asd', 1)

但我得到了错误:

LINE 3 VALUES("asda","1","1","asd","1") 列不存在。

当我尝试 rot run 时:

SELECT insert_function('1', 1 ,1 , '1', 1) 零长度分隔 """""""附近的标识符

第 3 行值(""1"","1","1",""1"","1") (^在第一项)

CREATE TABLE IF NOT EXISTS commits (
    id SERIAL PRIMARY KEY, 
    goo CHAR(64) NOT NULL, 
    foo INTEGER NOT NULL, 
    bla INTEGER NOT NULL, 
    ma CHAR(512) NOT NULL, 
    fgt INTEGER NOT NULL
);

CREATE OR REPLACE FUNCTION insert_function(goo char(64), foo INTEGER, bla INTEGER, ma CHAR(512), fgt INTEGER)
  RETURNS VOID AS
$func$
BEGIN
EXECUTE format('
   INSERT INTO commits 
   VALUES(%I,  %I,  %I,  %I, %I)', 
   goo , foo , bla , ma , fgt );

END
$func$ LANGUAGE plpgsql;

您能告诉我如何插入值吗?如何使用EXECUTE format 编写函数?

【问题讨论】:

    标签: sql postgresql sql-insert postgresql-9.3 execute


    【解决方案1】:

    指定列名并使用using:

    CREATE OR REPLACE FUNCTION insert_function(goo char(64), foo INTEGER,
                                               bla INTEGER, ma CHAR(512), fgt INTEGER)
    RETURNS VOID AS
    $func$
    BEGIN
    EXECUTE format('INSERT INTO commits(goo, foo, bla, ma, fgt)
                    VALUES($1,$2,$3,$4,$5);') using goo, foo, bla, ma, fgt;
    
    END
    $func$ LANGUAGE plpgsql;
    

    SqlFiddleDemo

    【讨论】:

      【解决方案2】:

      你有两个问题:

      当你想要insert into表时,你必须指定所有列(甚至是自动计算的列),或者如果你不想指定所有列名,你必须指定所有列值,甚至是自动计算的值。

      关于动态查询的格式,您应该使用%s 而不是%I 将相应的参数插入为您想要实现的字符串,并且%I 将其参数转义为您所使用的SQL 标识符不想。

      所以你可以通过替换来解决你的问题:

      EXECUTE format('
         INSERT INTO commits 
         VALUES(%I,  %I,  %I,  %I, %I)', 
         goo , foo , bla , ma , fgt );
      

      EXECUTE format('
         INSERT INTO commits 
         VALUES(DEFAULT, %L ,  %s ,  %s ,  %L , %s )', 
         goo , foo , bla , ma , fgt );
      

      【讨论】:

      • 感谢您的解释!现在我看到了
      【解决方案3】:

      %I(大写 i)格式化程序将参数转义为 SQL 标识符 (docs here),这不是您想要的。在这种情况下,您应该使用 %s。

      EXECUTE format('INSERT INTO commits VALUES(%L,  %s,  %s,  %L, %s)', goo , foo , bla , ma , fgt );
      

      【讨论】:

      • 感谢您的解释!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-15
      相关资源
      最近更新 更多