【发布时间】:2016-11-01 10:26:50
【问题描述】:
我有一个返回字符串的 firebird 存储过程 sp_clinic_id。它编译并执行良好。 Sp 在其体内有一个暂停。
所以我用select out1 from sp_clinic_id()从php pdo调用过程。
代码如下:
$sqlproc = "select out1 from SP_CLINIC_ID()";
// execute the stored procedure
$stmt = $pdo->prepare($sqlproc);
$stmt->execute();
pdo->prepare 不是返回一个准备好的语句,而是返回 false。
错误是“动态 Sql 错误 -104。令牌未知”。由于该过程在 firebird 中编译和执行良好,我无法理解为什么会出现动态 Sql 错误。
这里是存储过程的定义:
CREATE PROCEDURE SP_CLINIC_ID
RETURNS(
MAXID VARCHAR(10))
AS
DECLARE VARIABLE temp_char CHAR(10);
DECLARE VARIABLE temp_id INTEGER;
BEGIN
/* Procedure body */
select MAX(CLINIC_id) from COVER_SHEET into MAXID;
select SUBSTRING(:MAXID from 4 for CHAR_LENGTH(:MAXID))
from rdb$database into temp_char ;
select cast(:temp_char as NUMERIC) from rdb$database into temp_id;
temp_id = temp_id + 1;
if ( temp_id < 10) THEN
BEGIN
maxid = 'REG000000'|| temp_id;
END
else if ( temp_id < 100) THEN
begin
maxid = 'REG00000'|| temp_id;
end
else if ( temp_id < 1000) THEN
begin
maxid = 'REG0000'|| temp_id;
end
else if ( temp_id < 10000) THEN
begin
maxid = 'REG000'|| temp_id;
end
ELSE if ( temp_id < 100000 ) THEN
begin
maxid = 'REG00'|| temp_id;
end
ELSE if ( temp_id < 1000000) THEN
begin
maxid = 'REG0'|| temp_id;
end
ELSE if ( temp_id < 10000000) THEN
begin
maxid = 'REG'|| temp_id;
end
SUSPEND;
END;
【问题讨论】:
-
stmt有open方法吗?如果是,则使用它而不是execute。 -
谢谢。我会尝试打开。但它并没有发展到那个地步。准备失败。
-
你能显示存储过程的定义吗?
-
我认为问题不在程序上。如果从 SQL 执行,则应不带括号,如
select out1 from SP_CLINIC_ID。我认为问题出在 PHPprepare.
标签: php stored-procedures pdo firebird