【Oracle】开发相关问题记录

目录

1、如何解决PLSQL工具中查询数据时乱码显示问题?

2、使用Oracle数据库过程中会出现数据库被锁的情况,该怎么解决?

3、Oracle如何查看表建立索引和分区?

4、Oracle数据库中如何将一个数据库表的数据添加到另一个数据库表中?

5、Oracle导出.sql文件(含表结构和数据)时报含clob列错误?

6、报错:java.sql.SQLSyntaxErrorException: ORA-00911: 无效字符,怎么解决?

7、报错:java.math.BigDecimal cannot be cast to java.lang.String,怎么解决?

8、SQL语句在数值计算出现分母为0情况?

9、SQL语句中使用like与instr进行模糊查询性能比较?

10、PD连接Oracle遇到的问题及导出表结构

11、Navicat工具无法连接oracle,怎么解决?

12、plsqldev导入txt或csv文件报错,显示标识符无效? 


1、如何解决PLSQL工具中查询数据时乱码显示问题?

两步走:

  • 查询一下当前的字符集类型:select userenv('language') from dual; ,如果不是IMPLIFIED CHINESE_CHINA.ZHS16GBK,需要设置环境变量;
  • Windows上,我的电脑--右键属性--高级系统设置--高级--环境变量--新建用户变量 

变量名:NLS_LANG   

变量值:SIMPLIFIED CHINESE_CHINA.ZHS16GBK

重启plsql即可。

2、使用Oracle数据库过程中会出现数据库被锁的情况,该怎么解决?

杀掉当前系统的会话,通过以下三个步骤即可解决被锁:

  • 第一步: select object_id,session_id,locked_mode from v$locked_object
  • 第二步:select t2.username,t2.sid,t2.serial#,t2.logon_time from v$locked_object t1,v$session t2 where t1.session_id=t2.sid order by t2.logon_time
  • 第三步: alter system kill session 'sid,serial#‘

注意:用SQL语句向数据库插入数据,执行时一直显示“正在执行...”,是因为未commit提交造成的死锁。

3、Oracle如何查看表建立索引和分区?

参考如下:

SELECT * FROM v_ci_h;
--查看是否使用了索引
select * from user_indexes where table_name=upper('v_ci_h');
--查看是否建立了分区(table_name一定要大写)
select partition_name from user_tab_partitions where table_name='V_CI_H'; 

4、Oracle数据库中如何将一个数据库表的数据添加到另一个数据库表中?

--例如:将数据库B的表数据按时间查询出后插入到数据库A中
insert into 数据库A.表  select * from  数据库B.表 where to_char(pass_time,'yyyyMMdd')>='20181001'

注意:如果查询的数据量太大会报以下提示:

5、Oracle导出.sql文件(含表结构和数据)时报含clob列错误?

这个问题在项目中遇到了,因为clob类型的pl/sql处理不了,导出含数据的sql文件时会报错!!,可以通过以下方式解决:

6、报错:java.sql.SQLSyntaxErrorException: ORA-00911: 无效字符,怎么解决?

原因:拼写SQL语句时,结尾多了一个 “ ; ”

7、报错:java.math.BigDecimal cannot be cast to java.lang.String,怎么解决?

数据从数据库中取出的,把数据库中的整数转成了BigDecimal 类型,不管是什么类型,它们不能强制转换成String类型的,强制转换会报错,强制转换符在引用类型用于父类转子类。而这些类都实现了toString方法可以通过这个方法转成String类型。

// 数据库 LATITUDE 对应的整数:
Object lat = mapparamfirst.get("LATITUDE");
System.out.println(lat.toString());
// 或者是将返回字段的计算结果使用to_char()函数转化为字符串类型返回
to_char(decode(sum(volte_merge_001),0,0,sum(volte_merge_002))) 
    "element_fVolteMergeC001",
to_char(sum(volte_merge_001)) "denominator_fVolteMergeC001",

8、SQL语句在数值计算出现分母为0情况?

1. 使用NULLIF函数

NULLIF(expr1,expr2)
  • 解释:如果两个表达式不相等,返回第一个 expression1 的值;如果两个表达式相等,返回空值null。
  • 注意:可以NULLIF(expr1,null),不可以NULLIF(null,expr2)!!

