$tns = "(DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 'ip')(PORT = '端口')) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = 'ORCL') ))"; try { $conn = new \PDO("oci:dbname=" . $tns . ";charset=utf8", '用户名', '密码'); $conn->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION); $conn->setAttribute(\PDO::ATTR_CASE,\PDO::CASE_NATURAL); //下面是没有返回值的存储过程调用 $conn->prepare("call db.func(?,to_date(?,'YYYY-MM-DD hh24:mi:ss'))"); $state->bindParam(1,$var1); $state->bindParam(2,$var2); //下面是有返回值的存储过程调用,第一个参数是输入的,第二个参数是存储过程返回的 $conn->prepare("call db.func(?,?)"); $state->bindParam(1,$var1); $state->bindParam(2,$var2,\PDO::PARAM_INPUT_OUTPUT,20); $state->execute(); } catch(PDOException $e) { echo "ODBC异常: ".$e->getMessage(); exit(); }
主要主要两点:
1,时间格式参数,要用to_date转换
2,当有返回值的时候 $state->bindParam(2,$var2,\PDO::PARAM_INPUT_OUTPUT,20); 这一行最后的长度参数 必须要有,表示返回值最大长度,否则会报如下错误:
General error: 3131 OCIStmtExecute: ORA-03131: 提供了下一段的无效缓冲区