天天看點

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裡面送出資料,這個時候鎖才會釋放。這也就是為什麼經常看到下面代碼的原因:

4、使用PowerDesigner設計表後生成DDL語句,執行DDL語句後表、字段、關聯鍵都可以正常生成,可是奇怪的問題就來了,你在plsql裡面select * from table1表時,提示表或者視圖不存在,可是你仔細看了好多遍,表明明存在呀。還出鬼了呢。。。

問題描述:我們來看生成的DDL語句

Oracle系列——開發中奇葩問題你遇到幾個(一)
Oracle系列——開發中奇葩問題你遇到幾個(一)

View Code

解決方案:原來是"号在作怪,由于生成的表裡面帶了引号,是以當你用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;

<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裡面經常會遇到表被鎖定的情況,有時需要手動解鎖。

檢視系統的鎖語句:

殺掉鎖表程序語句:(上面的語句會得到兩個字段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開發過程中經常遇到的問題的一些小結。目前為止先整理這麼多,後續會将這個序列繼續下去。