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本身链接方式的问题)
存储过程中无数据插入变量的问题
存储过程中执行查询然后给变量赋值的时候,没有任何数据插入的话会执行报错,一定要确保查询出来的值不为空才能赋值给变量