ORACLE错误解决

Oracle alter警告日志查看

警告日志路径

Oracle的警告日志默认存放在D:\app\diag\rdbms\orcl\orcl\trace

这里是我的存放目录,其他的存放目录根据oracle的安装路径对应查找

 

.trc文件查看方法

有时候警告日志会提示你详细的告警信息在xx路径下的xx.trc文件中,但是trc文件不是正常能打开的,这里介绍一种命令行的方式可以读取指定的trc文件

TkprofD:\app\diag\rdbms\orcl\orcl\trace\orcl_ora_28456.trc output=d:\aa.txt

这里就是将指定路径下的trc文件打印到d:\aa.txt文件中去

ORACLE强制关闭用户

根据v$session视图查出你要关闭的用户的id号,一共有两个,一个是id列,一个是serial#列

然后执行alter system kill session ‘id号,serial#号’;

Select username,id,serial#from v$session;

Alter system kill session‘id号,serial#号’;

LONG类型和LONG RAW类型如何处理

--需求:我们需要将TEST_LONG,和TEST_LONG_RAW表分别复制到COPY_LONG和COPY_LONG_RAW里面去

 

--创建TEST_LONG

CREATETABLE TEST_LONG

(

非LONG类型 VARCHAR2(23),

LONG类型 LONG

);

--插入数据

INSERTINTO TEST_LONG

SELECT T.OBJECT_ID 非LONG类型

       ,T.OBJECT_NAMELONG类型

FROM USER_OBJECTS T

WHEREROWNUM<=1000;

 

--创建TEST_LONG_RAW

CREATETABLE TEST_LONG_RAW

(

非LONG_RAW类型 VARCHAR2(23),

LONG_RAW类型 LONGRAW

);

--插入数据

INSERTINTO TEST_LONG_RAW

SELECT T.OBJECT_ID 非LONG_RAW类型,

       '100100101001'LONG_RAW类型

FROM USER_OBJECTS T

WHEREROWNUM<=1000;

 

 --开始转换

CREATETABLE COPY_LONG

AS

SELECT*FROM TEST_LONG;

--执行如上语句报错  ORA-00997 非法使用LONG 类型

 

 CREATETABLE COPY_LONG_RAW

AS

SELECT*FROM TEST_LONG_RAW;

--执行如上语句同样报错  ORA-00997 非法使用LONG 类型

 

 --解决办法如下

/*

我们需要先创建表COPY_LONG和COPY_LONG_RAW

创建的同时需要指定对应的列,

 

假如对应的列是LONG 类型,

你需要在创建表的时候将LONG类型的列改成CLOB

假如对应的列是LONG RAW 类型的

你需要在创建表的时候将LONG RAW类型的列改为BLOB

 */

 CREATETABLE COPY_LONG (非LONG类型VARCHAR2(23),LONG类型 LONG);

CREATETABLE COPY_LONG_RAW (非LONG_RAW类型VARCHAR(23),LONG_RAW类型 BLOB);

 

 --这里要注意了,如果你单独执行下面一条查询语句,oracle会给你报错,但是你执行插入语句的时候他不会报错的

INSERTINTO COPY_LONG

SELECT非LONG类型,TO_LOB(LONG类型)FROMTEST_LONG;

 INSERTINTO COPY_LONG_RAW

SELECT非LONG_RAW类型,TO_LOB(LONG_RAW类型)FROMTEST_LONG_RAW;

 PL/SQL developer 中文乱码问题

有时候会遇到PL/SQL developer中出现中文乱码的情况

这时候不是因为你oracle数据库的问题,而是单方面的因为你第三方插件的问题

该问题怎么解决呢,很简单,网上也有很多办法。这里我给你们说一下具体的解决办法

其实办法很简单

第一步:查出你的oracle服务端的字符集

              Select userenv(‘language’) from dual;

              结果:SIMPLIFIED CHINESE_CHINA.ZHS16GBK

             

第二步:将查出来的结果集放入到环境变量中

              环境变量nls=上面一步骤查出来的结果

              例如:nls_lang = SIMPLIFIED CHINESE_CHINA.ZHS16GBK

 其实简单两步就可以解决了,如果这样不能解决的话问题就不是单单在这里了,到这里就应该考虑以其他方法解决问题了 

网上说的说查询v$nls_parameters;

我也给你们说一下是怎么回事儿吧

查询结果集如下:

PARAMETER

VALUE

NLS_LANGUAGE

SIMPLIFIED CHINESE

NLS_TERRITORY

CHINA

NLS_CURRENCY

NLS_ISO_CURRENCY

CHINA

NLS_NUMERIC_CHARACTERS

.,

NLS_CALENDAR

GREGORIAN

NLS_DATE_FORMAT

DD-MON-RR

NLS_DATE_LANGUAGE

SIMPLIFIED CHINESE

NLS_CHARACTERSET

ZHS16GBK

NLS_SORT

BINARY

NLS_TIME_FORMAT

HH.MI.SSXFF AM

NLS_TIMESTAMP_FORMAT

