Postgresql 在执行中使用忽略的节…在PL/pgSQL中使用

Postgresql 在执行中使用忽略的节…在PL/pgSQL中使用,postgresql,plpgsql,dynamic-sql,postgresql-9.3,Postgresql,Plpgsql,Dynamic Sql,Postgresql 9.3,我试图通过EXECUTE..使用动态地生成一个序列,但在将参数传递到其中时遇到了问题。据我所知,正确的形式应该是: CREATE OR REPLACE FUNCTION create_dyn_seq( /* some params */ ) RETURNS void AS $$ DECLARE _seq_name text; _min integer; _max integer; BEGIN /* some code assigning the variables

我试图通过EXECUTE..使用动态地生成一个序列,但在将参数传递到其中时遇到了问题。据我所知,正确的形式应该是:

CREATE OR REPLACE FUNCTION create_dyn_seq( /* some params */ ) 
RETURNS void AS $$
DECLARE
  _seq_name text;
  _min integer;
  _max integer;
BEGIN
  /*
    some code assigning the variables
    sample values:
    _seq_name := 'hu01/1/0_seq';
    _min := 101;
    _max := 500;
  */    
  EXECUTE 'CREATE SEQUENCE "' || _seq_name || '" MINVALUE $1 MAXVALUE $2 ' 
  USING _min::INT, _max::INT;
  RETURN;
END;
$$ LANGUAGE plpgsql;
我加了引号,_seq_名称本身看起来不错。但是,当我插入这些值时,它会抛出以下错误:

ERROR:  syntax error at or near "$1"
LINE 1: CREATE SEQUENCE "hu01/1/0_seq" MINVALUE $1 MAXVALUE $2 
我还尝试了EXECUTE的另一种语法,如下所示:

现在错误不同了:

ERROR:  syntax error at or near "hu01"
LINE 1: CREATE SEQUENCE "hu01/1/0_seq" MINVALUE hu01 MAXVALUE 1
ERROR:  syntax error at or near "'101'"
LINE 1: CREATE SEQUENCE "hu01/1/0_seq" MINVALUE '101' MAXVALUE '500'...
美元符号现在可以转换,但是USING部分中的变量被
\u seq\u name
变量的一部分覆盖。我试图用下划线替换序列名称中的斜杠,但没有任何改变

我还尝试了通过
format()
结合使用,如建议的那样,但没有改变,同样的错误也发生了:

EXECUTE format('CREATE SEQUENCE %I MINVALUE $1 MAXVALUE $2 ', _seq_name) 
USING _min::INT, _max::INT;

EXECUTE format('CREATE SEQUENCE %I MINVALUE ' || $1 || ' MAXVALUE ' || $2, _nazev_seq) 
USING _min::INT, _max::INT;
然后,我将使用部分完全替换为
format()
参数:

EXECUTE format('CREATE SEQUENCE %I MINVALUE %L MAXVALUE %L ', _seq_name, _min::INT, _max::INT);
现在我几乎到了我想去的地方,错误是不同的:

ERROR:  syntax error at or near "hu01"
LINE 1: CREATE SEQUENCE "hu01/1/0_seq" MINVALUE hu01 MAXVALUE 1
ERROR:  syntax error at or near "'101'"
LINE 1: CREATE SEQUENCE "hu01/1/0_seq" MINVALUE '101' MAXVALUE '500'...
我在“”上发现了一个问题,其中一个答案建议
%s
。现在它可以工作了:

EXECUTE format('CREATE SEQUENCE %I MINVALUE %s MAXVALUE %s ', _seq_name, _min, _max);
但是,我建议在USING部分使用整数,如果没有安装bug,我会这样做。我的“解决方案”感觉是一个肮脏的变通方法,我想把它做好,所以我的问题是:

为什么USING节和美元符号转义值对我不起作用?

EXECUTE 'CREATE SEQUENCE "' || _seq_name || '" MINVALUE $1 MAXVALUE $2 ' 
USING _min::INT, _max::INT;
这不起作用,因为参数替换将起作用:

对参数符号的另一个限制是,它们仅在SELECT、INSERT、UPDATE和DELETE命令中工作。只有这些语句有执行计划,并且只有这些语句应该参数化

这不起作用,因为在该上下文中,
$1
引用函数的名称

EXECUTE format('CREATE SEQUENCE %I MINVALUE %L MAXVALUE %L ', _seq_name, _min::INT, _max::INT);
这是行不通的,因为
CREATE SEQUENCE
语句的
MINVALUE
MAXVALUE
选项都只接受整数,而不接受文本(&在ddl中不会执行隐式转换)

只要
\u min
\u max
是某种类型的整数,这是完全安全的。如果不是,请在此处使用显式强制转换

这不起作用,因为参数替换将起作用:

对参数符号的另一个限制是,它们仅在SELECT、INSERT、UPDATE和DELETE命令中工作。只有这些语句有执行计划,并且只有这些语句应该参数化

这不起作用,因为在该上下文中,
$1
引用函数的名称

EXECUTE format('CREATE SEQUENCE %I MINVALUE %L MAXVALUE %L ', _seq_name, _min::INT, _max::INT);
这是行不通的,因为
CREATE SEQUENCE
语句的
MINVALUE
MAXVALUE
选项都只接受整数,而不接受文本(&在ddl中不会执行隐式转换)

只要
\u min
\u max
是某种类型的整数,这是完全安全的。如果不是,请在此处使用显式强制转换

这不起作用,因为参数替换将起作用:

对参数符号的另一个限制是,它们仅在SELECT、INSERT、UPDATE和DELETE命令中工作。只有这些语句有执行计划,并且只有这些语句应该参数化

这不起作用,因为在该上下文中,
$1
引用函数的名称

EXECUTE format('CREATE SEQUENCE %I MINVALUE %L MAXVALUE %L ', _seq_name, _min::INT, _max::INT);
这是行不通的,因为
CREATE SEQUENCE
语句的
MINVALUE
MAXVALUE
选项都只接受整数,而不接受文本(&在ddl中不会执行隐式转换)

只要
\u min
\u max
是某种类型的整数,这是完全安全的。如果不是,请在此处使用显式强制转换

这不起作用,因为参数替换将起作用:

对参数符号的另一个限制是,它们仅在SELECT、INSERT、UPDATE和DELETE命令中工作。只有这些语句有执行计划,并且只有这些语句应该参数化

这不起作用,因为在该上下文中,
$1
引用函数的名称

EXECUTE format('CREATE SEQUENCE %I MINVALUE %L MAXVALUE %L ', _seq_name, _min::INT, _max::INT);
这是行不通的,因为
CREATE SEQUENCE
语句的
MINVALUE
MAXVALUE
选项都只接受整数,而不接受文本(&在ddl中不会执行隐式转换)

只要
\u min
\u max
是某种类型的整数,这是完全安全的。如果没有,请在此处使用显式转换。

这是有意的。对参数符号的另一个限制是,它们仅在SELECT、INSERT、UPDATE和DELETE命令中工作。这是有意的。对参数符号的另一个限制是,它们仅在SELECT、INSERT、UPDATE和DELETE命令中工作。这是有意的。对参数符号的另一个限制是,它们仅在SELECT、INSERT、UPDATE和DELETE命令中工作。这是有意的。对参数符号的另一个限制是,它们仅在SELECT、INSERT、UPDATE和DELETE命令中工作。