這篇文章主要介紹了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>"; ?>