oracle奇葩函数,Oracle系列 开发中奇葩问题你遇到几个

1、oracle插入数据中文乱码的问题:

问题描述:在plsql中不管是编辑数据,还是使用insert语句插入,所有的中文都会变成乱码。

解决方法:

我的电脑---右击---属性---高级---环境变量---系统变量---新建

变量名:NLS_LANG

变量值:SIMPLIFIED CHINESE_CHINA.ZHS16GBK,确定后再试试,OK。

2 、在plsql中增删改数据后,查询看到结果变了,但是程序访问还是原来的数据。

问题描述:测试需要,在plsql中更新一条数据,然后程序查询该数据。很奇怪的是程序查询到的结果总是更新之前的。怎么回事?

解决方法:plsql里面有一个提交的操作,在增删改数据后,需要提交一下数据,其他进程才能访问到修改的数据。如果你之前一直用的ms sql server,刚使用oracle的过程中,是否也遇到类似的问题呢。

3、在plsql中修改数据后,没有提交,程序修改这个表数据时就会卡死。因为表被plsql的进程锁掉了。

需要在plsql里面提交数据,这个时候锁才会释放。这也就是为什么经常看到下面代码的原因:

lock (syncCommit)

{

try

{

return context.SaveChanges();

}

catch (DbEntityValidationException dbEx)

{

}

}

4、使用PowerDesigner设计表后生成DDL语句,执行DDL语句后表、字段、关联键都可以正常生成,可是奇怪的问题就来了,你在plsql里面select * from table1表时,提示表或者视图不存在,可是你仔细看了好多遍,表明明存在呀。还出鬼了呢。。。

问题描述:我们来看生成的DDL语句

/*==============================================================*/

/* DBMS name: ORACLE Version 11g */

/* Created on: 2015/7/2 15:45:52 */

/*==============================================================*/

drop table "TB_Department" cascade constraints;

drop table "TB_Menu" cascade constraints;

drop table "TB_MenuRole" cascade constraints;

drop table "TB_Role" cascade constraints;

drop table "TB_UserRole" cascade constraints;

drop table "TB_Users" cascade constraints;

/*==============================================================*/

/* Table: "TB_Department" */

/*==============================================================*/

create table "TB_Department"

(

"department_id" CHAR(10),

"department_name" CHAR(10),

"parent_id" CHAR(10),

"level" CHAR(10),

"status" CHAR(10)

);

/*==============================================================*/

/* Table: "TB_Menu" */

/*==============================================================*/

create table "TB_Menu"

(

"menu_id" CHAR(10),

"menu_name" CHAR(10),

"menu_url" CHAR(10),

"parent_id" CHAR(10),

"level" CHAR(10),

"sort_order" CHAR(10),

"status" CHAR(10),

"remark" CHAR(10)

);

/*==============================================================*/

/* Table: "TB_MenuRole" */

/*==============================================================*/

create table "TB_MenuRole"

(

"id" CHAR(10),

"role_id" CHAR(10),

"menu_id" CHAR(10),

"role_type" CHAR(10),

"button_id" CHAR(10)

);

/*==============================================================*/

/* Table: "TB_Role" */

/*==============================================================*/

create table "TB_Role"

(

"role_id" CHAR(10),

"role_name" CHAR(10),

"description" CHAR(10),

"createtime" CHAR(10),

"modifytime" CHAR(10)

);

/*==============================================================*/

/* Table: "TB_UserRole" */

/*==============================================================*/

create table "TB_UserRole"

(

"id" CHAR(10),

"role_id" CHAR(10),

"user_id" CHAR(10)

);

/*==============================================================*/

/* Table: "TB_Users" */

/*==============================================================*/

create table "TB_Users"

(

"user_id" INT,

"user_name" CHAR VARYING(0),

"user_password" CHAR VARYING(0),

"fullname" CHAR(10),

"department_id" CHAR(10),

"status" CHAR(10),

"createtime" DATE,

"modifytime" DATE,

"remark" CHAR(10)

);

comment on table "TB_Users" is

'用户信息表';