DD-MON-RR HH.MI.SSXFF AM

NLS_TIME_TZ_FORMAT

HH.MI.SSXFF AM TZR

NLS_TIMESTAMP_TZ_FORMAT

DD-MON-RR HH.MI.SSXFF AM TZR

NLS_DUAL_CURRENCY

NLS_NCHAR_CHARACTERSET

AL16UTF16

NLS_COMP

BINARY

NLS_LENGTH_SEMANTICS

BYTE

NLS_NCHAR_CONV_EXCP

FALSE

 

图上标红的值

SIMPLIFIED CHINESE_CHINA. ZHS16GBK

第一个值拼接“_”,第二个值拼接“.”这样拼接出来就得到了

Select userenv(‘language’)from dual; 这条语句查询出来的值,其实说到这里,大家也明白了,为什么网上要提到这个视图,就是因为你的查询字符集的结果集就是从这个里面得来的


已具有DBA权限的用户还是提示权限不足

错误来源:在执行视图查询的视图提示权限不足

在已经具有dba的用户之后还是提示权限不足的问题,可以通过赋予所有主机访问的权限

如下权限

Grant all privileges TO 用户名

 

 在存储过程中无法提示权限不足的问题(已经拥有DBA权限)

问题来源:今天在编写存储过程时,在存储过程中用到了DBA_TABLES视图,在编译存储过程的时候则没有正常编译通过,提示的错误是权限不足。

解决办法:Oracle 所有的权限,角色,在存储过程,触发器中都是无效的。所以在存储过程,触发器中用到dba_tables等视图的话,你就需要另外赋予该表的显示权限了。如何赋予显示权限呢,用sys用户以sysdba身份登录到oracle中赋予指定用户查询dba_tables的权限

例如:例如在system用户下创建了一个存储过程,存储过程中用到了dba_tables,那么你就必须得以sys用户用sysdba的身份登录到oracle赋予system用户查询dba_tables的视图

     赋予权限语句:grant selecton dba_tables to system;

     解释:赋予system用户查询dba_tables的权限

调用存储过程的时候提示权限不足(已经拥有DBA权限)

问题来源:我在以system用户执行一个存储过程的时候,提示我权限不足。其中,存储过程是已经正常编译过的,system也已经具有最高权限dba。

解决办法:需要在你的存储过程中添加一句话AUTHIDCURRENT,这句话加在AS声明变量的前面

例如:

CREATEORREPLACEPROCEDURE TEST_A

AuthidCurrent_user  --让该存储过程使用调用者权限,默认是 AUTHID DEFINER  定义者权限

AS

  V_STR VARCHAR2(64):='TEST';--随便的一个字符串

BEGIN

 DBMS_OUTPUT.PUT_LINE(V_STR);--打印这个字符串

END;

扩展:

AUTHID DEFINER :定义者权限

编译存储对象的所有者。也是默认权限模式。

AUTHID CURRENT :调用者权限

指拥有当前会话权限的模式,这可能和当前登录用户相同或不同(alter sessionset current_schema 可以改变调用者Schema)

将科学计数法转换成普通数字

1、  select to_char( to_number(column_name)) fromtablename        

环境变量LANG和NLS_LANG的区别

以下都是针对环境变量

LANG是针对Linux系统的语言、地区、字符集的设置。
NLS_LANG是针对Oracle语言、地区、字符集的设置。(linux,windows都有效)

LANG设置方法

LANG=zh_CN.gb2312(设置linux系统的语言为中文)

LANG=en_US.UTF-8 (设置linux系统的语言为英文)

 

NLS_LANG设置方法(注意下面的空格和点不要弄掉了)

NLS_LANG=SIMPLIFIEDCHINESE_CHINA.ZHS16GBK  (设置oracle环境为中文)

NLS_LANG=SAMERICAN_AMERICA.ZHS16GBK       (设置oracle环境为英文)

存储过程中wm_concat(distinct字段)不能直接使用

可以考虑在使用wm_concat之前做去重处理,而后使用wm_concat(distinct 字段)进行操作,

如果oracle版本在11g以上,可以使用LISTAGG函数(oracle开窗函数)

基本用法如下:LISTAGG(XXX,XXX) WITHIN GROUP(ORDER BY XXX

ORACLE 使用SID和SERVICE_NAME

Oracle通过网络链接服务器的时候,可以使用两种链接方式,一种是使用SID,一种是使用SERVICE_NAME。

SID_是指的oracle_参数中instance_name这个参数

SERVICE_NAME 是指参数中service_names这个参数

在配置tnsname的时候,请注意这个问题,另外其他第三方工具链接oracle的时候也应该注意这个问题(特别是在网络都已经通了的情况下,更应该注意oracle本身链接方式的问题)


存储过程中无数据插入变量的问题

存储过程中执行查询然后给变量赋值的时候,没有任何数据插入的话会执行报错,一定要确保查询出来的值不为空才能赋值给变量


猜你喜欢

转载自blog.csdn.net/weixin_41949977/article/details/80994474