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

windows和Linux都能执行

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() 不行。求解

QueryRunner qr = new QueryRunner(DbUtils.getDataSource());
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占位符?

Java里含占位符 支持模糊查询的SQL语句!!!!!

SQl语句中使用占位符的优点

OTL翻译 -- otl_stream流相关绑定变量

JAVA在数据库中插入日期,日期由字符串变量传递值,占位符?要用单引号吗,怎么写?

Jfinal数据库操作语句中占位符的使用