我需要为存储过程中的临时表创建一个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中编写存储过程非常基础;有人可以帮助我并给我正确的解决方案吗?
答案 0 :(得分:2)
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
。您可以在自治事务中执行该语句,但这将是无用的,因为创建的表对于运行存储过程的当前事务是不可见的。
但是,正如您已经发现的那样,可选择的存储过程可以被视为另一个视图(或表)。