代码之家  ›  专栏  ›  技术社区  ›  Claudio

PHP调用Oracle存储过程

  •  0
  • Claudio  · 技术社区  · 14 年前

    代码如下:

    <?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问题。

    3 回复  |  直到 9 年前
        1
  •  2
  •   Narcis Radu    14 年前
    if (oci_execute($stmt)) {
        exit("Procedure Failed.");
    }
    

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

    if (!oci_execute($stmt)) {
       exit("Procedure Failed.");
    }
    
        2
  •  0
  •   Claudio    14 年前

    神奇的是,它在我调试时工作,使用一些echo打印一些变量的内容。

    我肯定这几天我得杀了一个系统管理员。

        3
  •  0
  •   Luis Morales    11 年前

    这个例子对我很有用:

    要求: 支持oracle的Pear MDB2

    此示例演示如何使用MDB2框架从php运行oracle包,使用带有参数IN、OUT、IN OUT的存储过程,并通过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
    • php 5.3.x版