[英]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! 谢谢你的帮助!
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.