2016-12-05 194 views
0

我試圖在PHP中實現一個簡單的存儲過程。 即時通訊使用Oracle SQL,我必須使用PDO連接到數據庫。使用輸入和輸出參數從PHP調用Oracle存儲過程

的過程是這樣的:

create or replace 
PROCEDURE RABATTPROZEDUR 
(
    VAR_KUNDE IN NUMBER 
, VAR_RABATT IN NUMBER 
, VAR_DATUM IN DATE 
, ERGEBNIS OUT NUMBER 
) AS 
var_volumenBegin NUMBER := 0; 
var_volumenEnd NUMBER := 0; 

BEGIN 


Select SUM(TOTALPRICE) into var_volumenBegin From Orderposition Where Ordid IN (Select Ordid From Orders Where Custid = var_kunde); 

Update Orderposition Set TOTALPRICE = (TOTALPRICE * (100 - var_rabatt)/100) Where Ordid IN(Select Ordid From Orders Where Custid = var_kunde And Orderdate >= var_datum); 

Select SUM(TOTALPRICE) into var_volumenEnd From Orderposition Where Ordid IN (Select Ordid From Orders Where Custid = var_kunde); 

ergebnis := var_volumenBegin-var_volumenEnd; 

END RABATTPROZEDUR; 

在PHP中,它看起來像這樣:

$ergebnis = 0; 
        $a= ':cid'; 
        $b= ':percent'; 

        $stmt = $conn->prepare("CALL rabattprozedur(:var_kunde,:var_rabatt,to_date(':var_datum'),:ergebnis)"); 
        $stmt->bindParam(':var_kunde',$a,PDO::PARAM_INT); 
        $stmt->bindParam(':var_rabatt',$b,PDO::PARAM_INT); 
        $stmt->bindParam(':var_datum',$date,PDO::PARAM_STR,10); 
        $stmt->bindParam(':ergebnis',$ergebnis,PDO::PARAM_INT|PDO::PARAM_INPUT_OUTPUT); 

        //$stmt->bindParam($a = ':cid',$b = ':percent',$date,$ergebnis); 
        $stmt->debugDumpParams(); 
        $stmt->execute();  

不幸的是,這並不工作。我得到的錯誤消息是:

SQLSTATE[HY000]: General error: 1722 OCIStmtExecute: ORA-01722: invalid number (ext\pdo_oci\oci_statement.c:148) 

我試過不同的方法和方法,但不能得到它的工作。 感謝您的幫助!

+0

你能確定日期格式嗎? –

+0

使用日期('Y-m-d H:i:s',strtotime($ date));而不是$日期 –

+0

@ujash喬希:感謝您的快速答案,但它仍然無法正常工作,我仍然得到相同的錯誤 –

回答

0
  • $ a和$ b必須是實際值
  • 您需要刪除周圍的日期引號中的SQL語句
  • PDO需要一個尺寸約束了設置綁定變量

有了這個SQL:

create or replace PROCEDURE RABATTPROZEDUR 
(
    VAR_KUNDE IN NUMBER 
    , VAR_RABATT IN NUMBER 
    , VAR_DATUM IN DATE 
    , ERGEBNIS OUT NUMBER 
) AS 
BEGIN 
    ERGEBNIS := VAR_KUNDE - (VAR_RABATT * VAR_KUNDE/100); 
END RABATTPROZEDUR; 
/

您可以使用:

<?php 

try { 
    $conn = new PDO('oci:dbname=localhost/orcl', 'cj', 'cj'); 
} 
catch (PDOException $e) { 
    echo 'Connection failed: ' . $e->getMessage(); 
    exit; 
} 

$conn->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); 

$ergebnis = 0; 

// $a and $b must be the PHP data values 
$a = 100; 
$b = 1; 

$date = '17-JAN-2017'; 

// Remove quotes around :var_datum 
$stmt = $conn->prepare("CALL rabattprozedur(:var_kunde,:var_rabatt,to_date(:var_datum),:ergebnis)"); 
$stmt->bindParam(':var_kunde',$a,PDO::PARAM_INT); 
$stmt->bindParam(':var_rabatt',$b,PDO::PARAM_INT); 
$stmt->bindParam(':var_datum',$date,PDO::PARAM_STR,10); 
// Set a length for the outbind 
$stmt->bindParam(':ergebnis',$ergebnis,PDO::PARAM_INT|PDO::PARAM_INPUT_OUTPUT, 40); 
$stmt->debugDumpParams(); 
$stmt->execute(); 

echo "Output param is: $ergebnis\n"; 
相關問題