Maison >développement back-end >tutoriel php >Explication détaillée de l'accès PHP aux procédures stockées Oracle
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;
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; } ...
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;
<?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>"; ?>
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!