2016-03-15 56 views
0

我需要爲存儲過程中的臨時表創建DDL語句 (Firebird 2.5);Firebird 2.5 PSQL存儲過程與CREATE GLOBAL TEMPORARY TABLE

我知道我需要使用EXECUTE STATEMENT和動態SQL;

儘管存儲過程本身已經成功執行並提交,但每次運行存儲過程時,我都會在IBExpert中得到某種動態SQL錯誤 。

我所需要的確切的語法和一步一步如何寫一個火鳥存儲過程中動態 SQL代碼,即與20列創建一個全局臨時 表(GTT)的方式,和從另一插入數據存儲過程(具有20列的客戶端存儲過程)。

我從GTT(20列)檢索這些數據的一部分(5列), 操縱它,並開發SSRS報告;我不應該修改 原始客戶端存儲過程,因爲它屬於我們的客戶端。


CREATE OR ALTER PROCEDURE XYZ (Parameter1, Parameter2, Parameter3) 
RETURNS 
(
column1, 
column2 
column3, 
column4, 
column5 
) 
-- I need 5 columns in my stored procedure XYZ -- 
AS 
BEGIN 
EXECUTE STATEMENT 
'CREATE GLOBAL TEMPORARY TABLE MyOwnTable 
(
column1, 
column2 
column3, 
column4, 
column5, 
column6, 
column7, 
column8, 
. 
. 
column20 
) 
ON COMMIT PRESERVE ROWS; 
COMMIT;' ; 

EXECUTE STATEMENT 
'INSERT INTO MyOwnTable 
SELECT * 
FROM Client_Stored_Procedure (:Parameter1, :Parameter2, :Parameter3); '; 

-- Client_Stored_Procedure : given by client -- has the same 3 parameters -- 

EXECUTE STATEMENT 
'SELECT column1,column2,column3,column4, SUM(column5) AS "CalculatedColumn" 
FROM MyOwnTable 
GROUP BY column1,column2,column3,column4 
WITH AUTONOMOUS TRANSACTION 
INTO :column1,:column2,:column3,:column4,:CalculatedColumn ; ' ; 

SUSPEND; 

END 

我能犯這個存儲過程XYZ;但是當我運行我得到令牌未知提交....

我已經修改了此過程的許多不同部分;仍然得到某種令牌未知錯誤;

我在編寫Firebird中的存儲過程時非常基本;有人可以幫助我,給我正確的解決方案嗎?

回答

2

我想出了自己;在PSQL Firebird中,任何對象都像Microsoft T-SQL/SQL Server中的表格;我完全消除了使用此臨時表的需求:

SELECT column1,column2,column3,column4, SUM(column5) AS "CalculatedColumn" 
FROM Client_Stored_Procedure (:Parameter1, :Parameter2, :Parameter3) 
GROUP BY column1,column2,column3,column4 

我正在使用Client_Stored_Procedure作爲表格直接使用;這不能在Microsoft SQL Server/T-SQL中完成,其中存儲過程是一個靜態數據集!

因此,我可以用全局臨時表創建一個新的存儲過程。

1

臨時表與SQL Server如何處理臨時表的Firebird(和SQL標準)概念全局不同。 GTT是持久性元數據對象(就像普通表和視圖一樣),但其內容是連接本地的(ON COMMIT PRESERVE ROWS)或事務(ON COMMIT DELETE ROWS)。所以,如果你需要一個全局臨時表,你應該創建一次,然後從你的存儲過程(以及你需要的任何地方)使用它,而不是試圖在你的存儲過程中創建它。

接下來的問題是你試圖從EXECUTE STATEMENT執行多個語句,這是不允許的(只能執行一條語句),因此會出現「令牌未知」錯誤。

另一個問題是,您不能從存儲過程執行COMMIT。您可以在自治事務中執行該語句,但這樣做將毫無用處,因爲創建的表對於運行存儲過程的當前事務不可見。

但是,正如你已經發現的那樣,可選擇的存儲過程可以被看作又一個視圖(或表)。