相关疑难解决方法(0)

如何在PostgreSQL查询中声明变量

如何声明变量以用于PostgreSQL 8.3查询?

在MS SQL Server中,我可以这样做:

DECLARE @myvar INT
SET @myvar = 5

SELECT *
FROM somewhere
WHERE something = @myvar
Run Code Online (Sandbox Code Playgroud)

我如何在PostgreSQL中做同样的事情?根据文档变量被简单地声明为"名称类型;",但这给了我一个语法错误:

myvar INTEGER;
Run Code Online (Sandbox Code Playgroud)

有人能给我一个正确语法的例子吗?

sql postgresql postgresql-8.3

205
推荐指数
13
解决办法
31万
查看次数

你如何在psql中使用脚本变量?

在MS SQL Server中,我创建脚本以使用可自定义的变量:

DECLARE @somevariable int  
SELECT @somevariable = -1

INSERT INTO foo VALUES ( @somevariable )
Run Code Online (Sandbox Code Playgroud)

然后我将@somevariable在运行时更改值,具体取决于我在特定情况下所需的值.由于它位于脚本的顶部,因此很容易看到并记住.

我如何对PostgreSQL客户端做同样的事情psql

sql postgresql variables psql

122
推荐指数
10
解决办法
20万
查看次数

如何在简单的PostgreSQL脚本中使用变量?

例如,在MS-SQL中,您可以打开查询窗口并运行以下命令:

DECLARE @List AS VARCHAR(8)

SELECT @List = 'foobar'

SELECT *
FROM   dbo.PubLists
WHERE  Name = @List
Run Code Online (Sandbox Code Playgroud)

如何在PostgreSQL中完成?可以吗?

postgresql variables

89
推荐指数
8
解决办法
23万
查看次数

将用户标识传递给PostgreSQL触发器

我正在使用PostgreSQL 9.1.我的数据库是结构化的,以便我的应用程序使用实际的表.对于每个表,都有历史表,仅存储更改历史记录.历史表包含相同的字段,实际表格和字段形成一些额外信息,例如.编辑时间.历史表仅由触发器处理.

我有两种触发器:

  1. Before INSERT 触发器在创建表时向表添加一些额外信息(例如,create_time).
  2. Before UPDATE触发器和before DELETE触发器将旧值从实际表复制到历史表.

问题是我想使用触发器来存储进行这些更改的用户的ID.而id我是来自php应用程序的id,而不是PostgreSQL用户id.

有没有合理的方法呢?

使用INSERT和UPDATE,可以只将id的额外字段添加到实际表中,并将用户id作为SQL查询的一部分传递给SQL.据我所知,这不适用于DELETE.

所有触发器的结构如下:

CREATE OR REPLACE FUNCTION before_delete_customer() RETURNS trigger AS $BODY$
BEGIN
    INSERT INTO _customer (
        edited_by,
        edit_time,
        field1,
        field2,
        ...,
        fieldN
    ) VALUES (
        -1, // <- This should be user id.
        NOW(),
        OLD.field1,
        OLD.field2,
        ...,
        OLD.fieldN
    );
    RETURN OLD;
END; $BODY$
LANGUAGE plpgsql
Run Code Online (Sandbox Code Playgroud)

postgresql triggers

37
推荐指数
2
解决办法
1万
查看次数

如何在触发器功能中使用变量设置?

我想在会话/事务中记录用户的id,使用SET,所以我以后可以在触发器函数中使用它来访问它current_setting.基本上,我正在尝试从之前发布非常相似的票证中选择n2 ,区别在于我正在使用PG 10.1.

我一直在尝试3种设置变量的方法:

  • SET local myvars.user_id = 4,从而在交易中在本地设置;
  • SET myvars.user_id = 4从而将其设置在会话中;
  • SELECT set_config('myvars.user_id', '4', false),取决于最后一个参数,将是前两个选项的快捷方式.

它们都不能在触发器中使用,触发器NULL在获取变量时接收current_setting.这是我设计的用于对其进行故障排除的脚本(可以很容易地与postgres docker镜像一起使用):

