我一直在做研究并嘗試了很多不同的方法,但沒有成功。我想創建一個臨時表,然后在進行一些搜索時,用一些東西填滿它。我可以通過在程序中宣告一個表來使用 SQL Server 來做到這一點,但是使用 Postgresql 我讀過我需要專門創建一個臨時表。
我的策略開始于
CREATE TEMP TABLE myTempTable
(
propOne bigint,
propTwo smallint,
createdAtUtc timestamp(6)
);
我什至將它移到“BEGIN”之后。在檔案中我收到此錯誤:
錯誤:“myTempTable”不是已知變數第
77 行:SELECT * INTO myTempTable from myResult;
接下來,當我準備好填充它時,我嘗試創建臨時表......
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...
The other example would be something similar to creating the table first and then inserting into it. That's probably where I messed up. Working solution will be added in a minute, if someone doesn't add it in first.
uj5u.com熱心網友回復:
您可以使用 CTE,但將 CTE 放在括號內以創建表。
CREATE TEMPORARY TABLE myTempTable AS (
WITH cte_updated_records AS (
UPDATE dbTable
SET tablePropertyStatus = 3
WHERE tablePropertyDate < storedProcedurePropertyDate
RETURNING *
)
SELECT * FROM cte_updated_records
);
uj5u.com熱心網友回復:
在除錯時,事情可能會變得有點瘋狂。我發現經常發生的事情是我嘗試了一個好的解決方案,但我不知道如何正確地實施它,因此以下有效。我想我忘記了 INSERT INTO 中的選擇。
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';
CREATE TEMP TABLE status_table(
Id bigint,
Status smallint,
CreatedAtUtc timestamp(6));
WITH first_updated AS (UPDATE MyTable
SET Status = 1
WHERE UpdatedAtUtc < v_UtcNow
RETURNING Id, Status, UpdatedAtUtc)
INSERT INTO status_table
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 status_table
select Id, Status, UpdatedAtUtc
from m_result;
DROP TABLE status_table;
END;
$body$
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/391468.html
標籤:sql postgresql plpgsql
