首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用value1执行<query-string> .第一次替换的瓶颈-占位符($1)

使用value1执行<query-string> .第一次替换的瓶颈-占位符($1)
EN

Stack Overflow用户
提问于 2015-11-06 02:08:11
回答 1查看 332关注 0票数 0

下面的代码在“元一”占位符上失败,我不知道为什么。我试图确定我是否遗漏了一些语义上的东西,或者这是否是一个实际的Postgresql核心错误,它可以由下面所示的代码支持。

代码语言:javascript
复制
-- Attempt to run the following on any database.
-- Creating the relations of the correct names etc. should not be necessary,
-- as the error occurs before this would even matter.

-- The code below fails in an unexpected way because no substitution appears
-- to take place.

--
-- ERROR:  syntax error at or near "$1"
-- LINE 3:    special_constraint_trigger($1,$2,$3);
--                                       ^
-- SQL state: 42601
-- Context: PL/pgSQL function inline_code_block line 11 at EXECUTE statement
--

DO LANGUAGE plpgsql $$
DECLARE
    -- simulated parameters:
    referencing_table TEXT = 'the_great_referencer';
    referencing_column TEXT = 'fk_field';
    referenced_column TEXT = 'measurement_id';
    -- :simulated parameters
BEGIN
    EXECUTE 'CREATE CONSTRAINT TRIGGER maybe_throw_some_exceptions AFTER UPDATE OR DELETE ON measurement 
         DEFERRABLE INITIALLY DEFERRED FOR EACH ROW EXECUTE PROCEDURE 
         special_constraint_trigger($1,$2,$3);'
        USING referenced_column,referencing_table, referencing_column;
END;
$$;

其他人是否清楚为什么这个USING替代不起作用?我希望上面提到的是虚假的表格和列,但在我的系统中,Postgres似乎更关心的是未被取代的美元符号。特别是如果其他人能够复制此错误,我将计划将其作为一个bug进行归档。

版本信息:PostgreSQL 9.2.14 on x86_64-redhat-linux-gnu,由gcc (GCC) 4.8.3 20140911 (RedHat4.8.3-9),64位编译

OS:Linux4.1.10-17.31.amzn1.x86_64 #1 SMP 10月24日01:31:37 UTC 2015 x86_64 GNU/Linux

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-06 06:16:34

您的代码不应该工作- params只能与带有计划的SQL语句一起使用。DML (INSERTUPDATEDELETE)和SELECT是与计划一起的语句。DDL语句没有计划,因此不应该进行参数化。因此,不能将子句USING用于任何DDL语句,如CREATEALTERDROP。您必须在没有任何参数的情况下执行一些SQL字符串--下面的代码应该可以工作:

代码语言:javascript
复制
BEGIN
   EXECUTE format('CREATE CONSTRAINT TRIGGER maybe_throw_some_exceptions
                   AFTER UPDATE OR DELETE ON measurement 
                   DEFERRABLE INITIALLY DEFERRED
                   FOR EACH ROW EXECUTE PROCEDURE 
                   special_constraint_trigger(%I,%I,%I)',
                  referenced_column,
                  referencing_table,
                  referencing_column);
END;
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33558301

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档