使用存储函数或存储过程在 firebird 3.0 中返回 table

Returning a table in firebird 3.0 with stored function or stored procedure

我正在尝试编写一个存储的 procedure/function returns 我 table 具有一行或多行数据。

返回的数据取决于以下sql语句中显示的变量:

  SELECT * FROM table_name AS SD WHERE EXISTS
  (SELECT DISTINCT S.PARENT_ID FROM table_name AS S 
  WHERE S.COMPONENT_ID = 10011 AND S.CARRIER_GROUP_ID = X AND SD.SD_ID = S.PARENT_ID)

到目前为止,我看到的是这样完成的:

CREATE FUNCTION f_test_function (X INT)
RETURNS TABLE
AS
RETURN
   (SELECT * FROM table_name AS SD WHERE EXISTS
      (SELECT DISTINCT S.PARENT_ID FROM table_name AS S 
      WHERE S.COMPONENT_ID = 10011 AND S.CARRIER_GROUP_ID = X AND SD.SD_ID = S.PARENT_ID));

之后您使用 X 值调用 function/procedure。我知道 returns 类型有问题,但我不知道是什么。

有人能帮忙吗?

您要查找的是selectable stored procedure。 Firebird 要求您显式声明存储过程 returns 的列,因此 returns table 之类的东西不是一个选项。例如:

create procedure sp_test_procedure (x integer) 
  returns (column1 integer, column2 varchar(50))
as
begin
  for select value1, value2 
      from table_name SD
      where exists (
        SELECT DISTINCT S.PARENT_ID 
        FROM table_name AS S 
        WHERE S.COMPONENT_ID = 10011 
        AND S.CARRIER_GROUP_ID = :X 
        AND SD.SD_ID = S.PARENT_ID)
      into column1, column2
  do
  begin
    suspend;
  end
end

您将需要显式映射列,因此简单的 select * 不是一个好主意。

注意 for select, which selects zero or more rows and iterates over the cursor, and suspend 的使用,它输出要从存储过程中提取的行(在本例中为游标的每一行)。

您可以从此过程生成值,例如:

select column1, column2
from sp_test_procedure(10)