この記事では、主に php による oracle へのアクセス ストアド プロシージャ の詳細な例を紹介します。このような機能を実現するのに役立つサンプル コードを示します。
たとえば、私のローカル Oracle データベースにはストアド プロシージャが含まれるパッケージがあります。
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 という 4 つのパラメータ、2 つの入力パラメータ、および2 つの出力パラメータ。
$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 3 番目のパラメータは、デフォルトで PDO::PARAM_STR になります。
は比較的単純ですが、パラメータの抽出は少し複雑で、長さを指定する必要があります 。 php プログラムはストアド プロシージャを使用してデータベースにアクセスできます。ストアド プロシージャを使用する方が保守が簡単だと考える人もいます。ただし、この問題については、善意の人たちにもさまざまな意見があります。ストアド プロシージャを使用するということは、DBA と開発者がより緊密に協力する必要があることを意味し、どちらかが変更されると、明らかに保守が困難になると思います。
しかし、ストアド プロシージャを使用すると、速度と効率という最も明白な利点が少なくとも 2 つあります。ストアド プロシージャを使用した方が明らかに高速です。効率の観点から、アプリケーションが一連の SQL 操作を一度に実行する必要がある場合は、PHP と Oracle の間を往復する必要があります。往復の回数を減らすために、アプリケーションをデータベースに直接配置する方が良いでしょう。そして効率を高めます。ただし、インターネット アプリケーションでは速度が非常に重要であるため、ストアド プロシージャを使用する必要があります。私も少し前に 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>"; ?>
以上がOracle ストアド プロシージャへの PHP アクセスの詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。