Postgresql 函数中的Postgres语法错误
我正在尝试创建函数,但在以下代码中找不到错误:Postgresql 函数中的Postgres语法错误,postgresql,plpgsql,dynamic-sql,reserved-words,Postgresql,Plpgsql,Dynamic Sql,Reserved Words,我正在尝试创建函数,但在以下代码中找不到错误: CREATE OR REPLACE FUNCTION qwat_od.fn_label_create_fields(table_name varchar, position boolean = true, rotation boolean = true) RETURNS void AS $BODY$ BEGIN /* Creates columns */ EXECUTE 'ALTER TABLE qwat_o
CREATE OR REPLACE FUNCTION qwat_od.fn_label_create_fields(table_name varchar, position boolean = true, rotation boolean = true) RETURNS void AS
$BODY$
BEGIN
/* Creates columns */
EXECUTE 'ALTER TABLE qwat_od.'||table_name||' ADD COLUMN label_1_visible smallint default 1; ';
IF position IS TRUE THEN
EXECUTE 'ALTER TABLE qwat_od.'||table_name||' ADD COLUMN label_1_x double precision default null;';
EXECUTE 'ALTER TABLE qwat_od.'||table_name||' ADD COLUMN label_1_y double precision default null;';
END IF;
IF rotation IS TRUE THEN
EXECUTE 'ALTER TABLE qwat_od.'||table_name||' ADD COLUMN label_1_rotation double precision default null;';
END IF;
EXECUTE 'ALTER TABLE qwat_od.'||table_name||' ADD COLUMN label_1_text varchar(120);';
EXECUTE 'ALTER TABLE qwat_od.'||table_name||' ADD COLUMN label_2_visible smallint default 1; ';
IF position IS TRUE THEN
EXECUTE 'ALTER TABLE qwat_od.'||table_name||' ADD COLUMN label_2_x double precision default null;';
EXECUTE 'ALTER TABLE qwat_od.'||table_name||' ADD COLUMN label_2_y double precision default null;';
END IF;
IF rotation IS TRUE THEN
EXECUTE 'ALTER TABLE qwat_od.'||table_name||' ADD COLUMN label_2_rotation double precision default null;';
END IF;
EXECUTE 'ALTER TABLE qwat_od.'||table_name||' ADD COLUMN label_2_text varchar(120);';
/* Creates constraints */
EXECUTE 'ALTER TABLE qwat_od.'||table_name||' ADD CONSTRAINT '||table_name||'_label_1_visible FOREIGN KEY (label_1_visible) REFERENCES qwat_vl.visible(vl_code_int) MATCH FULL; CREATE INDEX fki_'||table_name||'_label_1_visible ON qwat_od.'||table_name||'(label_1_visible);';
EXECUTE 'ALTER TABLE qwat_od.'||table_name||' ADD CONSTRAINT '||table_name||'_label_2_visible FOREIGN KEY (label_2_visible) REFERENCES qwat_vl.visible(vl_code_int) MATCH FULL; CREATE INDEX fki_'||table_name||'_label_2_visible ON qwat_od.'||table_name||'(label_2_visible);';
END;
$BODY$
LANGUAGE 'plpgsql';
我明白了:
ERROR: syntax error at or near "position"
LINE 4: ...wat_od.fn_label_create_fields(table_name varchar, position b...
我在参数声明中做错了什么吗?因为你看到的错误。但还有更多。最重要的是,你对我敞开心扉
- 确保使用明确、有效的参数名称(
a是主要错误)position
- 我用
修复了您的SQL注入问题(因为使用format()
的简单解决方案没有涵盖您的串联名称,正如@pozs所评论的)。详细说明:regclass
必须是非限定表名(\u tbl
,而不是“tbl”
)“schema.tbl”
- 不要引用语言名称,它是一个标识符:
language plpgsql
- 在一个语句中添加多个columns/sonstraint更便宜
- 其他各种简化/优化
如果那么就更容易理解了。@a\u horse\u和\u no\u名称:表明是真的受支持位置是sql保留字,你应该引用它,谢谢!!!这确实是造成麻烦的位置。虽然我通常同意使用regclass
,但这种情况会产生语法错误(接近约束名称)和特殊表名,如“$t”
(它会生成f.ex.创建索引fki”$t)_标签可见…
——应该使用pg目录中的丑陋选项来克服这一问题,或者使用format()
/quote\u ident()simplicity@pozs:你说得对。我忽略了连接的名称。非标准标识符将是一个问题。format()
是解决方法。
CREATE OR REPLACE FUNCTION qwat_od.fn_label_create_fields(_tbl text, _position bool = true, _rotation bool = true)
RETURNS void AS
$func$
BEGIN
/* Creates columns */
EXECUTE format('ALTER TABLE qwat_od.%I ADD COLUMN label_1_visible smallint default 1', _tbl);
IF _position THEN
EXECUTE format('ALTER TABLE qwat_od.%I
ADD COLUMN label_1_x double precision default null
, ADD COLUMN label_1_y double precision default null', _tbl);
END IF;
IF _rotation THEN
EXECUTE format('ALTER TABLE qwat_od.%I ADD COLUMN label_1_rotation double precision default null' , _tbl);
END IF;
EXECUTE format('ALTER TABLE qwat_od.%I
ADD COLUMN label_1_text varchar(120)
, ADD COLUMN label_2_visible smallint default 1', _tbl);
IF _position THEN
EXECUTE format('ALTER TABLE qwat_od.%I
ADD COLUMN label_2_x double precision default null
, ADD COLUMN label_2_y double precision default null', _tbl);
END IF;
IF _rotation THEN
EXECUTE format('ALTER TABLE qwat_od.%I ADD COLUMN label_2_rotation double precision default null', _tbl);
END IF;
EXECUTE format('ALTER TABLE qwat_od.%I ADD COLUMN label_2_text varchar(120)', _tbl);
/* Creates constraints */
EXECUTE format('ALTER TABLE qwat_od.%$1I
ADD CONSTRAINT %$2I FOREIGN KEY (label_1_visible) REFERENCES qwat_vl.visible(vl_code_int)
, ADD CONSTRAINT %$3I FOREIGN KEY (label_2_visible) REFERENCES qwat_vl.visible(vl_code_int);
CREATE INDEX %$4I ON qwat_od.%$1I(label_1_visible);
CREATE INDEX %$5I ON qwat_od.%$1I(label_2_visible)'
, _tbl
, _tbl || '_label_1_visible'
, _tbl || '_label_2_visible'
, 'fki_' || _tbl || '_label_1_visible'
, 'fki_' || _tbl || '_label_2_visible');
END
$func$ LANGUAGE plpgsql;