Stored procedures Firebird存储过程始终返回零

Stored procedures Firebird存储过程始终返回零,stored-procedures,firebird,c++builder-xe2,Stored Procedures,Firebird,C++builder Xe2,这是我的存储过程: SET TERM ^ ; CREATE PROCEDURE INSERT_ETYPE ( E_ID Integer, E_NAME Varchar(20) CHARACTER SET NONE ) RETURNS ( NEW_ID Integer) AS declare variable addr varchar(20); declare variable type smallint; declare variable ord smallint; de

这是我的存储过程:

SET TERM ^ ;
CREATE PROCEDURE INSERT_ETYPE (
    E_ID Integer,
    E_NAME Varchar(20) CHARACTER SET NONE )
RETURNS (
    NEW_ID Integer)
AS
declare variable addr varchar(20);
declare variable type smallint;
declare variable ord smallint;
declare variable cmd varchar(255);
declare variable answr varchar(255);
begin
  insert into ETYPE
  select * from ETYPE where ID=:e_id;
  select max(ID) from ETYPE into :new_id;

  update ETYPE set NAME = :e_name where ID = :new_id;
  for 
    select ADDR,REGTYPE,ORD from ETYPEREGS 
      where ETYPE_ID=:e_id
      into :addr,:type,:ord
    do
      begin
        insert into ETYPEREGS
          (ETYPE_ID,ADDR,REGTYPE,ORD)
         values
          (:new_id,:addr,:type,:ord);
      end 
  for 
    select CMD,ANSWR,ORD,REGTYPE from ETYPESPECIAL 
      where ETYPE_ID=:e_id
      into :cmd,:answr,:ord,:type
    do
      begin
        insert into ETYPESPECIAL
          (ETYPE_ID,CMD,ANSWR,ORD,REGTYPE)
         values
          (:new_id,:cmd,:answr,:ord,:type);
      end
end^
SET TERM ; ^
这是我用C++编写的代码:

StoredProc_InsertEType->ParamByName("E_ID")->AsInteger = src_id;
StoredProc_InsertEType->ParamByName("E_NAME")->AsString = _name;
try
{
 StoredProc_InsertEType->ExecProc();
 new_id = StoredProc_InsertEType->ParamByName(L"NEW_ID")->AsInteger;
}
catch(EDBEngineError & e)
{
 errors->Add(e.Message);
 return false;
}
不管表ETYPE是否为空,变量new_id始终为零。当我从管理工具运行命令
从ETYPE中选择MAX(ID)
时,它返回正确的数字(~180)。如何获得新的\u ID参数的正确值?

您需要添加

suspend;
在您的sp中

和查询

select * from your_sp
暂停解释


关于,

我只需要返回一个值。在我看来,在返回值数组时使用suspend关键字。除此之外,在我的其他存储过程中,不需要使用suspend关键字。suspend;返回过程中定义的一行变量。如果您在一个周期内(例如,while)调用它,您将得到“一个值数组”;)如何定义输入参数?谢谢!我对此非常恼火,我看到的所有示例都没有提到
suspend
返回单个值,只返回多行…在Firebird中,使用SELECT MAX(ID)获取最高生成ID不是一个好方法,因为MVCC架构可以为您提供一个已经使用的ID。改用生成器。如果将ETYPE中除
select max(ID)之外的所有内容删除为:new_ID?它是否返回new_id的值?@Mark:I始终为零:-(。如果直接执行程序(例如从ISQL或Flamerobin(例如
execute PROCEDURE INSERT_ETYPE(您的参数)
),会发生什么情况?)?