前些阵子用oralce发现的些问题与大家分享

1.Oracle关键字解决办法

当使用pl_sql报出下面错误的时候:

ORA-01747: user.table.column, table.column 或列说明无效


如果报这个错误的时候,是因为我们执行的sql语句中有了oracle的关键字,所以会有这个错误,所以我们就用单引号给这个关键字引起来就没有问题了。
比如:

insert  into department(`id`,`dept_name`,`remark`,`uid`) values (1,'综合处','承担建设项目的管理等工作',1)


因为里面的uid是oracle的关键字,所以用单引号引起来执行就没有问题了。

2.Oracle连接不上解决方法


当控制台报如下错误时:

Cannot load JDBC driver class 'oracle.jdbc.driver.OracleDriver'


这说明我们的oracle的驱动连接不上数据库,但是我这时候已经明明的把驱动加到了项目的
/web-inf/lib/下了,可是还是报这个错误,这是为什么呢?
因为oracle的数据库我们把oracle的驱动(ojdbc14.jar)光加到我们的项目中去是没有用的,所以我们还需要把我们的这个oracle驱动加到我们的tomcat的lib下面,这样启动tomcat后就可以连接上我们的oracle数据库了,我用的是tomcat6,所以路径就是tomcat/lib/

3.oracle表名为关键字的错误

当报这个错误的时候:

ORA-00903:表名无效
或者
ORA-00903: invalid table name


这个都是表示我们的表名是无效的
因为我们的表名起为了oracle的关键字,所以是无效的
所以需要注意的是,在mysql往oracle移植的时候一定要注意在mysql中是否定义了oracle的关键字
用hibernate比较方便可以在.hbm中把table给改名,但是如果用纯jdbc去写的话,那么就麻烦许多了,需要针对与每个查询语句去修改一下

4.在oracle中插入数据
在oracle中插入数据需要给这个来插入序列,那么这个需要怎么做呢?
下面举个例子:

String sql = "insert into t_res_language_schools(id,name,introduction,school_url,address,status,create_by,"+"create_time,provider,provider_url) values(t_res_language_schools_seq.nextval,?,?,?,?,?,?,?,?,?)";



t_res_language_schools_seq.nextval是:序列的名字+nextval就可以了
上面插入的地方是把id给指定给序列

因为我之前一直在用mysql,mysql的id都是自增的,而oracle在插入的时候需要去插入序列去操作.

5.使用PLSQL Developer时,“ORA-12154: TNS:无法解析指定的连接标识符”问题的一个解决办法


当我们使用PL/SQL的时候,当报这个“ORA-12154:TNS:无法解析指定的连接标识符”问题的时候,像我的问题就是在单安装了oracle的客户端(oracle_client)的时候没有发现什么问题,因为这时只是默认的安装了一个客户端,当我们再继续装了一个服务端的oracle的时候,这个时候PL/SQL就 不知道默认的连接方式是什么了,现在一般可以连上本机了,但是远程的就连不上了,所以这时候我们要设置一下PL/SQL的连接方式,然后就可以正常连接了,设置如下:
比如出现错误后点确定进入PL/SQL的主界面,然后在主界面中点击:工具--首选项—连接
然后在右侧会看到oracle主目录名(自动检测为空名),然后我们选择oracle客户端的名字(OraClient10g_home1)点应用,重起PL/SQL就可以连接远程服务器和本地的了。
如图:


6.对Oracle序列的操作

序列名.NEXTVAL :指定下一个序列
序列名.CURRVAL :指定当前序列(注:这个必须在NEXTVAL产生序列后才可以使用)
例子:
Select 序列名.NEXTVAL from dual (产生序列,指定到下一个序列)
Select 序列名.CURRVAL from dual (产生序列后获取当前的序列)



7.用jdbc进行级联添加(ORACLE)

比如A是外键表,B引用A的id,C引用B的id
那么这样怎么去进行级联添加呢?
我们这个必须在一个事务里面去处理:
那么我们这里所遇到的问题就是如何把引用的id去注入,那么我来写下下面的语句,问题就在sql语句的写法上:

A_SEQ是A表序列 B_SEQ 是B表序列   C_SEQ是C表序列
Insert into A(id,a_name) values(a_seq.nextval,?)
Intsert into B(id,b_name,a_id) values(b_seq.nextval,?,a_seq.currval)
Insert into C(id,c_name,b_id) values(c_seq.nextval,?,b_seq.currval)


然后在执行jdbc的时候执行顺序也需要按照上面的这些语句的执行顺序来执行

8.Jdbc在Oracle中存储日期类型
当我们在数据库中插入一个日期类型的数值是是这样去插入

Insert into (id,create_time) values(example_seq,to_date(‘2009-01-03 9:25:15’,’ YYYY-MM-DD HH24:MI:SS’)
Commit;



注意(这里如果日期的格式是 2009-01-03也就是年月日的形式的直接后面的格式是yyyy-mm-dd就可以)

在jdbc中如果我们要插入这个日期类型的话,那么我们这里需要写的sql语句和这里的是一样的

String sql=”inert into (id,create_time) values(example_seq,to_date(?,’YYYY-MM-DD HH24:MI:SS’)”;

DBManager dbManager = new DBManager();
Connection conn = dbManager.GetConnection();
PreparedStatement ps = conn.prepareStatement(sql);
ps.setString(1, DateUtil.getCurrDateTime());


//这里我们要注意的是,我们在注入我们日期的时候不需要把这里setdate,因为我们在存储的时候就是以字符串的形式储存的,所以这里,直接用字符串保存就可以了,这里setdate是一个误区,这个问题不知道我理解的对不对,但是确实如果是setdate就set不进去,这里如果有人理解比较深刻的可以帮我解释下!

9.ORA-00913: 值过多

当oracle中报“ORA-00913: 值过多”错误的时候,那么说明我们的sql语句中有了问题,
一般是我们所需要穿的参数和我们需要保存的字段这里的数量不一致所导致的,所以就产生了一对多,或多对一的现象,下面举个例子:

Insert into (id,name,sex,create_time) values(user_seq,?,?,?)


比如我们sql是这样写的,前面要插入的值是3个,而后面所传入的参数变成了4个,那么在这个时候多出来的一个参数就不知道指定给谁了,所以就会报这个值过多的错误了。
所以我们这里需要把上面的sql语句改为

Insert into (id,name,sex,create_time) values(user_seq,?,?)


这样就可以对应上了


我上面用的是我在用oracle开发的时候发现的一些问题,与自己的理解方式和解决方法,不知道怎么理解对与不对,希望大家指点以后还会继续把发现的问题贴到博客中与大家分享!

 

你可能感兴趣的:(oracle,sql,tomcat,mysql,jdbc)