【问题标题】:PostgreSQL 9.3: Pass values to only selected parameter in functionPostgreSQL 9.3:将值传递给函数中仅选定的参数
【发布时间】:2015-12-31 18:31:08
【问题描述】:

我必须有四列的表格,如下所示:

表格

create table fortesting
(
    cola int not null,
    colb timestamp null,
    colc text null,
    cold int null
)

现在我想创建一个函数来将记录插入到表中 使用动态 sql 所以我使用了如下所示的语言 plpgsql 函数。

功能

create or replace function functionTest
(
    p_cola int,
    p_colb timestamp = null,
    p_colc text = '',
    p_cold int = null
)
returns void as

$body$

Declare v_query varchar;

begin

    v_query := 'insert into fortesting(cola,colb,colc,cold) values('||p_cola||','''||p_colb||''','''||p_colc||''','||p_cold||')';

    RAISE INFO '%',v_query;

    EXECUTE v_query;

end;

$body$

language plpgsql;

调用函数

我只将两个值传递给两个参数,rest 应该将 null 放入表中。

SELECT * FROM  functionTest( p_cola := 1, p_colc:='abc');

错误详情

INFO:  <NULL>

ERROR:  query string argument of EXECUTE is null
CONTEXT:  PL/pgSQL function functiontest(integer,timestamp without time zone,text,integer) line 11 at EXECUTE statement 

【问题讨论】:

  • 在编写 SQL 命令时,必须使用正确的参数引用函数:quote_identquote_literal 或使用 USING 子句。 没有它,代码很容易受到 SQL 注入攻击!
  • 这对您或任何读者都非常重要。这个错误很愚蠢,仍然很广泛。当你使用@a_horse_with_no_name 建议的语法时,你的代码会更快、更干净、更安全。
  • @Pavel Stehule,好的!

标签: postgresql postgresql-9.3


【解决方案1】:

原因是,将 null 值与某物连接会返回 null 值,即使其他元素不为空。

不过这个不需要动态SQL,直接传参数即可:

insert into fortesting(cola,colb,colc,cold) values ($1, $2, $3, $4);

如果您确实想使用动态 SQL(即使不需要),您也应该这样做:

v_query := 'insert into fortesting(cola,colb,colc,cold) values ($1, $2, $3, $4)';

RAISE INFO '%',v_query;

EXECUTE v_query
    using p_cola, p_colb, p_colc, p_cold;

要执行函数使用:

SELECT functionTest( p_cola := 1, p_colc:='abc');

不要将其放入from 子句中,因为它不会返回“表”

【讨论】:

猜你喜欢
  • 2019-06-22
  • 1970-01-01
  • 2015-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-15
相关资源
最近更新 更多