php 存取oracle 預存程序詳解

怪我咯
發布: 2023-03-13 11:32:02
原創
1661 人瀏覽過

這篇文章主要介紹了php 存取oracle 預存程序實例詳解的相關資料,這裡附有實例程式碼,幫助大家實現這樣的功能,需要的朋友可以參考下

php 存取oracle 預存程序實例詳解

例如我的本機Oracle資料庫有一個package,裡面有一個預存程序:

create or replace package PKG_TRANS_REL is

 -- Author : test
 -- Created : 
 -- Purpose : test

 -- Public type declarations
 PKG_NAME varchar2(20) := 'PKG_TRANS_REL';
 --存储过程,测试用
 procedure pro_GC_withdraw(in_merch_no   in varchar2,
              in_withdraw_amt in number,
              out_result   out number,
              out_errmsg   out varchar2);
end PKG_TRANS_REL;
登入後複製


#套件名稱是PKG_TRANS_REL,預存程序是pro_GC_withdraw,這個預存程序有四個參數,兩個入參,兩個出參。

在PHP中透過pdo呼叫範例:


  $this->_pdo = new PDO(PDO_DB_DNS, PDO_DB_USER, PDO_DB_PASSWORD);
  $call = "CALL PKG_TRANS_REL.pro_GC_withdraw(?,?,?,?)";

  try{
      $stmt = $this->_pdo->prepare($call);

      $stmt->bindParam(1, $merch_no);
      $stmt->bindParam(2, $amount, PDO::PARAM_INT);

      $stmt->bindParam(3, $result, PDO::PARAM_INT, 4);
      $stmt->bindParam(4, $error_msg, PDO::PARAM_STR, 64);

      $stmt->execute();

    }catch (PDOException $e)
    {
      $msg = 'SQL:'.$e->getMessage();
      $msg = iconv('GBK','UTF-8',$msg);
      user_dump('SQL:'.$msg);
      return false;
    }

    ...
登入後複製

bindParam第三個參數預設是PDO::PARAM_STR,如果是其它類型就要指明

入參傳值比較簡​​單,出參稍微複雜些,要指明長度

php程式存取資料庫,完全可以使用預存程序,有人認為使用預存程序便於維護。不過仁者見仁,智者見智,在這個問題上,偶認為使用預存程序意味著必須要dba和開發人員更緊密配合,如果其中一方更變,則顯然難以維護。

但是使用預存程序至少有兩個最明顯的優點:速度和效率。使用預存程序的速度顯然更快。在效率上,如果應用一次需要做一系列sql操作,則需要往返php與oracle,不如把應用程式直接放到資料庫方以減少往返次數,增加效率。但是在internet應用程式上,速度是極度重要的,所以很有必要使用預存程序。偶也是使用php呼叫預存程序不久,做了下面這個列子。 

程式碼

//建立一个test表 
  create table test ( 
  id number(16) not null, 
  name varchar2(30) not null, 
  primary key (id) 
  ); 
  //插入一条数据 
  insert into test values (5, 'php_book'); 
  //建立一个存储过程 
  create or replace procedure proc_test ( 
  p_id in out number, 
  p_name out varchar2 
  ) as 
  begin 
  select name into p_name 
  from test 
  where id = 5; 
  end proc_test;
登入後複製

php程式碼  

<?php 
  //建立数据库连接 
  $user = "scott"; //数据库用户名 
  $password = "tiger"; //密码 
  $conn_str = "tnsname"; //连接串(cstr : connection_string) 
  $remote = true //是否远程连接 
  if ($remote) { 
  $conn = ocilogon($user, $password, $conn_str); 
  } 
  else { 
  $conn = ocilogon($user, $password); 
  } 
  //设定绑定 
  $id = 5; //准备用以绑定的php变量 id 
  $name = ""; //准备用以绑定的php变量 name 
  /** 调用存储过程的sql语句(sql_sp : sql_storeprocedure) 
  * 语法: 
  * begin 存储过程名([[:]参数]); end; 
  * 加上冒号表示该参数是一个位置 
  **/ 
  $sql_sp = "begin proc_test(:id, :name); end;"; 
  //parse 
  $stmt = ociparse($conn, $sql_sp); 
  //执行绑定 
  ocibindbyname($stmt, ":id", $id, 16); //参数说明:绑定php变量$id到位置:id,并设定绑定长度16位 
  ocibindbyname($stmt, ":name", $name, 30); 
  //execute 
  ociexecute($stmt); 
  //结果 
  echo "name is : $name<br>"; 
  ?>
登入後複製

以上是php 存取oracle 預存程序詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!