database=$POSTGRES_DB
user=$POSTGRES_USER
[ -z "$user" ] && user="postgres"

psql -v ON_ERROR_STOP=1 --username "$user" $database <<-EOSQL
    DROP TRIGGER IF EXISTS add_transition1 ON houses;
    CREATE TABLE IF NOT EXISTS houses (
        id SERIAL NOT NULL,
        name VARCHAR(80),
        created_at TIMESTAMP WITHOUT TIME ZONE DEFAULT now(),
        PRIMARY KEY(id)
    );

    CREATE …
Run Code Online (Sandbox Code Playgroud)

postgresql global-variables plpgsql postgresql-triggers

12
推荐指数
3
解决办法
1905
查看次数

如何在pgAdmin中声明变量

如果我在psql终端,那么我可以声明并使用这样的变量:

\set message_id soifsdaofisd.gmail.com;
select * from emails where message_id = ':message_id';
Run Code Online (Sandbox Code Playgroud)

我怎么能在pgAdmin中这样做?

我在pgAdmin中尝试这个时出错:

错误:"CALAdkA4YC0"或其附近的语法错误第3行:设置message_id soifsdaofisd.gmail.com.

postgresql variables pgadmin psql

10
推荐指数
2
解决办法
2万
查看次数

在Postgresql存储函数/过程中定义全局常量?

我有一套在PostgreSql中创建的函数。我希望能够使用全局常量配置某些行为和限制。

到目前为止,我已经实现了类似这些的函数,我的函数调用这些函数以检索常量值:

CREATE OR REPLACE FUNCTION slice_length()
RETURNS integer AS $$
BEGIN
    RETURN 50;
END; $$
LANGUAGE plpgsql IMMUTABLE;
Run Code Online (Sandbox Code Playgroud)

我想知道,是否有更好/更智能的方法来实现这一目标?

postgresql stored-procedures global constants

6
推荐指数
1
解决办法
3347
查看次数

PostgreSQL中用户定义的变量

我有以下MySQL脚本,我想在PostgreSQL中实现.

 SET @statement = search_address_query;
      PREPARE dynquery FROM @statement;
      EXECUTE dynquery;
      DEALLOCATE PREPARE dynquery;
Run Code Online (Sandbox Code Playgroud)

如何使用PostgreSQL定义用户定义的变量"@statement".

postgresql variables dynamic-sql

5
推荐指数
1
解决办法
1万
查看次数

如何使用Postgres查询窗口中的参数测试我的临时SQL

在Microsoft SQL Server中,要在查询窗口中测试类似的内容:

select * from Users where LastName = @lastname
Run Code Online (Sandbox Code Playgroud)

我可以在命令之前添加这个:

declare @lastname varchar(16)
set @lastname = 'Troy'
Run Code Online (Sandbox Code Playgroud)

但是在PostgreSQL中,我找不到类似的方法.似乎我唯一能做的就是直接用它的值替换参数名称.当ad-hoc查询变得复杂并且多次使用相同的参数时,它变得很难.有办法吗?

sql postgresql parameterized-query

5
推荐指数
2
解决办法
1930
查看次数

为整个数据库创建常量字符串

我还是SQL的新手,所以我有一些小问题需要解决.我在Acqua Data Studio中运行Postgres数据库,其中一些查询遵循相同的模型.
这些查询中的一些变量是相同的,但将来可能会发生变化......

考虑到优化的数据库,更改常量的值比输入20多个查询并更改所有这些查询中的相同方面更快.

例:

SELECT *
FROM Table AS Default_Configs      
    LEFT JOIN Table AS Test_Configs
        ON Default_Configs.Column1 = 'BLABLABLA'
Run Code Online (Sandbox Code Playgroud)

想象'BLABLABLA'可能是'XXX',我怎么能让'BLABLABLA'成为遵循这种模式创建的每个View的常量?

sql postgresql constants

3
推荐指数
1
解决办法
2092
查看次数