[英]Oracle Stored Procedure call by 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问题。
if (oci_execute($stmt)) {
exit("Procedure Failed.");
}
因此,您的逻辑是:如果执行成功,那么过程失败了?
只需替换为:
if (!oci_execute($stmt)) {
exit("Procedure Failed.");
}
这个例子对我有用:
要求:具有Oracle支持的Pear MDB2
此示例演示如何使用MDB2框架,使用参数为IN,OUT,IN OUT的存储过程从php运行oracle程序包,并通过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 ----"
经过测试:
当我使用某些回显进行调试以打印某些变量的内容时,它神奇地起作用了。
这些天我肯定要杀死SysAdmin。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.