2010-07-09 116 views
0

下面的代码:Oracle存储过程调用由PHP

<?php 
include_once 'config.php'; 

// Connect to database 
$conn = oci_connect($dbuser, $dbpasswd, $dbhost."/".$dbname); 
if (!$conn) { 
    exit ("Connection failed."); 
} 

$id = isset($_GET['id']) ? (int)$_GET['id'] : false; 
$type = isset($_GET['type']) ? strtoupper($_GET['type']) : "BLOG"; 

$stmt = oci_parse($conn, 
    "begin 
    PKG_LIKE.get_LikeId(
    :I_N_Id, 
    :I_S_Type, 
    :O_N_grade, 
    :O_N_exitFlag, 
    :O_S_exitMsg); 
    end;"); 

oci_bind_by_name($stmt, "I_N_Id", $id); 
oci_bind_by_name($stmt, "I_S_Type", $type); 
oci_bind_by_name($stmt, "O_N_grade", $total); 
oci_bind_by_name($stmt, "O_N_exitFlag", $flag); 
oci_bind_by_name($stmt, "O_S_exitMsg", $message); 

if (!oci_execute($stmt)) { 
    exit("Procedure Failed."); 
} 

if ($message == 'OK') { 
    $response = array('likeit' => $total); 
    $toReturn = "var response=".json_encode($response)."; showTotalLikeit(response);"; 
} else { 
    $response = array('likeit' => 'NaN', 'exitFlag' => $flag, 'exitMsg' => $message); 
    $toReturn = "var response=".json_encode($response)."; showTotalLikeit(response);"; 
} 

print $toReturn; 

结果是 “过程失败”。我在哪里失败? 我刚刚使用了一个存储过程调用(但将光标作为输出)直到现在,一切都很好。

在Oracle上启动SP工作正常,所以这是一个PHP问题。

+0

如果我是你,我会chec如果可能,请将PHP的'PDO'扩展(http://php.net/manual/en/book.pdo.php),因为它支持Oracle数据库并调用存储过程。 – 2010-07-09 11:01:13

+0

我一定会看看它,但没有理由代码不起作用? 完全相同的“模板”代码与其他SP在同一数据库上一起使用,并且工作正常: – theCrius 2010-07-09 15:10:25

回答

0

奇妙的是它的工作原理,而我是使用一些回声打印一些变量的内容调试。

我相信我必须为这些日子杀死一个SysAdmin而浪费。

2
if (oci_execute($stmt)) { 
    exit("Procedure Failed."); 
} 

所以,你的逻辑是:如果执行成功,那么程序失败?

只需更换有:

if (!oci_execute($stmt)) { 
    exit("Procedure Failed."); 
} 
+0

...我需要睡觉。 无论如何现在页面打印正确“程序失败”... 那么,怎么了?^^ (要编辑问题) – theCrius 2010-07-09 10:41:34

+0

我无法复制,因为我在这里没有Oracle,但是您能否尝试查看oci_bind_by_name是否返回true或false? – 2010-07-09 11:09:21

+0

检查: 全部为TRUE。 和oci_parse,返回资源ID。 – theCrius 2010-07-09 12:50:01

0

这对我来说例如工作:

Reqirements: 梨MDB2与Oracle支持

此示例展示了如何使用MDB2框架从运行PHP的Oracle包,使用带参数的存储过程IN,OUT ,IN OUT并通过php变量返回结果。

参考文献:

PHP代码:

$in = "IN"; 
$out = "OUT"; 
$io = "INOUT"; 
// to show vars after 
var_dump("{$in}::{$out}::{$io}"); 
// 
$sql = "BEGIN PKG_TEST.MyProcedure(:iparm, :oparm, :ioparm); END;"; 
$sth = $mdb2->prepare($sql); 
// 
$sth->bindParam('iparm', $in, 'text', 20); 
$sth->bindParam('oparm', $out, 'text', 20); 
$sth->bindParam('ioparm', $io, 'text', 20); 
// 
$res = $sth->execute(); 
// 
if (PEAR::isError($res)) { 
    var_dump($res->userinfo); 
}else{ 
    $sth->free(); 
} 
// to show vars before 
var_dump("{$in}::{$out}::{$io}"); 

Oracle包定义

CREATE OR REPLACE PACKAGE PKG_TEST AS 

    PROCEDURE MyProcedure(P1 IN VARCHAR2, P2 OUT VARCHAR2, P3 IN OUT VARCHAR2); 

END PKG_TEST; 

CREATE OR REPLACE PACKAGE BODY PKG_TEST IS 

    PROCEDURE MyProcedure(P1 IN VARCHAR2, P2 OUT VARCHAR2, P3 IN OUT VARCHAR2) 
    IS 
    BEGIN 
    P2 := P1 || '---- OUT ----'; 
    P3 := P1 || '---- IN OUT ----'; 
    END MyProcedure; 

END PKG_TEST; 

的屏幕截图回报:

string(14) "IN::OUT::INOUT" 
string(39) "IN::IN---- OUT ----::IN---- IN OUT ----" 

测试过:

  • Oracle 10g中,11G
  • 的Linux(Ubuntu的服务器,亚马逊EC2)&窗口XAMMP 1.7.4
  • PHP 5.3.x