Select 如何在Firebird 2.5中选择程序

Select 如何在Firebird 2.5中选择程序,select,stored-procedures,firebird,firebird2.5,Select,Stored Procedures,Firebird,Firebird2.5,我正在使用Firebird嵌入式v2.5。如何在查询选择中使用过程 我的程序: 设定期限^; 创建过程FN\u测试Y整数 返回X整数 像 开始 X=Y+1; 结束^ 设定期限^ 我想列出一些经过某些过程修改的表字段,如下所示: 选择一些表格字段1, fn_测试4作为zzz, 一些表字段2, fn_测试某些_表_字段_2作为字段_2_修改 来自tb_测试 需求结果表: some_table_field_1 zzz some_table_field_2 field_

我正在使用Firebird嵌入式v2.5。如何在查询选择中使用过程

我的程序:

设定期限^; 创建过程FN\u测试Y整数 返回X整数 像 开始 X=Y+1; 结束^ 设定期限^ 我想列出一些经过某些过程修改的表字段,如下所示:

选择一些表格字段1, fn_测试4作为zzz, 一些表字段2, fn_测试某些_表_字段_2作为字段_2_修改 来自tb_测试 需求结果表:

some_table_field_1     zzz         some_table_field_2      field_2_modified
---------------------------------------------------------------------------
aaa                    5           14                      15
bbb                    5           23                      24
www                    5           75                      76

这在PostgreSQL中运行良好,但我不知道如何在Firebird中执行此操作。

您不能在Firebird的选择列表中调用存储过程。您必须编写带有所需结果的可选程序,或者编写一个UDF函数来执行fn_测试程序中的操作

对于您的情况,最简单的方法是:

选择一些表格字段1, 5作为zzz, 一些表字段2, 某些_表_字段_2+1作为字段_2_修改 来自tb_测试 试一试

选择一些表格字段1, fn_测试.x作为zzz, 一些表字段2, 来自tb_测试 左连接fn\u testsome\u table\u field\u 1 ON 1=1 如前所述,不能在select中调用存储过程。只能在FROM部分中调用存储过程。解决问题的另一个方法是创建一个可选择的过程,如下所示:

创建或更改程序myproc n整数 返回 字段_1整数, zzz整数, 字段_2整数, 修改的\u字段\u 2整数 像 声明变量i为整数; 开始 对于 选择一些表格字段,选择:n+1作为zzz,选择一些表格字段,选择一些表格字段,选择2+1作为字段 来自tb_测试 进入:字段_1,:zzz,:字段_2,:修改的字段_2 一定要开始 悬 终止 终止 运行该代码后,您只需从myproc4中查询select*,即可获得所需内容。

选择一些表字段1, 从fn_测试4中选择X作为zzz, 一些表字段2, 从fn_测试中选择X,某些_表_字段_2作为字段_2_修改 来自tb_测试
使用自定义项管理字段上的计算。
存储过程仅允许在FROM子句中使用。

您可以使用EXECUTE BLOCK请查看一下

设定期限^; 创建过程FN\u测试Y整数 返回X整数 像 开始 X=Y+1; 悬 结束^ 设定期限^ FN_测试是一个可执行过程:它可以通过EXECUTE procedure语句调用,并返回一组输出参数

在Firebird 2.x中,只有可选择的存储过程可用作视图/表see

因此:

在偏移量处生成无效的请求BLR。。。错误

您可以更改您的过程,但实际上,Firebird 3中已经以以下形式引入了您需要的功能:


有关详细信息,请参见。

您的问题到底是什么?你收到错误信息了吗?如果是,则不可选择itfn_后测试,这是一个错误。建议的解决方案在偏移量处生成无效的请求BLR。。。错误。添加一个暂停;语句,函数变为可选择。fn_测试不可选择,它是一个。建议的解决方案在偏移量处生成无效的请求BLR。。。错误
SELECT FN_TEST(some_table_field) AS field_modified
FROM   tb_test
CREATE FUNCTION FN_TEST(Y INT) RETURNS INT
AS
BEGIN
  RETURN Y + 1;
END;

SELECT FN_TEST(4) AS zzz
FROM   tb_test