不能从php调用firebird存储过程

时间:2016-11-01 10:26:51

标签: php stored-procedures pdo firebird

我有一个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;

4 个答案:

答案 0 :(得分:1)

返回参数的名称为MAXID而非out1,如您的对帐单所示,请尝试

$sqlproc = "select MAXID from SP_CLINIC_ID";

答案 1 :(得分:1)

您有两个问题:

  1. 如果程序不需要任何参数,那么在程序名称后,Yous SQL语句应该没有括号。

  2. 您的程序返回MAXID参数,但您要求OUT1。

  3. 因此,调整后的陈述将是:select maxid from sp_clinic_id

    一个好主意是在用PHP推送它们之前先尝试SQL工具中的第一个语句。

答案 2 :(得分:0)

Calling a stored procedure with an output parameter

  

如果数据库驱动程序支持,您还可以绑定参数   输出和输入。输出参数通常用于   从存储过程中检索值。输出参数略有不同   使用比输入参数更复杂,因为你必须知道如何   绑定时,给定的参数可能很大。如果值变了   如果大于你建议的大小,则会出现错误。

     

示例#4使用输出参数

调用存储过程
<?php
 $stmt = $dbh->prepare("CALL sp_returns_string(?)");
 $stmt->bindParam(1, $return_value, PDO::PARAM_STR, 4000); 

 // call the stored procedure $stmt->execute();

 print "procedure returned $return_value\n"; ?>

答案 3 :(得分:0)

当我尝试安装firebird并检查时,当我在没有page_size的情况下给出时,我收到的错误如下所示

动态SQL错误 - 错误代码104

创建数据库&#39; f:\ firebird_db \ test.fdb&#39; page_size 8192; //没有错误

创建数据库&#39; f:\ firebird_db \ test1.fdb&#39 ;; //给出错误

用户&#39; SYSDBA&#39;密码&#39; masterkey&#39;;

我有一个澄清,你可以操纵其他数据库操作,比如简单地从表中获取行等,enter image description here

因此,修复页面大小可以帮助您,