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的程序鎖掉了。
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 '使用者資訊表';View Code
解決方案:原來是"號在作怪,由於生成的表裡面帶了引號,所以當你用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資料進行開發的時候有沒有經常出現一些很奇怪、很納悶、很無厘頭的問題呢。下面是本人使用oracle一段時間遇到的問題小節,在此做個記錄,方便以後再遇到類似的問題能快速解決。如果你是資料庫大蝦或者連續使用oracle資料庫1年以上,這篇文章可以不用看了,此文請直接略過;如果你是
(轉)Eclipse RCP 外掛開發中經常呼叫的幾個方法
在外掛中訪問StatusLine WorkbenchWindow window = PlatfromUI.getWorkbench().getActiveWorkbenchWindow(); IStatusLineManager status = wind
微信小程序開發中怎麽設置轉發(分享)的信息
名稱 href 分享 。。 eight fun debug 定義 程序開發 如果什麽都不設置,轉發時默認名稱是小程序的名稱,轉發的圖片顯示的是當前頁面的截圖,如圖一 如何在自定義轉發信息呢? 在進行轉發的頁面中: Page({ onShareAppMessag
手把手教你Photoshop中的圖層混合模式(一)
這篇教程我們來系統的講解Photoshop中的圖層混合模式。 在圖層面板中,我們可以看到圖層混合模式的下拉列表: 按照效果,圖層的混合模式分為常規模式(正常/溶解),變暗模式(變暗/正片疊底
Android開發之手把手教你寫ButterKnife框架(一)
系列文章目錄導讀: 一、概述 JakeWharton我想在Android界無人不知,無人不曉的吧, ButterKnife這個框架就是出自他隻手。這個框架我相信很多人都用過,本系列部落格就是帶大家更加深入的認識這個框架,ButterKnife截至目前
Android 開發中一些不得不知的坑(二)
如何正確的在ScrollView裡做巢狀 日常開發中,經常會遇到ScrollView巢狀ListView,GridView或者是ViewPager,更有甚者是ScrollView巢狀ScrollView,這樣一來必然會導致一系列的問題,比如ListView顯示
ios 開發中的日期和時間處理(轉)
NSDate儲存的是世界標準時(UTC),輸出時需要根據時區轉換為本地時間 Dates NSDate類提供了建立date,比較date以及計算兩個date之間間隔的功能。Date物件是不可改變的。 如果你要建立date物件並表示當前日期,你可以alloc一個NSDate物件並
Android開發中Notification通知欄的基本用法(總結)
1、Notification的基本使用流程 狀態通知欄主要涉及到2個類:Notification 和NotificationManagerNotification:通知資訊類,它裡面對應了通知欄的各個屬性NotificationManager:是狀態列通知的管理類,負責發通知
Oracle採購模組中的多組織訪問控制(MOAC)
d. 一個新欄位名為‘經營單位’包含在標準SRS介面。對於每一個採購報表或者併發請求使用者,將會被要求去選擇一個經營單位作為引數。這和‘接收報表’(不需要提供‘經營單位’)是不一樣的情況。 下列是採購和接收報表列表(需要‘經營單位’作為必須輸入項)。輸出將會有經營單位名稱的列印。 Buyer Listing
MVC框架中的模型-檢視分離問題(一) —— “你必將業務邏輯由顯示中分離”
說到MVC[1](Model-View-Controller,模型-檢視-控制器),應該說是這些年進行web動態網頁開發最“給力”的框架了。而基於MVC的web應用框架[2](web application framework)也多如繁星。具體到開發某個web專案,就
iOS開發中的ARC記憶體管理機制(1)——基礎概念
由於移動裝置的記憶體資源一般比較少,所以垃圾回收機制的操作會對裝置的效能造成比較明顯的影響,有可能在執行垃圾回收的時候讓移動裝置出現卡頓,這對於使用者來說是很難受的事。 由此蘋果公司提出了ARC方案。 0x01 自動引用計數 自動引用計數(Automatic Ref
jsp中讀取數據庫內容(一)
reat cor mysq ava roo 數據 state imp nav 在jsp中將數據庫表格內容讀出為一個表格,並在表格中添加超鏈接: 1 <%@ page language="java" contentType="text/html; charset=U
salesforce零基礎學習(七十二)項目中的零碎知識點小總結(一)
gin 不同 grant dmi ima -m ron 角色 com 項目終於告一段落,雖然比較苦逼,不過也學到了好多知識,總結一下,以後當作參考。 一.visualforce標簽中使用html相關的屬性使用 曾經看文檔沒有看得仔細,導致開發的時候走了一些彎路。還好得到
【視頻】零基礎學Android開發:藍牙聊天室APP(一)
android入門 mod http 開發 org 薪資 get target 下載 零基礎學Android開發:藍牙聊天室APP第一講 1. Android介紹與環境搭建:史上最高效Android入門學習 1.1 Google的大小戰略 1.2 物聯網與雲計算 1.3
linux驅動開發之framebuffer應用編程實踐(一)
linux驅動開發之framebuffer驅動 1、framebuffer應用編程 (1)打開設備文件 (2)獲取設備信息 宏定義的命令在/linux/fb.h中 不可變信息FSCREENINFO,使用ioctl參數有FBIOGET_FSCREENINFO宏名,表示用ioctl從
Excel數據導入___你hold住麽(一)
excel表格 雲平臺 配置 關閉流 ads div size parent 解析 近期小編跟著團隊一起開發ITOO3.0高校雲平臺項目,當中的收獲是不言而喻滴,在項目中有個導入功能:導入學生信息;導入班級信息:導入教學樓信息等,在不知多
學java,這21個核心技術點你記住了?(一)
java1. JVM相關(包括了各個版本的特性)對於剛剛接觸Java的人來說,JVM相關的知識不一定需要理解很深,對此裏面的概念有一些簡單的了解即可。不過對於一個有著3年以上Java經驗的資深開發者來說,不會JVM幾乎是不可接受的。 JVM作為java運行的基礎,很難相信對於JVM一點都不了解的人可以把ja
機器學習之numpy庫中常用的函數介紹(一)
做的 string idt 維度 數據 round float 數值 array 1. mat() mat()與array的區別: mat是矩陣,數據必須是2維的,是array的子集,包含array的所有特性,所做的運算都是針對矩陣來進行的。 array是數組,數據可以是多
shell中條件測試常用的語法(一)
shell中條件測試常用的語法 shell bashshell中條件測試常用的語法(一)執行條件測試表達式後通常會返回“真”或“假”,就像執行命令後的返回值為0表示真,非0表示假一樣。在bash編程裏,條件測試常用的語法形式如下:說明:(1)語法1與語法2是等價的,
在 Windows Server Container 中運行 Azure Storage Emulator(一):能否監聽自定義地址?
list use contos 域名 嘗試 accounts res conf 是我 我要做什麽? 改 ASE 的監聽地址。對於有強迫癥的我來說,ASE 默認監聽的是 127.0.0.1:10000-10002,這讓我無法接受,所以我要將它改成域名 + 80 端口的方