2016-11-01 88 views
0

調用firebird存儲過程我有一個返回字符串的firebird存儲過程sp_clinic_id。它編譯和執行得很好。 Sp有一個暫停在它的身體。無法從php

所以我用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->準備在返回false。

錯誤是「動態Sql錯誤-104。令牌未知」。由於該過程在firebird中編譯並執行得很好,所以我不明白爲什麼我會收到Dynamic 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; 
+0

'stmt'是否有'open'方法?如果是,那麼使用它來代替'execute'。 – ain

+0

謝謝。我會嘗試打開。但這並沒有進展到這一點。準備失敗。 –

+0

您可以顯示存儲過程的定義嗎? –

回答

0

Calling a stored procedure with an output parameter

If the database driver supports it, you may also bind parameters for output as well as input. Output parameters are typically used to retrieve values from stored procedures. Output parameters are slightly more complex to use than input parameters, in that you must know how large a given parameter might be when you bind it. If the value turns out to be larger than the size you suggested, an error is raised.

Example #4 Calling a stored procedure with an output parameter

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

我嘗試使用沒有括號。但是現在,錯誤是Array([0] => HY000 [1] => -204 [2] =>動態SQL錯誤SQL錯誤代碼= -204表未知SP_CLINIC_ID在第1行第18列) 致命錯誤:成員函數execute()布爾型 –

+0

我試過了?佔位符。現在的錯誤是:Array([0] => HY000 [1] => -204 [2] =>動態SQL錯誤SQL錯誤代碼= -204過程未知SP_CLINIC_ID在第1行第18列) 致命錯誤:一個成員函數execute()布爾型 –

+0

好的。我改變了我的答案。 –

1

返回參數的名稱是MAXID沒有out1在你的發言,所以儘量

$sqlproc = "select MAXID from SP_CLINIC_ID"; 
+0

ain,我試過了。現在的錯誤是:Array([0] => HY000 [1] => -204 [2] =>動態SQL錯誤SQL錯誤代碼= -204表未知SP_CLINIC_ID在第1行第19列) 致命錯誤:在布爾型 –

+0

上執行成員函數execute()嘗試使用'PDO-> query(「從SP_CLINIC_ID選擇MAXID」);'做出任何改變,即不要使用準備好的語句。 – ain

+0

這是相同的-204表未知錯誤。如果我使用括號,它是-104令牌未知錯誤 –

0

當我試圖安裝火鳥並檢查,何時我正在給沒有PAGE_SIZE我收到錯誤像下面

動態SQL錯誤 - 錯誤代碼104

創建數據庫 'F:\ firebird_db \ test.fdb' PAGE_SIZE 8192; //沒有錯誤

CREATE DATABASE'f:\ firebird_db \ test1.fdb'; //給出錯誤

user'SYSDBA'password'masterkey';

我有一個澄清,你可以操縱其他數據庫操作,如簡單地從表中獲取行,等,enter image description here

所以固定的頁面大小可以幫助你,

0

你有兩個問題:

  1. 如果過程不期望任何參數,那麼Yous SQL語句應該在過程名後面沒有括號。

  2. 您的過程返回MAXID參數,但您要求輸出OUT1。

因此,調整後的聲明將是:select maxid from sp_clinic_id

一個好主意是嘗試在SQL工具首先語句PHP推動他們面前。