简体   繁体   English

使用输入和输出参数从PHP调用Oracle存储过程

[英]Call Oracle Stored Procedure from PHP with input and output Parameters

Im trying to implement an easy Stored Procedure into PHP. 我试图在PHP中实现一个简单的存储过程。 Im using Oracle SQL and I have to use PDO for connection to the database. 我正在使用Oracle SQL,并且必须使用PDO来连接数据库。

The Procedure looks like this: 该过程如下所示:

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;

In PHP, it looks like this: 在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();    

Unfortunately that doesnt work. 不幸的是,这不起作用。 The error message im getting is: 我收到的错误消息是:

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

I tried different methods and approaches but cant get it to work. 我尝试了不同的方法和方法,但无法使其正常工作。 Thanks for any help! 谢谢你的帮助!

  • $a and $b need to be actual values $ a和$ b必须为实际值
  • you need to remove the quotes around the date in the SQL statement 您需要删除SQL语句中日期前后的引号
  • PDO needs a size set for the out bound bind variable PDO需要为出站绑定变量设置大小

With this SQL: 使用此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;
/

You can use: 您可以使用:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM