无法在SQL Manager Lite中创建新过程

时间:2019-01-13 00:20:07

标签: sql firebird

我正在为Interbase / Firebird应用程序使用SQL Manager lite。我已经下载了firebird数据库,已成功连接到该数据库及其主机,但是现在我想创建过程。

我无法通过教程完成操作,因此我决定只单击New-> Procedure并自动执行。但是这样做,我仍然有错误。

我的代码没有单击“新建”->“程序”就尝试了以下内容:

CREATE PROCEDURE MyProc
AS
  SELECT M_DOKUMENTY.NDZIEN FROM M_DOKUMENTY WHERE M_DOKUMENTY.SRODZAJ = '1234'
GO;

使用“新建”->“程序”向导生成的代码:

CREATE PROCEDURE SHOW_ALL
AS
BEGIN
  /* Procedure body */
  SELECT 
    M_DOKUMENTY.NDZIEN,
    M_DOKUMENTY.CKIERUNEK,
    M_DOKUMENTY.CMEDIUM FROM M_DOKUMENTY WHERE M_DOKUMENTY.SRODZAJ = '1234'
  SUSPEND;
END;

但是当我单击该闪电图标(编译)时,它会抱怨错误:

  

动态SQL错误。

     

SQL错误代码= -104。

     

令牌未知-第9行,第3列。

     

SUSPEND。

该如何解决?

Screenshot of error in SQL Manager lite

1 个答案:

答案 0 :(得分:0)

问题是您的语法错误。您需要定义输出参数,并且需要使用select ... into <list of variables>选择单个行,或者使用for select ... into <list of variables> do来循环多个行。

您的存储过程应类似于:

CREATE PROCEDURE SHOW_ALL
  RETURNS (NDZIEN varchar(50), CKIERUNEK varchar(50), CMEDIUM varchar(50))
AS
BEGIN
  /* Procedure body */
  for SELECT 
        M_DOKUMENTY.NDZIEN,
        M_DOKUMENTY.CKIERUNEK,
        M_DOKUMENTY.CMEDIUM 
      FROM M_DOKUMENTY 
      WHERE M_DOKUMENTY.SRODZAJ = '1234'
      into :NDZIEN, :CKIERUNEK, :CMEDIUM 
  do
    SUSPEND;
END

如果您的选择仅产生一行,那么您也可以考虑使用

CREATE PROCEDURE SHOW_ALL
  RETURNS (NDZIEN varchar(50), CKIERUNEK varchar(50), CMEDIUM varchar(50))
AS
BEGIN
  /* Procedure body */
  SELECT 
      M_DOKUMENTY.NDZIEN,
      M_DOKUMENTY.CKIERUNEK,
      M_DOKUMENTY.CMEDIUM 
    FROM M_DOKUMENTY 
    WHERE M_DOKUMENTY.SRODZAJ = '1234'
    into :NDZIEN, :CKIERUNEK, :CMEDIUM;
  SUSPEND;
END

;子句之后注意into。在这种情况下,您也可以省略SUSPEND;。这将使存储过程可执行,而不是可选的。根据您的使用方式,这可能是一个更好的选择。

有关更多信息,请参见created stored proceduresits procedural SQL language上的Firebird文档。