相关疑难解决方法(0)

如何在postgresql中声明局部变量?

有一个几乎相同,但并没有真正回答的问题在这里.

我正在将应用程序从MS SQL Server迁移到PostgreSQL.在代码中的许多地方我使用局部变量,所以我想进行需要较少工作的更改,所以请告诉我哪个是翻译以下代码的最佳方法?

-- MS SQL Syntax: declare 2 variables, assign value and return the sum of the two 
declare @One integer = 1
declare @Two integer = 2
select @One + @Two as SUM
Run Code Online (Sandbox Code Playgroud)

这会返回:

SUM
-----------
3

(1 row(s) affected)
Run Code Online (Sandbox Code Playgroud)

如果它包含可以简化翻译的重要文件,我会使用Postgresql 8.4甚至9.0.

sql-server migration postgresql

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

有没有办法在PostgreSQL查询中定义命名常量?

有没有办法在PostgreSQL查询中定义命名常量?例如:

MY_ID = 5;
SELECT * FROM users WHERE id = MY_ID;
Run Code Online (Sandbox Code Playgroud)

sql postgresql

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

将用户标识传递给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万
查看次数

使用变量连接后设置 application_name ?

我正在尝试使用 pl/pgsql 函数内的变量来设置 application_name 。我需要设置一些变量,所以我想包装在一个函数中,而不是让客户端多次运行该命令。

然而当我跑步时

my_variable := 'foo';
SET application_name = my_variable;
Run Code Online (Sandbox Code Playgroud)

它将 application_name 设置为 my_variable 而不是 foo。

这是在 postgresql11 上的。我尝试以各种方式引用该变量以使其进行评估,但到目前为止还没有成功。

当我运行一个简单的

SET application_name = 'foo';
Run Code Online (Sandbox Code Playgroud)

它按预期工作。我已经尝试了引用另一个答案的一些字符串:How do you use script variables in psql? 但这些似乎都不适合我。

到目前为止我的代码是:

CREATE OR REPLACE FUNCTION app_name_test(
                                                p_application_name VARCHAR(64)
                                        ) RETURNS BOOLEAN
    LANGUAGE plpgsql
AS $$
DECLARE
BEGIN

    RAISE INFO 'Setting Application Name To: %', p_application_name;

    SET application_name = p_application_name;

    RETURN TRUE;
END;
$$;


SELECT app_name_test('This_is_a_test');
Run Code Online (Sandbox Code Playgroud)

我相当确定这是可能的,但我必须以某种方式引用字符串。提前谢谢了。


编辑:下面来自 a_horse_with_no_name 的评论中的答案解决了这个问题。

EXECUTE FORMAT('SET application_name …
Run Code Online (Sandbox Code Playgroud)

postgresql

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

如何从 psql 查询将文本打印到标准输出?

我有从 bash shell 调用的以下(经过修改的)psql 脚本:

foo=$( psql -q -t -R $'\x01' -F $'\x02' \
                --variable="title=something" \
                --variable="severity=level9" \
                --pset='format=unaligned' \
                <<'EOF'
SET standard_conforming_strings=on;
SET myvars.title = :title;
SET myvars.severity = :severity;
DO $$
BEGIN
        IF EXISTS ( SELECT 1 from my_database
                WHERE title=current_setting('myvars.title') \
                AND severity=current_setting('myvars.severity') )
        THEN
                RAISE NOTICE 'Found existing entry';
        ELSE
                RAISE NOTICE 'Did not find existing entry';
        END IF;
END;
$$;
EOF
 )
Run Code Online (Sandbox Code Playgroud)

我希望在 bash 变量“foo”中捕获查询是否成功的一些指示。我想我可以在每个 RAISE NOTICE 语句之后添加某种 print/echo/return/whatever 语句,以从语句中输出 0 或 1,psql以便可以捕获它 …

postgresql plpgsql

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

有没有在PostgreSQL查询中使用变量的简便方法?

使用:PostgreSQL10&pgAdmin4

所以这个查询很简单:

SELECT * FROM [schema_name].[table_name] 
   WHERE [schema_name].[table_name].[field_name] = 'search_value';
Run Code Online (Sandbox Code Playgroud)

在Transact-SQL中,可以为“ search_value”创建一个变量:

DECLARE @find varchar(30) = 'search_value';

SELECT * FROM [schema_name].[table_name] 
   WHERE [schema_name].[table_name].[field_name] = @find;
Run Code Online (Sandbox Code Playgroud)

甚至重新使用变量:

SET @find = 'new_search_value';
Run Code Online (Sandbox Code Playgroud)

我现在已经尽一切努力在PostgreSQL中模仿它,但是我无法使其正常工作。

有什么建议么???

postgresql variables pgadmin

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