我是新工作的postgresql和pgadmin4。我写了一个非常简单的查询。
我有一个称为PgFinalLocationsTable
公共模式的表。在我的表中有几个文件UserName
。我想声明一个变量,最后根据这个变量在我的表上进行选择,如下所示:
DO $$
DECLARE myvar text default 'sa';
BEGIN
select * from public."PgFinalLocationsTable" where "UserName" = myvar;
END $$;
但是为什么我收到这些消息:
ERROR: query has no destination for result data
HINT: If you want to discard the results of a SELECT, use PERFORM instead.
CONTEXT: PL/pgSQL function inline_code_block line 4 at SQL statement
SQL state: 42601
这是一个简单的查询!!!
谷歌搜索并查看堆栈上的帖子后,我已更改查询,如下所示:
CREATE OR REPLACE FUNCTION fun(text myvar) RETURNS text AS $$
--DECLARE myvar text;
BEGIN
select * from public."PgFinalLocationsTable" where "UserName" = myvar;
END;
$$ language plpgsql;
select fun('sa');
我想返回所有字段,但我不想使用plpgsql
。我想使用PostgreSQL。无论如何我都遇到了这个错误:
ERROR: type myvar does not exist
SQL state: 42704
我的第一个查询和第二个查询有什么问题?当我要传递变量时,是否应该为选择查询创建函数?
我做了所有事情,因为我想创建此sql查询:
"IF (NOT EXISTS(SELECT 1 FROM [dbo].[{0}] WHERE [UserId] = @UserId And [DeviceId] = @DeviceId)) " +
"BEGIN " +
"INSERT INTO [dbo].[{0}]([Id], [Location], [Timestamp], [UserId], [DeviceId], [AllowDomains], [Topic], [UserName], [FirstName], [LastName], [JobLocationName], [LocationId], [AppVersion], [AppName]) " +
"VALUES(@Id, GEOGRAPHY::Point(@X, @Y, 4326), @Timestamp, @UserId, @DeviceId, @AllowDomains, @Topic, @UserName, @FirstName, @LastName, @JobLocationName, @LocationId, @AppVersion, @AppName) " +
"END "
你不懂得DO
指挥得好。DO
command是没有声明的匿名函数,并且因为它没有声明输出,因此除了debug流之外,其他任何结果都是不可能的。
因此您的第一个示例在PostgreSQL中没有意义。作为MS SQL过程的结果,返回MSSQL中未绑定查询的结果。在PostgreSQL中没有类似的东西。PostgreSQL只知道函数,可以返回标量值,复合值或关系(仅一个)。当您来自MS SQL时,请尽一切可能,尝试忘记MS SQL的几乎所有知识。
ERROR: type myvar does not exist
SQL state: 42704
此错误很干净-您可以切换变量名和类型名-实际上不存在myvar类型。
返回表的一些函数如下所示:
CREATE OR REPLACE FUNCTION fx1(myvar text)
RETURNS SETOF public."PgFinalLocationsTable" AS $$
BEGIN
RETURN QUERY SELECT * FROM public."PgFinalLocationsTable" WHERE "UserName" = myvar;
END;
$$ LANGUAGE plpgsql;
或者您只能使用SQL语言
CREATE OR REPLACE FUNCTION fx1(myvar text)
RETURNS SETOF public."PgFinalLocationsTable" AS $$
SELECT * FROM public."PgFinalLocationsTable" WHERE "UserName" = $1;
$$ LANGUAGE sql;
因为PostgreSQL不支持取消绑定查询,所以不允许它。您应该使用RETURN QUERY
PLpgSQL语言中的命令-。
因为在PostgreSQL和MSSQL之间,使用存储过程进行编程实际上是有区别的(MSSQL与其他SQL不相似),请尝试阅读文档-不错https://www.postgresql.org/docs/current/static/plpgsql .html
您的函数可以在Postgres中看起来像(我不知道使用的类型)
CREATE OR REPLACE FUNCTION fx("_UserId" int,
"_DeviceId" int,
"_X" int,
"_Y" int,
...
BEGIN
IF NOT EXISTS(SELECT * FROM /* I don't know what [{0}] means */
WHERE "UserId" = "_UserId" AND "DeviceId" = "_DeviceId")
THEN
INSERT INTO ..
END IF;
END;
$$ LANGUAGE plpgsql;
也许您的片段无需程序扩展即可通过INSERT INTO ON CONFLICT DO NOTHING
命令https://www.postgresql.org/docs/current/static/sql-insert.html进行解析-哪个更好。
注意-使用区分大小写的标识符是通向地狱的捷径。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句