是否有可能从一个进程连接到Oracle(通过OCI),然后从另一个进程连接到同一个数据库会话?
在我当前的应用程序中,有两种方法可以访问数据库:同步数据库和异步数据库(通过使用单独的进程,通过套接字进行通信).问题是这两种方法实现了不同的会话.
如果我尝试在一个会话上进行例如更新,那么尝试从另一个会话更新同一个表而不提交,我在OCI调用上挂起.
更糟糕的是,如果从一个会话设置会话变量 - 另一个会话没有看到它(这正是名称所说的......).
对于SQL IN子句,如何在使用PHP OCI8绑定SQL时处理未知数量的参数?
例如,给出以下查询
select * from table1
where id > :id_1
and id in (:id_array_of_unknown_size)
Run Code Online (Sandbox Code Playgroud)
和要绑定的变量数组
$bind_array = array(
':id_1' => '1',
': id_array_of_unknown_size' => array('7','2','5',),
);
Run Code Online (Sandbox Code Playgroud)
另外需要注意的是,在我的特定情况下,输入array($bind_array)可能包含也可能不包含绑定元素的子数组.它也可以是以下
select * from table1
where id > :id_1
and id != :id_2
Run Code Online (Sandbox Code Playgroud)
和
$bind_array = array(
':id_1' => '1',
':id_2' => '5',
);
Run Code Online (Sandbox Code Playgroud) 因为OCIErrorGet()它记录了它可能返回多个错误,我用它来提取以下方法OCI_SUCCESS_WITH_INFO,但目前不适用于OCI_ERROR:
void check_error( sword status )
{
switch( status ) {
case OCI_SUCCESS:
break;
case OCI_SUCCESS_WITH_INFO:
{
ub4 recordno = 1;
while( status != OCI_NO_DATA ) {
sb4 errcode = 0;
text errbuf[ 1024 ];
status = ::OCIErrorGet( m_err, recordno, (text*)NULL, &errcode, errbuf, sizeof( errbuf ), OCI_HTYPE_ERROR );
if( status == OCI_SUCCESS ) {
std::cout << "oracle info: " << (const char*)errbuf << std::endl;
}
else {
assert( status == OCI_NO_DATA );
}
++recordno; …Run Code Online (Sandbox Code Playgroud) 我正在使用XAMPP并尝试为sql配置Oracle连接.
我取消注释该行extension=php_oci8.dll,最初它最终出现错误(缺少oci.dll),但后来我从Oracle网页下载了instantclient.我尝试使用版本10.2,11.2和12.1,但都没有工作.显然我已经将这些库的路径添加到我的PATHenv变量中.
我在启动Apache时得到的警告是: PHP Warning: PHP Startup: in Unknown on line 0
我尝试连接时的错误是: PHP Fatal error: Call to undefined function oci_connect() in ...
我试过php_oci8.dll和php_oci8_11g.dll.这些文件在我的php/ext目录中(它们包含在xampp中),我的instantclient被添加到PATH,如果我禁用这些模块,则不会显示警告.我试过重启服务和电脑.
你能帮我找到一个如何正确配置它的解决方案吗?我正在使用具有管理权限的Windows 8.1.
BTW.我phpinfo()说OCI8被激活(但功能oci_connect仍然不起作用).
编辑:当我尝试手动运行PHP时,我终于得到错误显示错误:Unable to load dynamic library 'C:\Program Files (x86)\PHP\ext\php_oci8_11g.dll' - %1 is not a valid Win32 application. in Unknown on line 0你能帮我找到哪里可以下载正确的版本?
我的 docker 在最近更新后开始出错。现有容器可以工作,但我无法构建或运行任何映像。
一个简单的
码头工人运行你好世界
给我一个错误:
docker: 来自守护进程的错误响应:OCI 运行时创建失败:无法检索 OCI 运行时错误(打开 /run/containerd/io.containerd.runtime.v1.linux/moby/881b53be5cfe91d19577414c2f4a52dd06804624fe1d2189d 或 nocf3c1d1d2189d 等文件) runc 未成功终止:未知。
我尝试了互联网上关于此问题的所有建议,例如重新启动、建立链接、重新安装.....
我当前的 docker 版本是 18.09.5,Ubuntu 19.04
有没有人有类似的问题并解决了它?
我需要将浮点数绑定到OCI语句。
我在做什么:
$price = 0.1
oci_bind_by_name($resource, 'price', $price);
Run Code Online (Sandbox Code Playgroud)
在我的Oracle DB中,“ price”是存储过程的参数,其类型为NUMERIC。
执行我的语句后,出现以下错误:
消息:oci_execute()[function.oci-execute]:ORA-06502:PL / SQL:数字或值错误:字符到数字的转换错误ORA-06512:在第1行
如果$ price是一个整数,则一切正常。在PHP文档http://lv.php.net/manual/zh/function.oci-bind-by-name.php中,我没有找到第五个参数的特殊浮点类型(int $ type = SQLT_CHR)。
找到答案:我只是在操作系统中将小数符号从“,”更改为“”。现在一切正常
我需要在我的rhel 6.3机器上运行OCI lib,我遇到了一些无法找到的OCI头文件的问题.我安装了(使用yum install)
甲骨文instantclient11.2-基本-11.2.0.3.0-1.x86_64.rpm
因为这个官方页面所有我需要运行OCI.为了测试整个事情,我已经安装了sqplus64,它在我设置后工作export LD_LIBRARY_PATH=/usr/lib/oracle/11.2/client64/lib.遗憾的是,设置后无法找到头文件LD_LIBRARY_PATH.实际上我并不感到惊讶,因为include这些oracle路径中没有任何目录.
所以问题是:我从哪里获取这些丢失的头文件?他们真的已经在那里,我只能找到它们吗?
顺便说一句:我正在做这整个练习,因为我想在我的R Studio服务器上使用ROracle,这个R包依赖于OCI库.一旦我回到R领域,我的道路就会变得更加崎岖不平.
编辑:这个文档对我有所帮助.但是,我想我现在找到了一些头文件:"/ usr /include/oracle/11.2/client64".但是我必须将哪个变量设置到此位置?
我试图让JDBC OCI连接到的Oracle 11g使用OS验证
我做了一个示例控制台应用程序来测试某些客户端计算机上的连接
我在具有jdk 6的机器上开发了应用程序,并在项目中使用了jar ojdbc6.jar.
我用来连接数据库的代码如下:
OracleDataSource ods = new OracleDataSource();
String tnsName="Prod";
ods.setURL("jdbc:oracle:oci:/@"+tnsName);
Connection conn = ods.getConnection();
Run Code Online (Sandbox Code Playgroud)
我正在尝试从安装了oracle11g的客户端计算机上运行此应用程序,并且在路径上将oracle主目录设置为: C:\ orant\jdk\bin
路径:C:\ orant\bin包含oci.dll,不包含ocijdbc11.dll
客户端安装了jre7并且没有jdk.
当试图在os验证到oracle数据库的客户端机器上运行上面的代码时,我遇到以下异常:
Exception in thread "main" java.lang.UnsatisfiedLinkError: no ocijdbc11 in java.
library.path
at java.lang.ClassLoader.loadLibrary(Unknown Source)
at java.lang.Runtime.loadLibrary0(Unknown Source)
at java.lang.System.loadLibrary(Unknown Source)
at oracle.jdbc.driver.T2CConnection$1.run(T2CConnection.java:3178)
at java.security.AccessController.doPrivileged(Native Method)
at oracle.jdbc.driver.T2CConnection.loadNativeLibrary(T2CConnection.java
:3174)
at oracle.jdbc.driver.T2CConnection.logon(T2CConnection.java:233)
at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:
508)
at oracle.jdbc.driver.T2CConnection.<init>(T2CConnection.java:133)
at oracle.jdbc.driver.T2CDriverExtension.getConnection(T2CDriverExtensio
n.java:53)
at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:510)
at …Run Code Online (Sandbox Code Playgroud) 我正按照这些说明尝试安装Oracle Driver for Go(go-oci8)
我面临的问题是使用$ GOPATH环境变量.当我执行命令时:
sudo go get github.com/mattn/go-oci8
我收到错误:
cannot download, $GOPATH not set. For more details see: go help gopath
但是,我已经正确设置了GOPATH.我的环境看起来像这样:
env | grep GO
GOARCH=amd64
GOROOT=/usr/local/go
GOOS=linux
GOPATH=/home/myuser/go/
ls $GOPATH
bin pkg src
我发现了一个类似的帖子,但解决方案不适用于我的情况.
最近我将opensuse 12.3更新为更新的13.1
不幸的是,我无法编译所需的pdo_oci.so.使用本指南,y可以在12.3上编译extnention:
但不幸的是,在实际版本上我很难找到解决方案.目前我正在尝试执行make,但是你得到以下错误:
/home/temp/PDO_OCI-1.0/pdo_oci.c:34:1: error: unknown type name 'function_entry'
function_entry pdo_oci_functions[] = {
^
/home/temp/PDO_OCI-1.0/pdo_oci.c:35:2: warning: braces around scalar initializer [enabled by default]
{NULL, NULL, NULL}
^
/home/temp/PDO_OCI-1.0/pdo_oci.c:35:2: warning: (near initialization for 'pdo_oci_functions[0]') [enabled by default]
/home/temp/PDO_OCI-1.0/pdo_oci.c:35:2: warning: initialization makes integer from pointer without a cast [enabled by default]
/home/temp/PDO_OCI-1.0/pdo_oci.c:35:2: warning: (near initialization for 'pdo_oci_functions[0]') [enabled by default]
/home/temp/PDO_OCI-1.0/pdo_oci.c:35:2: warning: excess elements in scalar initializer [enabled by default]
/home/temp/PDO_OCI-1.0/pdo_oci.c:35:2: warning: (near initialization for 'pdo_oci_functions[0]') [enabled by default]
/home/temp/PDO_OCI-1.0/pdo_oci.c:35:2: …Run Code Online (Sandbox Code Playgroud)