【问题标题】:cannot call firebird stored procedure from php无法从 php 调用 firebird 存储过程
【发布时间】: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;

【问题讨论】:

  • stmtopen 方法吗?如果是,则使用它而不是 execute
  • 谢谢。我会尝试打开。但它并没有发展到那个地步。准备失败。
  • 你能显示存储过程的定义吗?
  • 我认为问题不在程序上。如果从 SQL 执行,则应不带括号,如 select out1 from SP_CLINIC_ID。我认为问题出在 PHP prepare.

标签: php stored-procedures pdo firebird


【解决方案1】:

返回参数的名称是MAXID 而不是out1 就像你的语句中那样,所以试试

$sqlproc = "select MAXID from SP_CLINIC_ID";

【讨论】:

  • 嗯,我试过了。现在错误是: Array ( [0] => HY000 [1] => -204 [2] => Dynamic SQL Error SQL error code = -204 Table unknown SP_CLINIC_ID At line 1, column 19 ) 致命错误:调用成员函数 execute() on boolean
  • 尝试使用PDO-&gt;query("select MAXID from SP_CLINIC_ID"); 有什么不同,即这次不要使用准备好的语句。
  • 同样是-204 Table Unknown错误。如果我使用括号,它是-104 Token Unknown error
【解决方案2】:

你有两个问题:

  1. 如果过程不需要任何参数,您的 SQL 语句应该在过程名称后不带括号。

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

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

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

【讨论】:

    【解决方案3】:

    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"; ?>
    

    【讨论】:

    • 我尝试使用不带括号的。但是现在,错误是 Array ( [0] => HY000 [1] => -204 [2] => Dynamic SQL Error SQL error code = -204 Table unknown SP_CLINIC_ID At line 1, column 18 ) 致命错误:调用一个成员函数 execute() on boolean
    • 我试过了?占位符。现在的错误是:Array ( [0] => HY000 [1] => -204 [2] => Dynamic SQL Error SQL error code = -204 Procedure unknown SP_CLINIC_ID At line 1, column 18 ) 致命错误: Call to a成员函数 execute() on boolean
    • 好的。我改变了答案。
    • 有人可以帮我解决这个问题吗?我被困住了。我无法准备工作。
    • @SLakshmi 显示你的存储过程的代码,现在我们不知道它的签名到底是什么。
    【解决方案4】:

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

    动态 SQL 错误 - 错误代码 104

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

    创建数据库'f:\firebird_db\test1.fdb'; //报错

    用户'SYSDBA'密码'masterkey';

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

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

    【讨论】:

    • 可以复制所有文字并粘贴到这里的请不要粘贴图片。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-05
    • 1970-01-01
    相关资源
    最近更新 更多