使用CREATE GLOBAL TEMPORARY TABLE的Firebird 2.5 PSQL存储过程

时间:2016-03-15 11:29:33

标签: insert firebird temp-tables

我需要为存储过程中的临时表创建一个DDL语句 (Firebird 2.5);

我知道我需要在动态SQL中使用EXECUTE STATEMENT;

虽然存储过程本身已成功执行并提交, 每当我运行存储过程时,我都会得到一些 IBExpert中的动态SQL错误。

我需要有关如何编写动态的确切语法和分步方法 Firebird存储过程中的SQL代码,用于创建全局临时存储 table(GTT),包含20列,并从另一个存储过程(具有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;但是当我跑步时,我得到了Token Unknown Commit ....

我修改了这个程序的许多不同部分;仍然会得到某种令牌未知错误;

我在Firebird中编写存储过程非常基础;有人可以帮助我并给我正确的解决方案吗?

2 个答案:

答案 0 :(得分: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 :(得分:1)

全局临时表的Firebird(和SQL标准)概念与SQL Server处理临时表的方式不同。 GTT是持久性元数据对象(就像普通表和视图一样),但它们的内容是连接(<div class="input_frm"> <form method="post" action="<?php print data_clean($_SERVER["PHP_SELF"]);?>"> <table class="input_tbl"> <tr> <td class="a">Select province</td> <td class="b"><select id="selProvincie" name="Alfa" onchange="ProvincieChg()"></select></td> <td class="c"><input class="button_face" type="submit" value="Submit"></td> </tr> <tr> <td class="a">Select region</td> <td class="b"><select id="selRegiune" name="Beta" onchange="RegiuneChg()"></select></td> <td class="c"></td> </tr> ... </table> </form> </div> )或事务(ON COMMIT PRESERVE ROWS)的本地内容。因此,如果您需要一个全局临时表,则应该创建一次,然后在存储过程中使用它(以及您需要的任何其他位置),而不是尝试在存储过程中创建它。

下一个问题是你尝试从ON COMMIT DELETE ROWS执行多个语句,这是不允许的(只能执行一个语句),因此&#34;令牌未知&#34;错误。

另一个问题是您无法从存储过程执行EXECUTE STATEMENT。您可以在自治事务中执行该语句,但这将是无用的,因为创建的表对于运行存储过程的当前事务是不可见的。

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