有一个几乎相同,但并没有真正回答的问题在这里.
我正在将应用程序从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.
有没有办法在PostgreSQL查询中定义命名常量?例如:
MY_ID = 5;
SELECT * FROM users WHERE id = MY_ID;
Run Code Online (Sandbox Code Playgroud) 我正在使用PostgreSQL 9.1.我的数据库是结构化的,以便我的应用程序使用实际的表.对于每个表,都有历史表,仅存储更改历史记录.历史表包含相同的字段,实际表格和字段形成一些额外信息,例如.编辑时间.历史表仅由触发器处理.
我有两种触发器:
Before INSERT 触发器在创建表时向表添加一些额外信息(例如,create_time).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) 我正在尝试使用 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) 我有从 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以便可以捕获它 …
所以这个查询很简单:
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 ×6
migration ×1
pgadmin ×1
plpgsql ×1
sql ×1
sql-server ×1
triggers ×1
variables ×1