【发布时间】:2022-01-23 22:59:53
【问题描述】:
我一直在做研究并尝试了很多不同的方法,但都没有成功。我想创建一个临时表,然后在进行一些搜索时,用一些东西填满它。我可以通过在过程中声明一个表来使用 SQL Server 来做到这一点,但是使用 Postgresql 我已经读过我需要专门创建一个临时表。
我的策略一开始只是
CREATE TEMP TABLE myTempTable
(
propOne bigint,
propTwo smallint,
createdAtUtc timestamp(6)
);
我什至把它移到“BEGIN”之后。在文件中我收到此错误:
错误:“myTempTable”不是已知变量
第 77 行:从 myResult 中选择 * INTO myTempTable;
接下来,当我准备好填充临时表时,我尝试创建它...
WITH some_updated_records AS
(
UPDATE dbTable
SET tablePropertyStatus = 3
WHERE tablePropertyDate < storedProcedurePropertyDate
RETURNING *
)
CREATE TEMP TABLE myTempTable as
(
SELECT *
FROM some_updated_records
);
我仍然得到与上面相同的基本错误,但在遇到 myTempTable 变量之前出现零错误。
我绝对不是 SQL 天才(也许,最终,在你的帮助下),所以我可能做错了一些其他事情。我的全部任务是将 SQL Server 存储过程转换为 Postgresql。
我做错了什么来使临时表变量未声明?有什么特殊的方式需要提前申报吗?我在如何创建或声明临时表方面犯了错误吗?
另一种策略可能是将记录保存到类型集合中,忘记“临时表”。有没有办法在 plpgsql 中做到这一点?
更新示例
这个版本不工作。它在创建表处停止。
CREATE OR REPLACE PROCEDURE MyTestProcedure(
p_Endpoint Varchar(256),
p_ContentType Varchar(200),
MaxInProcess int = NULL)
LANGUAGE plpgsql
AS $body$
DECLARE
v_UtcNow timestamp(6);
v_ExpiredProcessing timestamp(6);
BEGIN
SELECT CURRENT_TIMESTAMP into v_UtcNow at time zone 'utc';
WITH first_updated AS (UPDATE MyTable
SET Status = 1
WHERE UpdatedAtUtc < v_UtcNow
RETURNING Id, Status, UpdatedAtUtc)
CREATE TEMP TABLE IF NOT EXISTS statustable AS (SELECT Id, Status, UpdatedAtUtc FROM first_updated)
WITH m_result AS (UPDATE MyTable
SET Status = 3,
WHERE ExpirationDateTimeUtc < v_UtcNow
RETURNING Id, Status, UpdatedAtUtc)
INSERT INTO statustable from m_result;
DROP TABLE statustable;
END;
$body$
这在创建表时出错。
INE 22: CREATE TEMP TABLE statustable as...
另一个示例类似于先创建表然后插入其中。这大概就是我搞砸的地方。如果有人没有先添加,工作解决方案将在一分钟内添加。
【问题讨论】:
-
请edit您的问题并向我们展示程序的完整代码。在使用 Postgres 时,您通常不需要一个临时表开始
-
这是公司代码。我会试一试,但需要一段时间。我想出了一个更精简的版本来解决这个问题。谢谢@a_horse_with_no_name
-
如果你想返回一些东西,你应该使用函数而不是过程。
-
程序的退货无效。最后我正在使用临时表执行一些工作。
-
SQL Server temporary tables as variables 在 plpgsql 中不存在。
标签: sql postgresql plpgsql