PostgreSQL中的用户定义变量

10

我有以下的MySQL脚本,希望在PostgreSQL中实现它。

 SET @statement = search_address_query;
      PREPARE dynquery FROM @statement;
      EXECUTE dynquery;
      DEALLOCATE PREPARE dynquery;

如何在PostgreSQL中定义名为"@statement"的用户定义变量。


你可以简单地执行EXECUTE search_address_query;吗? - Ihor Romanchenko
2个回答

27

Postgres通常不在普通SQL中使用变量。但是您也可以这样做:

SET foo.test = 'SELECT bar FROM baz';

SELECT current_setting('foo.test');

阅读有关手册中的自定义选项的内容。

PostgreSQL 9.1或更早版本中,您需要先声明custom_variable_classes才能使用它。

但是,您不能执行动态SQLEXECUTE而不使用PL(过程化语言)。您可以使用DO命令执行即席语句(但无法从中返回数据)。或使用CREATE FUNCTION创建一个执行动态SQL的函数(并且可以以任何可想象的方式返回数据)。

使用动态SQL时一定要注意防止SQL注入。

相关:


自定义设置会持续多久?仅在会话期间有效吗?其他会话是否可以全局访问?服务重启后是否仍然存在? - Reinsbrain
3
@Reinsbrain:取决于你如何设置。 postgresql.conf 中的设置是为每个连接预设的。 SET 的效果仅在当前会话期间可见,并且仅在同一会话中可见。SET LOCAL 仅用于事务。还有更多设置选项的方法:https://dev59.com/h2ox5IYBdhLWcg3wpV3F#9067777,https://dev59.com/tl0a5IYBdhLWcg3wkpas#30179814 - Erwin Brandstetter

0
例如,您可以使用\set将数字2设置为num,如下所示。*我的答案更详细地解释了这一点。
postgres=# \set num 2
postgres=# SELECT :num;
 ?column?
----------
        2
(1 row)

而且,你可以使用\set命令将文本John Smith赋值给name,如下所示:

postgres=# \set name 'John Smith'
postgres=# SELECT :'name';
  ?column?
------------
 John Smith
(1 row)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接