2. 使用DECODE函数

decode(分母,0,null,分子/分母)

3. 使用case...when...then

case  when 分母=0 then NULL else 分子/分母

9、SQL语句中使用like与instr进行模糊查询性能比较?

  • like关键字和instr()内建函数区别:
instr(title,'手册')>0 -- 相当于  title like '%手册%' 
instr(title,'手册')=1 -- 相当于  title like '手册%' 
instr(title,'手册')=0 -- 相当于  title not like '%手册%'

t表中将近有1100万数据,很多时候,我们要进行字符串匹配,在SQL语句中,我们通常使用like来达到我们搜索的目标。但经过实际测试发现,like的效率与instr函数差别相当大。

  • 一般来说,在Oracle数据库中,对tb表的name字段进行模糊查询会采用下面两种方式:
select * from tb where name like '%XX%'; select * from tb where instr(name,'XX')>0;

若是在name字段上没有加索引,两者效率差不多,基本没有区别。为提高效率,我们在name字段上可以加上非唯一性索引:

create index idx_tb_name on tb(name);

这样,再使用:

select * from tb where instr(name,'XX')>0;

这样的语句查询,效率可以提高不少,表数据量越大时两者差别越大。但也要顾及到name字段加上索引后DML语句会使索引数据重新排序的影响。

10、PD连接Oracle遇到的问题及导出表结构

连接过程中,出现的问题可以参考下面整理的链接:

  • Oracle的ODBC驱动安装、客户端TNS配置、PD连接Oracle过程:

https://blog.csdn.net/u011781521/article/details/78960083

https://www.cnblogs.com/chinas/p/6228245.html

  • 无法加载ODBC应用程序驱动,发生14001错误:

https://blog.csdn.net/sandy_shell/article/details/8555820

  • 逆向工程生成的表结构中name赋值comment脚本:
' 将name赋值comment
Option   Explicit    
ValidationMode   =   True    
InteractiveMode   =   im_Batch    
  
Dim   mdl   '   the   current   model    
  
'   get   the   current   active   model    
Set   mdl   =   ActiveModel    
If   (mdl   Is   Nothing)   Then    
      MsgBox   "There   is   no   current   Model "    
ElseIf   Not   mdl.IsKindOf(PdPDM.cls_Model)   Then    
      MsgBox   "The   current   model   is   not   an   Physical   Data   model. "    
Else    
      ProcessFolder   mdl    
End   If    
  
Private   sub   ProcessFolder(folder)    
On Error Resume Next   
      Dim   Tab   'running     table    
      for   each   Tab   in   folder.tables    
            if   not   tab.isShortcut   then    
                  tab.name   =   tab.comment   
                  Dim   col   '   running   column    
                  for   each   col   in   tab.columns    
                  if col.comment="" then   
                  else  
                        col.name=   col.comment    
                  end if  
                  next    
            end   if    
      next    
  
      Dim   view   'running   view    
      for   each   view   in   folder.Views    
            if   not   view.isShortcut   then    
                  view.name   =   view.comment    
            end   if    
      next    
  
      '   go   into   the   sub-packages    
      Dim   f   '   running   folder    
      For   Each   f   In   folder.Packages    
            if   not   f.IsShortcut   then    
                  ProcessFolder   f    
            end   if    
      Next    
end   sub 

执行脚本前:

执行后:

11、Navicat工具无法连接oracle,怎么解决?

navicat是一款连接数据库的工具。

下载instantclient-basic-win-x86-64-11.2.0.1.0压缩包(即免安装的oracle客户端)并解压到oracle文件夹(可以是其他任意文件夹)下,在navicat的工具--选项--环境里配置解压后的orc.dll文件路径,配置好后重启即可。

12、plsqldev导入txt或csv文件报错,显示标识符无效? 

一般的导入步骤:tools ---> Text Importer--->【Data from Textfile】--选择需要导入的csv或txt文件 --->【Data to Oracle】-- 【general】:选择owner和table -- 【fields】:遇到field类型为XXXX__NUMBER_ 的,通过下拉框修改为:XXXX (NUMBER)即可 ---> import 。然而标红的部分未修改时会导入失败,报以下错误:
 

【持续更新中】

猜你喜欢

转载自blog.csdn.net/qq_29119581/article/details/114649251