Oracle系列——开发中奇葩问题你遇到几个(一)
前言:在使用oracle数据进行开发的时候有没有经常出现一些很奇怪、很纳闷、很无厘头的问题呢。下面是本人使用oracle一段时间遇到的问题小节,在此做个记录,方便以后再遇到类似的问题能快速解决。如果你是数据库大虾或者连续使用oracle数据库1年以上,这篇文章可以不用看了,此文请直接略过;如果你是数据库小菜或者刚从sql server转到使用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用户,所以导致找不到表。
<EntityContainer Name="ModelStoreContainer">
<EntitySet Name="TB_DEPARTMENT" EntityType="Self.TB_DEPARTMENT" Schema="Test" store:Type="Tables" />
<EntitySet Name="TB_MENU" EntityType="Self.TB_MENU" Schema="Test" store:Type="Tables" />
<EntitySet Name="TB_MENUROLE" EntityType="Self.TB_MENUROLE" Schema="Test" store:Type="Tables" />
<EntitySet Name="TB_ROLE" EntityType="Self.TB_ROLE" Schema="Test" store:Type="Tables" />
<EntitySet Name="TB_USERROLE" EntityType="Self.TB_USERROLE" Schema="Test" store:Type="Tables" />
<EntitySet Name="TB_USERS" EntityType="Self.TB_USERS" Schema="Test" store:Type="Tables" />
解决方案:重新生成表结构,或者手动改掉Schma的值。
6、查询时,有时在PL/SQL里面可以用中文模糊搜索,但是在程序调试中使用中文模糊搜索时总查询不到记录。
原因分析:由于PL/Sql里面进行过自动编码,所以支持中文检索,当程序用sql语句查询时如果没有设置编码的话可能查不到中文。
解决方案:需要在web.config配置文件加上 Unicode=true;
<property name="connection.connection_string">User ID=mall;Password=super123;Unicode=true;Data Source=EIPUAT</property>
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里面配置这个序列
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
<class name="E2E.Model.TB_TRIAL_PROCESS, E2E.Model" table="TB_TRIAL_PROCESS">
<id name="TRIAL_ID" type="Decimal" unsaved-value="0">
<column name="TRIAL_ID" sql-type="NUMBER" not-null="true" unique="true"/>
<generator class="sequence">
<param name="sequence">TB_TRIAL_PROCESS_SQE</param>
</generator>
</id>
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里面需要这么处理下。
11、未完待续......
以上是本人在使用oracle开发过程中经常遇到的问题的一些小结。目前为止先整理这么多,后续会将这个序列继续下去。
Oracle系列——开发中奇葩问题你遇到几个(一)的更多相关文章
- Oracle ADF 开发必读
MARK:http://www.oracle.com/technetwork/cn/articles/adf/index-086064-zhs.html 第 1 部分- 借助 Subversion 进 ...
- 【WebApi系列】浅谈HTTP在WebApi开发中的运用
WebApi系列文章 [01]浅谈HTTP在WebApi开发中的运用 [02]聊聊WebApi体系结构 [03]详解WebApi参数的传递 [04]详解WebApi测试和PostMan [05]浅谈W ...
- openresty开发系列30--openresty中使用全局缓存
openresty开发系列30--openresty中使用全局缓存 Nginx全局内存---本地缓存 使用过如Java的朋友可能知道如Ehcache等这种进程内本地缓存.Nginx是一个Master进 ...
- openresty开发系列29--openresty中发起http请求
openresty开发系列29--openresty中发起http请求 有些场景是需要nginx在进行请求转发 用户浏览器请求url访问到nginx服务器,但此请求业务需要再次请求其他业务:如用户请求 ...
- openresty开发系列28--openresty中操作mysql
openresty开发系列28--openresty中操作mysql Mysql客户端 应用中最常使用的就是数据库了,尤其mysql数据库,那openresty lua如何操作mysql呢? ...
- openresty开发系列27--openresty中封装redis操作
openresty开发系列27--openresty中封装redis操作 在关于web+lua+openresty开发中,项目中会大量操作redis, 重复创建连接-->数据操作-->关闭 ...
- openresty开发系列26--openresty中使用redis模块
openresty开发系列26--openresty中使用redis模块 在一些高并发的场景中,我们常常会用到缓存技术,现在我们常用的分布式缓存redis是最知名的, 操作redis,我们需要引入re ...
- openresty开发系列25--openresty中使用json模块
openresty开发系列25--openresty中使用json模块 web开发过程中,经常用的数据结构为json,openresty中封装了json模块,我们看如何使用 一)如何引入cjson模块 ...
- openresty开发系列24--openresty中lua的引入及使用
openresty开发系列24--openresty中lua的引入及使用 openresty 引入 lua 一)openresty中nginx引入lua方式 1)xxx_by_lua ---> ...
随机推荐
- 关于移动端swiper的2种样式重置
手机查看效果地址:猛戳 ,PC端查看可以缩放浏览器窗口看效果~~ 思路:主要考虑选择器优先级大于默认就可以随意撸码 注意:该demo里用的mobile-adaptive.js是让页面以rem自适应,也 ...
- 像素与rem转换
// rem尺寸转换函数开始(function (doc, win) { var docEl = doc.documentElement, resizeEvt = 'orienta ...
- HTML5移动端图片左右切换动画
插件描述:HTML5移动端图片左右切换动画 小海今天要给大家分享一款很不错的图片左右切换焦点图动画,并且支持移动端触摸滑动.功能上,这款HTML5图片播放器支持鼠标滑动.手机端触摸滑动以及自动播放.外 ...
- SharePoint 2013 Search 配置总结
前言:SharePoint 2013集成了Fast搜索以后,搜索的配置有了些许改变,自己在配置过程中,也记录下了一些入门的东西,希望能够对大家有所帮助. 1.配置搜索服务,首先需要启用搜索功能,基本思 ...
- Android细笔记--ContentProvider
Provider的不常见访问方式 Batch access:访问ContentProvider的一中模式,使用该模式可以同时对provider进行多个操作,且支持同时操作多个表.使用时首先构建一个Co ...
- Android屏幕适配
安卓分辨率的相关知识 http://leoray.leanote.com/post/android-resolution Android内存占用公式 系统内存 = 像素宽 * 像素高 * 像素所占用的 ...
- PHP开发之Zend Studio快捷键汇总
应用场景 快捷键 功能 查看快捷键 ctrl+shift+l 显示所有快捷键列表 查看和修改快捷键 打开Window->Preferences->General->keys 修改字体 ...
- 常用API——日期型函数Date
上图 ·声明 var myDate = new Date(); //系统当前时间 var myDate = new Date(yyyy, mm, dd, hh, mm, ss); var myDate ...
- #研发解决方案介绍#基于ES的搜索+筛选+排序解决方案
郑昀 基于胡耀华和王超的设计文档 最后更新于2014/12/3 关键词:ElasticSearch.Lucene.solr.搜索.facet.高可用.可伸缩.mongodb.SearchHub.商品中 ...
- iPhone被盗后怎么?这篇文章只办针对iOS7后的系统
中午准备去吃饭的时候,今天看到Tungbaby的手机被盗后怎么做?http://www.jianshu.com/p/f13f49cd9b90 碰巧我的手机也被盗了.就来分享下我的经验吧.由于我当时是在 ...