Explication détaillée de l'accès PHP aux procédures stockées Oracle

怪我咯
Libérer: 2023-03-13 11:32:02
original
1655 Les gens l'ont consulté

Cet article présente principalement les informations pertinentes sur l'accès à PHP à la procédure stockée avec des exemples détaillés. Voici l'exemple de code pour vous aider à réaliser une telle fonction. Les amis qui en ont besoin peuvent s'y référer

.

Explication détaillée de l'accès de PHP aux instances de procédure stockée Oracle

Par exemple, ma base de données Oracle locale contient un package contenant une procédure stockée :

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;
Copier après la connexion


Le nom du package est PKG_TRANS_REL et la procédure stockée est pro_GC_withdraw. Cette procédure stockée a quatre paramètres, deux paramètres d'entrée et deux paramètres de sortie.

Exemple d'appel via pdo en PHP :


  $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;
    }

    ...
Copier après la connexion

Le troisième paramètre de bindParam est par défaut PDO::PARAM_STR, s'il l'est Pour les autres types, vous devez spécifier

Paramètre d'entréeValeur de passage est relativement simple, tandis que le paramètre sortant est un peu plus compliqué, et vous devez préciser la longueur.

Le programme php peut accéder à la base de données en en utilisant des procédures stockées Certaines personnes pensent que l'utilisation de procédures stockées est plus facile à maintenir. Cependant, les gens bienveillants ont des avis différents. Sur cette question, je pense que l'utilisation de procédures stockées signifie que le DBA et les développeurs doivent coopérer plus étroitement. Si l'une d'entre elles change, elle sera évidemment difficile à maintenir.

Mais l'utilisation de procédures stockées présente au moins deux des avantages les plus évidents : la rapidité et l'efficacité. L'utilisation de procédures stockées est évidemment plus rapide. En termes d'efficacité, si une application doit effectuer une série d'opérations SQL en même temps, elle doit faire des allers-retours entre PHP et Oracle. Il est préférable de mettre l'application directement dans la base de données pour réduire le nombre d'allers-retours. et accroître l'efficacité. Mais dans les applications Internet, la vitesse est extrêmement importante, il est donc nécessaire d'utiliser des procédures stockées. J'ai également utilisé PHP pour appeler des procédures stockées il n'y a pas longtemps et j'ai réalisé l'exemple suivant.

code

//建立一个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;
Copier après la connexion

code 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>"; 
  ?>
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!