【发布时间】:2020-04-24 04:11:50
【问题描述】:
我们从 SQL Server 迁移到 Postgres,我正在尝试重写存储过程。该过程已正确创建,但我无法调用它。
这是我的程序:
CREATE OR REPLACE PROCEDURE spr_getItems (
p_kind int = NULL,
p_customerId varchar(256) = NULL,
p_resourceIds varchar(2048) = NULL,
p_referenceIds varchar(2048) = NULL
)
AS $$
BEGIN
SELECT
c.kind,
c.name AS customerName,
c.oid AS customerId,
r.name AS resourceName,
r.oid AS resourceId
o.fullObject AS fullObjectString
FROM m_customer c
JOIN m_resource r
ON r.oid = c.resourceOid
LEFT JOIN m_object o
ON o.customerOid = c.oid
AND o.customerOid = p_customerId
WHERE (c.kind = p_kind OR p_kind is NULL)
AND (c.referenceOid IN (SELECT refTemp.oid FROM tvf_commaSeperatedStringToTable(p_referenceIds) refTemp) OR p_referenceIds is NULL)
AND (r.oid IN (SELECT resTemp.oid FROM tvf_commaSeperatedStringToTable(p_resourceIds) resTemp) OR p_resourceIds is NULL);
END;
$$
LANGUAGE 'plpgsql';
表值函数tvf_commaSeperatedStringToTable 只接受一个字符串,将其拆分并返回一个包含所有不同ID 和行号的表。它工作得很好并且经过测试,这里没有错误。
现在当我尝试像这样执行它时
CALL public.spr_getItems (0, null, null, null)
我得到这个输出:
错误:查询没有结果数据的目的地
提示:如果要丢弃 SELECT 的结果,请改用 PERFORM。
上下文:PL/pgSQL 函数 spr_getItems(整数,字符变化,字符变化,字符变化) SQL 语句的第 3 行
SQL 状态:42601
但我不想丢弃结果,我想看到它们。
所以我尝试用 select 调用它
SELECT *
FROM CALL spr_getItems (0, null, null, null)
然后我得到这个语法错误:
错误:“0”处或附近的语法错误
第 2 行:0,
^
SQL 状态:42601
字符:40
我还尝试以其他几种方式执行它,例如添加“public”。在程序名称之前,但在“.”处出现语法错误。或者只使用select spr_getItems(0, null, null, null) 或select spr_getItems(0)、select * from call spr_getItems (0) 等等。
我是否在做一些完全错误的事情并忽略了文档中的某些内容?
感谢您的帮助!
编辑:澄清我想查看结果
Edit2:不小心复制了错误的函数名
Edit3:按照建议添加了完整的正文
【问题讨论】:
-
@Abelisto 我不想丢弃结果。
-
到目前为止的两个答案已经为您提供了一些关于如何解决此问题的良好线索,但似乎您也可能正在使用应该使用函数的过程。如果您想从存储的代码中获取结果,请使用函数。
CALL与过程一起使用。SELECT与函数一起使用。 -
@Jeremy 正如我在问题中所说,到目前为止我只使用过 mssql。在那里,我使用存储过程来获取一个或多个可以在前端使用的记录集。我将尝试使用函数而不是过程,看看结果如何。之后我会去postgres中查找函数和存储过程之间的区别,以更好地了解何时使用什么。谢谢
-
@a_horse_with_no_name 添加了程序主体
标签: sql postgresql stored-procedures