存储过程很高端、大气、上档次,对于存储过程我一向的观点是支持使用,必竟我们追求数据存储的“速度和效率”,Oracle作为超专业级的数据库服务引擎,在效率上,如果一次需要做一系列SQL操作,则需要往返于PHP与ORACLE之间,不如把操作直接放到数据库,这样有效减少往返次数,增加效率。为了能让想了解存储过程的朋友便于理解,写了下面这个例子,先来看如何建立数据表和存储过程:
01 | //在Oracle中建立一个供测试的数据表 |
02 | CREATE TABLE TEST ( |
03 | ID NUMBER(16) NOT NULL , |
04 | NAME VARCHAR2(30) NOT NULL , |
05 | PRIMARY KEY (ID) |
06 | ); |
07 | //插入一条数据 |
08 | INSERT INTO TEST VALUES (5, 'PHP_BOOK' ); |
09 | //建立一个存储过程 |
10 | CREATE OR REPLACE PROCEDURE PROC_TEST ( |
11 | p_id IN OUT NUMBER, |
12 | p_name OUT VARCHAR2 |
13 | ) AS |
14 | BEGIN |
15 | SELECT NAME INTO p_name |
16 | FROM TEST |
17 | WHERE ID = 5; |
18 | END PROC_TEST; |
在PHP中调用,不多费话了,代码里都有注释的,聪明的你相信会看懂:
01 | <?php |
02 | //建立数据库连接 |
03 | $user = "test" ; //数据库用户名 |
04 | $password = "test" ; //密码 |
05 | $conn_str = "tnsname" ; //连接串(cstr : Connection_STRing) |
06 | $remote = true //是否远程连接 |
07 | if ( $remote ) { |
08 | $conn = OCILogon( $user , $password , $conn_str ); |
09 | } |
10 | else { |
11 | $conn = OCILogon( $user , $password ); |
12 | } |
13 | //设置绑定 |
14 | $id = 5; //准备绑定的php变量 id |
15 | $name = "" ; //准备绑定的php变量名 |
16 | /* 调用存储过程的sql语句(sql_sp : SQL_StoreProcedure) |
17 | * 语法: |
18 | * BEGIN 存储过程名([[:]参数]); END; |
19 | * 加上冒号表示该参数是一个位置 |
20 | */ |
21 | $sql_sp = "BEGIN PROC_TEST(:id, :name); END;" ; |
22 | $stmt = OCIParse( $conn , $sql_sp ); |
23 | //执行绑定 |
24 | OCIBindByName( $stmt , ":id" , $id , 16); //参数说明:绑定php变量$id到位置:id,并设定绑定长度16位 |
25 | OCIBindByName( $stmt , ":name" , $name , 30); |
26 | OCIExecute( $stmt ); |
27 | //结果 |
28 | echo "name is : $name<br>" ; |
29 | ?> |
更多文章阅读=============================================================================================