ホームページ  >  記事  >  バックエンド開発  >  Oracle ストアド プロシージャへの PHP アクセスの詳細な説明

Oracle ストアド プロシージャへの PHP アクセスの詳細な説明

怪我咯
怪我咯オリジナル
2017-07-10 12:01:191661ブラウズ

この記事では、主に 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 つの出力パラメータ。

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 3 番目のパラメータは、デフォルトで PDO::PARAM_STR になります。

other

type の場合は、指定する必要があります入力パラメータ

値を渡す

は比較的単純ですが、パラメータの抽出は少し複雑で、長さを指定する必要があります 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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。