Java 使用占位符操作数据库,表是oracle分区表。windows里测试正常,linux报错。。
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java 使用占位符操作数据库,表是oracle分区表。windows里测试正常,linux报错。。相关的知识,希望对你有一定的参考价值。
Java 使用占位符操作数据库,表是oracle分区表。本地window平台测试没问题,但是代码放在linux服务器会报错。绝对不是因为占位符没传值引起得,这个确认了。哪位大神遇到过
StatementCallback; uncategorized SQLException for SQL [***** values(?,?,?,?,?,?)]; SQL state [72000]; error code [1008]; ORA-01008: not all variables bound
; nested exception is java.sql.SQLException: ORA-01008: not all variables bound
Oracle Call Interface(OCI)使用户可以访问 Oracle 10,Oracle9,Oracle8 和 Oracle7 数据库。支持将 php 变量与 Oracle 占位符(placeholder)绑定,具有完整的 LOB,FILE 和 ROWID 支持,以及允许使用用户提供的定义变量。
例子 1. 基本查询
<?php
$conn = oci_connect(\'hr\', \'hr\', \'orcl\');
if (!$conn)
$e = oci_error();
print htmlentities($e[\'message\']);
exit;
$query = \'SELECT * FROM DEPARTMENTS\';
$stid = oci_parse($conn, $query);
if (!$stid)
$e = oci_error($conn);
print htmlentities($e[\'message\']);
exit;
$r = oci_execute($stid, OCI_DEFAULT);
if(!$r)
$e = oci_error($stid);
echo htmlentities($e[\'message\']);
exit;
print \'<table border="1">\';
while($row = oci_fetch_array($stid, OCI_RETURN_NULLS))
print \'<tr>\';
foreach($row as $item)
print \'<td>\'.($item?htmlentities($item):\' \').\'</td>\';
print \'</tr>\';
print \'</table>\';
oci_close($conn);
?>
例子 2. 用绑定变量插入
<?php
// Before running, create the table:
// CREATE TABLE MYTABLE (mid NUMBER, myd VARCHAR2(20));
$conn = oci_connect(\'scott\', \'tiger\', \'orcl\');
$query = \'INSERT INTO MYTABLE VALUES(:myid, :mydata)\';
$stid = oci_parse($conn, $query);
$id = 60;
$data = \'Some data\';
oci_bind_by_name($stid, \':myid\', $id);
oci_bind_by_name($stid, \':mydata\', $data);
$r = oci_execute($stid);
if($r)
print "One row inserted";
oci_close($conn);
?>
例子 3. 将数据插入到 CLOB 列中
<?php
// Before running, create the table:
// CREATE TABLE MYTABLE (mykey NUMBER, myclob CLOB);
$conn = oci_connect(\'scott\', \'tiger\', \'orcl\');
$mykey = 12343; // arbitrary key for this example;
$sql = "INSERT INTO mytable (mykey, myclob)
VALUES (:mykey, EMPTY_CLOB())
RETURNING myclob INTO :myclob";
$stid = oci_parse($conn, $sql);
$clob = oci_new_descriptor($conn, OCI_D_LOB);
oci_bind_by_name($stid, ":mykey", $mykey, 5);
oci_bind_by_name($stid, ":myclob", $clob, -1, OCI_B_CLOB);
oci_execute($stid, OCI_DEFAULT);
$clob->save("A very long string");
oci_commit($conn);
// Fetching CLOB data
$query = \'SELECT myclob FROM mytable WHERE mykey = :mykey\';
$stid = oci_parse ($conn, $query);
oci_bind_by_name($stid, ":mykey", $mykey, 5);
oci_execute($stid, OCI_DEFAULT);
print \'<table border="1">\';
while ($row = oci_fetch_array($stid, OCI_ASSOC))
$result = $row[\'MYCLOB\']->load();
print \'<tr><td>\'.$result.\'</td></tr>\';
print \'</table>\';
?> 参考技术A 你好的!
这个可能跟不同平台的java的版本或者是你们业务开发的平台有关
类似的问题,我切身遇到过。要么,你换个占位符的写法,例如 ":asd"这种方式的占位符
要么,你把所有的? 占位符都写上非空的值看看!
欢迎追问追问
谢谢回答
所有占位符都是非空,我手动赋值但是还是不行
windows 下的jdk 与linux 下的一致?
追问嗯,一致得
JAVA 用dbutils这个第三方jar 向oracle数据库插入date 类型数据的时候,要用啥类型替换掉占位符
@Test
public void t2() throws ParseException
try
QueryRunner runner = new QueryRunner(JdbcUtils.getDataSource());
String sql = "insert into test (bir) values (?)";
Object params[] = new java.util.Date();
runner.update(sql,params);
catch (SQLException e)
throw new RuntimeException(e);
用 java.util.Date() 。求解
用 java.util.Date() 不行。求解
String sql = "insert into tbl_test(id,user_name,birthday) values(?,?,to_date(?,'yyyy-MM-dd'))";
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
Object[] params = new Object[]3,"scott",format.format(new Date());
try
qr.update(sql, params);
catch (SQLException e)
e.printStackTrace();
和这类似,还是用oracle的函数吧。
另外参数可以传java.sql.date,这update方法内部用的是preparedStatement,这个对象插入时间的时候支持java.sql.date.试试吧。 参考技术A 格式问题吧,输出下date看看是什么格式的,或者格式化一下
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
以上是关于Java 使用占位符操作数据库,表是oracle分区表。windows里测试正常,linux报错。。的主要内容,如果未能解决你的问题,请参考以下文章
JDBC mysql不支持PreparedStatement中的LIMIT占位符?