解决方案:原来是"号在作怪,由于生成的表里面带了引号,所以当你用tb_users去查时,提示找不到该表。当你讲所有的引号去掉,再重新执行DDL,再去查询,就这样正常了。郁闷了好久吧!!如果你也是用过PowerDesigner生成过DDL语句,可能也遇到过问题。

5、用EF去连接oracle数据库时,最开始开发一直用的test用户,最近项目要上线了,在服务器上面安装好oracle,建好正式用户admin,可是奇怪的事情发生了。程序里面该改的配置文件,连接字符串都改了,数据表都创建正常,表空间什么的也都没问题,可是用admin连接的时候总是提示找不到对应的表或视图。这又是为什么呢?其实问题就在admin这个用户那里。

原因分析:因为之前开发一直用的test用户,拖EF表结构的时候也是test,这样在edmx文件中就生成了对应的Schema="Test"。而在连接数据库是,EF自动生成的Sql语句会带Test用户,所以导致找不到表。

解决方案:重新生成表结构,或者手动改掉Schma的值。

6、查询时,有时在PL/SQL里面可以用中文模糊搜索,但是在程序调试中使用中文模糊搜索时总查询不到记录。

原因分析:由于PL/Sql里面进行过自动编码,所以支持中文检索,当程序用sql语句查询时如果没有设置编码的话可能查不到中文。

解决方案:需要在web.config配置文件加上 Unicode=true;

User ID=mall;Password=super123;Unicode=true;Data Source=EIPUAT

7、oracle里面新建用户的时候,用户会有一个默认表空间,而此用户是无法访问到其他表空间下面的数据表的。这个时候需要修改用户的默认表空间或者表的所属表空间。

(1)修改表的表空间语句:

alter table TABLE_NAME move tablespace TABLESPACENAME

(2)修改默认用户的表空间:

alter user user_name default tablespace tablespace_name;

8、oracle创建自增序列。如果在sql server里面,只需要给主键设置自增长就行了。oracle可没有这玩意儿,怎么办?

解决方案:

(1) 创建自增序列,在PLSql里面的SQL 窗口中执行如下语句,创建自增序列TB_TRIAL_PROCESS_SQE

create sequence TB_TRIAL_PROCESS_SQE

minvalue 1

maxvalue 99999999

increment by 1

start with 1; /*步长为1*/

/*创建触发器*/

DROP TRIGGER TB_TRIAL_PROCESS_TRI;

create or replace trigger TB_TRIAL_PROCESS_TRI

before insert on TB_TRIAL_PROCESS /*触发条件:当向表TB_TRIAL_PROCESS 执行插入操作时触发此触发器*/

for each row/*对每一行都检测是否触发*/

begin/*触发器开始*/

select TB_TRIAL_PROCESS_SQE.NEXTVAL into :new.trial_id from dual; /*触发器主题内容,即触发后执行的动作,在此是取得序列dectuser_tb_seq的下一个值插入到表dectuser中的userid字段中*/

end; /*退出sqlplus行编辑*/

(2) nhibernate的xml里面配置这个序列

TB_TRIAL_PROCESS_SQE

9、oracle里面经常会遇到表被锁定的情况,有时需要手动解锁。

查看系统的锁语句:

select sess.sid,

sess.serial#,

lo.oracle_username,

lo.os_user_name,

ao.object_name,

lo.locked_mode

from v$locked_object lo,

dba_objects ao,

v$session sess

where ao.object_id = lo.object_id and lo.session_id = sess.sid;

杀掉锁表进程语句:(上面的语句会得到两个字段SID和serial#)

alter system kill session 'SID,serial#';/*将上面语句查询到的SID和serial#复制到本语句的相应位置执行即可*/

10、C#程序里面同时执行多条SQL语句,于此同时又不方便使用存储过程或数据库事务。一般是增删改语句。

解决方案:如果你将多条SQL语句用分号隔开放在plsql中执行是可以得到结果的。但是在程序里面直接传多条SQL语句时则会提示错误。这个时候需要在这多条SQL语句的前后分别加上begin和end。这样就能解决问题。记得原来在SQL Server里面直接这样传多条sql语句是可以的。但在oracle里面需要这么处理下。

本文转载自博客园

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值