首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >无法从php调用firebird存储过程

无法从php调用firebird存储过程
EN

Stack Overflow用户
提问于 2016-11-01 18:26:51
回答 4查看 1.2K关注 0票数 0

我有一个返回字符串的firebird存储过程sp_clinic_id。它可以很好地编译和执行。Sp的身体里有一个悬浮物。

因此,我使用select out1 from sp_clinic_id()从php pdo中调用该过程。

代码如下:

代码语言:javascript
运行
复制
$sqlproc = "select out1 from SP_CLINIC_ID()";

// execute the stored procedure
$stmt = $pdo->prepare($sqlproc);
$stmt->execute();

pdo->prepare返回的不是准备好的语句,而是false。

错误是"Dynamic Sql error -104.Token Unknown“。由于该过程可以在firebird中正常编译和执行,因此我无法理解为什么会出现动态Sql错误。

下面是存储过程的定义:

代码语言:javascript
运行
复制
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;
EN

回答 4

Stack Overflow用户

发布于 2016-11-02 18:04:46

返回参数的名称是MAXID,而不是语句中的out1,因此请尝试

代码语言:javascript
运行
复制
$sqlproc = "select MAXID from SP_CLINIC_ID";
票数 1
EN

Stack Overflow用户

发布于 2017-09-19 19:43:37

您有两个问题:

如果过程不期望任何parameters.

  • Your过程返回MAXID参数,但您要求返回OUT1,则
  1. 您的SQL语句应该在过程名后不带括号。

因此,调整后的语句将为:select maxid from sp_clinic_id

一个好主意是先在SQL工具中尝试语句,然后再在PHP中推送它们。

票数 1
EN

Stack Overflow用户

发布于 2016-11-01 19:23:57

如果数据库驱动程序支持,您还可以绑定输出和输入的参数。输出参数通常用于从存储过程中检索值。输出参数的使用比输入参数稍微复杂一些,因为在绑定给定参数时,您必须知道该参数可能有多大。如果该值大于您建议的大小,则会引发错误。

示例#4使用输出参数调用存储过程

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40358203

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档