我正在为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。
该如何解决?
答案 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 procedures和its procedural SQL language上的Firebird文档。