显示标签为“oracle”的博文。显示所有博文
显示标签为“oracle”的博文。显示所有博文

2016年5月11日星期三

Linux 系统 PHP 连接 Oracle 出现 ORA-24408: could not generate unique server group name 解决方法



在 Linux 服务器上出现 "ORA-24408: could not generate unique server group name" 错误, 相同的代码在本地 Windows 没有问题。Google了一下,找到解决方法:

/etc/sysconfig/network 有 "HOSTNAME=netdisk7" 记录(netdisk7是设置的主机名,如果不存在则需要添加),然后 在 /etc/hosts 中添加 127.0.0.1  netdisk7,两个Hostname一定要一致, 如果修改了/etc/sysconfig/network 则需要执行 service network restart 生效。

# vi /etc/sysconfig/network



# vi /etc/hosts



参考来源:http://www.cnblogs.com/enjoycode/p/3542739.html

http://blog.csdn.net/geniuslinchao/article/details/22662917

2016年5月10日星期二

Oracle 怎样一次插入多条记录

Oracle 一次性插入多条记录跟 MYSQL 有很大不同。MYSQL  是这样的,但在 Oracle 中行不同。

INSERT INTO Persons (LastName, Address) VALUES ('Wilson', 'Champs-Elysees'),('Gates', 'Champs-Elysees')

Oracle 可以使用虚拟表 dual 一次插入多条记录。dual 在Oracle里有一个很奇特的“表”。可以利用这个Dual来做文章。

首先,你知道 select '1' from dual 是啥结果吗? 对了,结果就是返回1。

其次,你知道
select '1' from dual
union all
select '2' from dual

是啥结果吗? 对鸟,结果是

1
2

那么,最关键的地方来了,

insert into 表名 (字段1)
select '1' from dual
union all
select '2' from dual

那么这一次就插入了两条数据。当然,如果全字段插入 那个(字段1)还可以省略掉。
下面一个具体例子:

insert into doc_data (code,id,value,state)
        select '13','川A','成都市公安局交通警察支队车辆管理所',0 from dual
union all select '13','川B','绵阳市公安局交通警察支队车辆管理所',0 from dual
union all select '13','川C','自贡市公安局交通警察支队车辆管理所',0 from dual
union all select '13','川D','攀枝花市公安局交通警察支队车辆管理所',0 from dual

参考:Oracle使用虚拟表dual一次插入多条记录

PHP 连接 Oracle 出现中文乱码问题

数据库用 oracle,当 PHP连接 Oracle 的时候,如果指定字符集,会出现中文乱码。

查PHP手册,oci_pconnect  的第四个参数为 charset,只需设置这参数即可。

首先获取 Oracle 的字符集,运行“SELECT * FROM V$NLS_PARAMETERS;”,变量NLS_CHARACTERSET对应的就是我们需要的字符集,比如我这里就是 “AL32UTF8”。所以,最终的PHP代码为:


$conn = oci_pconnect('scott','tiger',
 "(DEscriptION=(ADDRESS=(PROTOCOL =TCP)(HOST=192.168.0.1)(PORT = 1521))(CONNECT_DATA =(SERVER = DEDICATED)(SERVICE_NAME=jocsbk)))",
 'AL32UTF8');

由于本地的 PHP 文件统一用 utf-8 ,所以,直接输出就正常了。不用进行编码转换。

另外,据查询相关资料,如果你本地的文件跟连接 Oracle 的字符集不相同,还要进行编码转换


while ($dat = oci_fetch_row($cur)) {   
  print_r(iconv('gb2312', 'utf-8', $dat[0]));   
}  

//或者


while ($dat = oci_fetch_row($cur)) {   
  print_r(mb_convert_encoding($dat[0], 'utf-8', 'gbk'));   
}  

也有另外一种解决方式,但没试过。Oracle 可以按照 客户端指定的字符集 提供数据。也就是说,如果我本地PHP文件用UTF-8,那么,我在oci_connect的时候,直接指定utf-8就行了,连编码转换都省了。

$c1 = oci_connect("scott", "tiger", $db, 'UTF8');  

2016年5月7日星期六

PHP 调用 Oracle 存储过程出现 not all variables bound 原因

今天发现使用 PHP 调用 Oracle 存储过程总是出现这样的一个错误。

ORA-01008: not all variables bound

后来折腾了很久,发现是变量名写错了。

<?php
$conn = oci_connect('SCOTT','TIGER') or die;// 建立连接 

if (!$conn) { 
 $e = oci_error(); 
 print htmlentities($e['message']); 
 exit; 
} 

$sql = 'BEGIN pack_gt_calc.Pro_gt_Confirm(:year, :week, :errno, :errmsg); END;'; // 查询语句 
$stid = oci_parse($conn, $sql); // 配置SQL语句,准备执行 
if (!$stid) { 
 $e = oci_error($conn); 
 print htmlentities($e['message']); 
 exit; 
}

//  Bind the input parameter
oci_bind_by_name($stid,':year',$year,32);

// Bind the input parameter
oci_bind_by_name($stid,':week',$week,32);

// Bind the output parameter
oci_bind_by_name($stid,':errno',$error,32);
// Bind the output parameter
oci_bind_by_name($stid,':ermsg',$errmsg,64);
// Assign a value to the input 

$year = '2016';

$week = '4';

$r = oci_execute($stid); // 执行SQL。OCI_DEFAULT表示不要自动commit 


if(!$r) { 
 $e = oci_error($stid); 
 echo htmlentities($e['message']); 
 exit; 
} 

echo "errmsg is : $error<br>";
echo "errmsg is : $errmsg<br>";

oci_close($conn); 

?>


参考资源:http://www.oracle.com/technetwork/cn/articles/fuecks-sps-082839-zhs.html