Вызов хранимой процедуры Oracle с помощью PHP - PullRequest
0 голосов
/ 09 июля 2010

Здесь код:

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

Результат - «Ошибка процедуры».Где я терплю неудачу?Я только что использовал вызов хранимой процедуры (но с курсорами в качестве вывода) до сих пор, и все было хорошо.

Запуск SP на Oracle работает нормально, так что это проблема php.

Ответы [ 3 ]

2 голосов
/ 09 июля 2010
if (oci_execute($stmt)) {
    exit("Procedure Failed.");
}

Итак, ваша логика такова: если выполнение выполнено успешно, то процедура не удалась?

Просто замените на:

if (!oci_execute($stmt)) {
   exit("Procedure Failed.");
}
0 голосов
/ 29 августа 2013

Этот пример работает для меня:

Reqirements: Груша MDB2 с поддержкой оракула

В этом примере показано, как запустить пакет Oracle из php с использованием среды MDB2, используя процедуру сохранения с параметрами 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, Amazon EC2) и windows xammp 1.7.4
  • php 5.3.x
0 голосов
/ 10 июля 2010

Волшебным образом это работает, когда я отлаживал, используя некоторое эхо для печати содержимого некоторых переменных.

Я уверен, что мне нужно убить SysAdmin за эти дни впустую.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...