2016-03-15 32 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。您可以在自治事务中执行该语句,但这样做将毫无用处,因为创建的表对于运行存储过程的当前事务不可见。

但是,正如你已经发现的那样,可选择的存储过程可以被看作又一个视图(或表)。