1. 程式人生 > >Oracle系列——開發中奇葩問題你遇到幾個(一)

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
'使用者資訊表';
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 端口的方