當前位置:首頁 » 編程語言 » oraclesql總結

oraclesql總結

發布時間: 2023-02-05 15:33:06

sqlServer2005移植到Oracle10g經驗總結

此次需要完成的目標是將庫從SQLServer 完整的移植到Oracle g中 包括表結構 數據 視圖 函數以及存儲過程的移植 移植主要基於Oracle的OMWB(Oracle Migration Workbench)來完成 盡管OMWB能幫助完成大部分具備難度的工作 但還是有很多工作量的事情需要在OMWB完成後來手工進行 所以整個移植過程工作量看起來會非常大 但是不是僅僅只有工作量的問題呢?我覺得不是 寫下這篇blog以便需要進行此項操作的同學以及給自己做個備忘

由於目前OMWB僅支持SQLServer 根據官方網站的消息 OMWB的下一版會推出對SQLServer 的支持 所以在目前的情況下只能先把庫從SQLServer 移植到SQLServer 這就是我們移植過程的第一步了

一 SQLServer >SQLServer

一直以來 版本要降級都是很困難的 因為在新版本中必然會有些新的特性 而如果剛好湊巧你使用到了這些特性的話 在降級到低版本時就會碰到一些問題 在經過幾次的嘗試後 總結而言 這個過程還是比較容易做的 畢竟是同樣的資料庫 再怎麼樣也不會出太大的問題 不過也沒有像將庫從SQLServer 升級為SQLServer 那麼簡單 整個移植過程這么進行

基於SQLServer 的數據導出將表結構和數據導入到SQLServer

這步中需要注意的是默認情況下SQLServer會將表和視圖一起導入 在這里不要選擇視圖 否則導入到SQLServer 後有些視圖會變成表 選擇需要導入的表後基本上這步不會出現什麼問題 可以完成表結構和數據的移植

基於SQLServer 的生成腳本將視圖/函數/存儲過程移植到SQLServer

這步需要慢慢來 因為在視圖/函數/存儲過程中你可能使用到了一些SQLServer 的新特性 如果碰到這樣的情況 只能是手工進行修改 以使它完全符合SQLServer 的要求 盡管在生成腳本時你可以選擇生成的目標版本為SQLServer 但還是會有部分腳本執行是會出錯的

在完成了SQLServer 到SQLServer 的移植後 就可以基於OMWB來把庫從SQLServer 移植到Oracle了 這步盡管有工具 還是會比較的麻煩 總結如下

二 SQLServer >Oracle g

關於如何基於OMWB將庫從SQLServer 移植到Oracle g的操作步驟可參見此篇文檔

op/omwb/

大家現在從oracle官方站下的話可能會找不到sqlserver 的插件包 如果找不到的話可以從這里下載

我在這里要總結的是基於OMWB將庫從SQLServer 移植到Oracle g後還需要手工做的一些事情 不要指望OMWB能無縫的幫你把庫從SQLServer移植到Oracle中 銀彈是不存在的 因此我們需要做些手工的工作完成庫的移植

移植表結構和數據可能會出現的問題

表中欄位的默認值/主鍵/外鍵/索引移植不過去 這些需要手工的進行補充

移植視圖可能會出現的問題

移植過去的視圖可能會出現各種語法錯誤的問題 這需要手工的修正 一般來說都是較為簡單的錯誤

另外一種問題就是有些視圖可能會無法移植過去 這些視圖就只能在對比OMWB的移植報告後找出來手工的進行移植了

移植函數/存儲過程可能會出現的問題

移植過去的函數/存儲過程中可能仍然會有不少的語法問題 例如像SCOPE_IDENTITY() REPLICATE newid()這些OMWB不知道該怎麼處理的函數 還有像返回Table類型的這種函數 這些都只能在移植後手工的來進行糾正 關於函數不同造成的語法錯誤的現象大家可以參看這篇文檔來做SQLServer和Oracle函數的對照

?logID=

移植過去的函數/存儲過程可能編譯是沒有問題 也就是Oracle認為沒有語法問題 但執行起來卻會報錯 像字元串相加 經過OMWB移植後有些字元串相加會替換成|| 但是有些會遺漏 這個時候也只能手工來糾正這些錯誤了

移植過去的函數/存儲過程在執行過程中可能會出現某些表的主鍵值不能為空的現象 造成這種現象的原因多數為在SQLServer中該欄位的默認值定義的為IDENTITY 但在Oracle中沒法賦予這樣的默認值 只能在插入的sql語句中加上對於主鍵欄位的賦值 可採用sequence的方式來生成順序號

移植過去的函數/存儲過程中如果其中的查詢語句是採用字元串的方式 然後動態執行的話 這個時候的查詢語句就得手工修改為符合oracle的語法了 因為OMWB在移植時是不會對字元串形式的查詢語句來做處理的

部分函數/存儲過程會由於OMWB確實無法處理 造成移植不到oracle 這個時候也必須參照OMWB的移植報告找出這些函數/存儲過程來手工移植了

整個移植過程可能會碰到比上面所列出的更多的別的問題 可以看出整個移植過程確實需要耗費不小的工作量 但總體而言 完成的難度並不高

其實真的是這樣嗎?當然不是 就算你完成了上面的移植工作 那也只能說表面看上去移植是完成了 很有可能會出現這個存儲過程語法等等都沒有問題了 但執行的效果和SQLServer就是不一樣 這是為什麼呢?可能會是因為Oracle和SQLServer在並發控制 事務機制上是不同的 而這會影響到程序調用時的sql的編寫 存儲過程的編寫等等 也就是說 在上面的移植過程的工作完成後 還得仔細檢查現在的sql語句/函數/存儲過程是否根據Oracle的機制達到了原來在SQLServer中期望的效果 只有做到這步的效果是一樣的 才可以說移植過程完成了

最後順帶說的就是應該根據Oracle的機制來採用符合oracle優化原則的方法來優化表/視圖/函數/存儲過程 如果不做這步的話 從sqlserver移植到oracle估計意義也不大了 當然 這可以不列為移植過程的工作

lishixin/Article/program/Oracle/201311/16982

⑵ oraclePL/SQL之隱式游標和ref游標總結

游標是構建在PL/SQL中 用來查詢數據 獲取記錄集的指針 它讓開發者 一次訪問結果集中一行記錄 在oracle中提供了兩種游標 靜態游標 ref游標

靜態游標 靜態游標是在編譯的時候就被確定 然後把結果集復制到內存中 靜態游標又分為兩種 隱式游標和顯示游標

ref游標 ref游標是在運行的時候載入結果集

先來看看靜態游標中的隱式游標 在PL/SQL中為所有的SQL數據操縱語句(包括返回一行的select)隱式聲明游標 稱為隱式游標 主要原因是用戶不能直接命名和控制此類游標 當用戶在PL/SQL 中使用數據操縱語句(DML)時 oracle預先定義一個名稱為SQL的隱式游標 通過 檢查隱式游標的屬性獲取與最近執行的SQL語句相關信息 在執行DML語句之後 隱式游標屬性返回信息 隱式游標屬性包括 %found %notfound %rowcount %isopen

%found 只有DML語句影響一行或多行時 %found屬性才返回true declare num number; begin update emp set empno= where empno= ; if sql%found then dbms_output put_line( 存在記錄 ); else dbms_output put_line( 不存在記錄 ); end if; end;

%notfound %notfound屬性作用正好跟%found屬性相反 如果DML語句沒有影響任何行數 則%notfound屬性返回true declare begin delete from emp where empno= ; if sql%notfound then dbms_output put_line( 刪除失敗 ); end if; end;

%rowcount %rowcount屬性返回DML語句影響的行數 如果DML語句沒有影響任何行數 則%rowcount屬性將返回 declare num number; begin update emp set empno= where empno= ; if sql%rowcount= then dbms_output put_line( 不存在記錄 ); else dbms_output put_line( 存在記錄 ); end if; end;

%isopen %isopen屬性判斷SQL游標是否已經打開 在執行SQL語句之後 oracle自動關閉SQL 游標 所以隱式游標的%isopen屬性始終為false

在PL/SQL中向標準的select語句增加單獨的into子句 就可以將從表或視圖中查詢 記錄賦予變數或行變數 需要注意的是select into 語句結果必須有且只能有一行 如果查詢沒有返回行 PL/SQL將拋出no_data_found異常 如果查詢返回多行 則拋出 too_many_rows 異常 如果拋出異常 則停止執行 控制權轉移到異常處理部分(沒有 異常處理 則程序中斷) 在引發異常時 將不使用屬性%found %notfound %rowcount來查明DML語句是否 已影響了行數 declare num number; begin select empno into num from emp where empno= ; if sql%rowcount= or sql%notfound then dbms_output put_line( 不存在記錄 ); else dbms_output put_line( 存在記錄 ); end if; end;

顯示游標 顯示游標是由用戶顯示聲明的游標 根據在游標中定義的查詢 查詢返回的行集合可以 包含零行或多行 這些行稱為活動集 游標將指向活動集中的當前行 顯示游標的操作過程 使用顯示游標的 個步驟 ( )聲明游標 ( )打開游標 ( )從游標中獲取結果集 ( )關閉游標 cursor cursor_name [(parameter[ parameter])] [return return_type] is select_statement; cursor_name 指游標的名稱 parameter 為游標指定輸入參數 return_type 定義游標提取行的行類型 select_statement 為游標定義查詢語句 open 游標名稱 fetch 從游標中提取行 close 關閉游標

打開游標 執行游標中定義的查詢語句 綁定輸入參數 將游標指針指 向結果集的BOF位置 open cursor_name [parameters]

fetch 在打開游標之後 可以從游標中提取記錄 fetch cursor_name into variable_name; fetch 是提取結果集中一行記錄存儲在變數中 每次提取之後 結果集指針 就向前移動一行

close 在處理游標中的所有行之後 必須關閉游標 以釋放分配給游標的所有資源 close cursor_name 用戶可以通過檢查游標屬性來確定游標的當前狀態 顯示游標的屬性如下 %found 如果執行最後一條fetch語句 成功返回行 則%found屬性為true %notfound 如果執行最後一條fetch語句 未能提取行 則%notfound屬性為true %isopen:如果游標已經打開 則返回true 否則返回false %rowcount 返回到目前為止游標提取的行數 %rowcount為數字類型屬性 在第一 次獲取之前 %rowcount為零 當fetch語句返回一行時 則該數加 declare info emp%rowtype; cursor my_cur is select * from emp where empno= ; begin open my_cur; dbms_output put_line(my_cur%rowcount); loop if my_cur%isopen then fetch my_cur into info; exit when my_cur%notfound; dbms_output put_line(info empno); dbms_output put_line(my_cur%rowcount); end if; end loop; close my_cur; end;

使用顯示游標刪除或更新 使用游標時 如果處理過程中需要刪除或更新 在定義游標查詢語句時 必須使用select for update語句 而在執行delete或update時使用 where current of 子句指定游標當前行 cursor cursor_name is select_statement for update[of column] wait/nowait 在使用for update 子句聲明游標之後 可以使用以下語法更新行 update table_name set column_name=column_value where current of cursor_name; update命令中使用的列必須出現在for update of 子句中 select 語句必須只包括一個表 而且delete和update語句只有在打開游標並且提取 特定行之後才能使用 declare cursor cur_emp is select * from emp where sal< for update of sal; num emp%rowtype; begin open cur_emp; loop fetch cur_emp into num; exit when cur_emp%notfound; update emp set sal= where current of cur_emp; end loop; close cur_emp; end;

帶參數的顯示游標 PL/SQL中允許顯示游標接受輸入參數 用於聲明帶參數的顯示游標語法 cursor cursor_name[<param_name> data_type] [return <return type>] is select_statement declare dept_num emp deptno%type; emp_num emp empno%type; emp_nam emp ename%type; cursor emp_cur(deptparam number) is select empno ename from emp where deptno=deptparam; begin dept_num :=&部門編號; open emp_cur(dept_num); loop fetch emp_cur into emp_num emp_nam; exit when emp_cur%notfound; dbms_output put_line(emp_num|| ||emp_nam); end loop; close emp_cur; end;

可以使用循環游標來簡化顯示游標 循環游標隱式打開顯示游標(不需要open) 自動從結果集提取記錄 然後處理完所有記錄自動關閉游標 循環游標自動創建 %rowtype類型的變數並將此變數用做記錄的索引 循環游標語法如下 for record_index in cursor_name record_index是PL/SQL自動創建的變數 此變數的屬性聲明為%rowtype類型 作用 域for循環之內 循環游標的特性有 從游標中提取所有記錄之後自動關閉游標 提取和處理游標中每一條記錄 提取記錄之後%notfound屬性為true則退出循環 如果未有結果集 則不進入循環 declare cursor emp_cur is select * from emp; begin for temp in emp_cur loop dbms_output put_line(temp ename); end loop; end; 循環游標自動打開 提取 關閉 只適用於靜態游標

ref游標 隱式游標和顯示游標都是靜態定義的 它們在編譯的時候結果集就已經被確定 如果想在運行的時候動態確定結果集 就要使用ref游標和游標變數

創建ref游標需要兩個步驟 聲明ref cursor類型 聲明 ref cursor類型變數 語法如下 type ref_cursor_name is ref cursor [return record_type] 其中 return 用於指定游標提取結果集的返回類型 有return表示是強類型ref游標 沒有return表示是弱類型的游標 弱類型游標可以提取任何類型的結果集 定義游標變數之後 就可以在PL/SQL執行部門打開游標變數 open cursor_name for select_statement; declare type emp_cur is ref cursor; my_cur emp_cur; num number; selection varchar( ):= &請輸入編號 ; begin if selection= then dbms_output put_line( 員工信息 ); open my_cur for select deptno from emp; elsif selection= then dbms_output put_line( 部門信息 ); open my_cur for select deptno from dept; else dbms_output put_line( 請輸入員工信息( )或門部信息( ) ); end if; fetch my_cur into num; while my_cur%found loop dbms_output put_line(num); fetch my_cur into num; end loop; close my_cur; end;

在PL/SQL中可以執行動態SQL語句 execute immediate 語句只能語句處理返回單行 或沒有返回的SQL語句 ref游標則可以處理返回結果集的動態SQL ref游標的聲明 方法與普通ref游標相同 只是在open時指定了動態SQL字元串 open cursor_name for dynamic_select_string [using bind_argument_list] declare type sql_cur is ref cursor; my_cur sql_cur; emp_info emp%rowtype; sql_string varchar ( ):= &請輸入查詢字元串 ; begin open my_cur for sql_string; loop fetch my_cur into emp_info; exit when my_cur%notfound; dbms_output put_line(emp_info ename); end loop; close my_cur; end;

lishixin/Article/program/Oracle/201311/18462

⑶ 總結Oracle與mysql在SQL語言方面的不同點

1 id遞增 oracle使用sequence ;mysql使用auto_increment

2 分頁 oracle使用rownum(3個select語句);mysql使用limit

3 當前時間 oracle:sysdate;mysql:now()

4 數據類型不同!--具體的查資料!

目前想到的就這些,呵呵……

⑷ oracle sql

substr(substr(content_clob,1,instr(content_clob,'的')-1),-length(content_clob),50)

⑸ ORACLE 和 SQL區別

這兩種資料庫在不同方面都有著很大的區別,以下是具體的區別:

1.開放性: 1. SQL Server 只能在windows上運行,沒有絲毫的開放性,操作系統的系統的穩定對資料庫是十分重要的。Windows9X系列產品是偏重於桌面應用,NT server只適合中小型企業。而且windows平台的可靠性,安全性和伸縮性是非常有限的。它不象unix那樣久經考驗,尤其是在處理大資料庫。 2. Oracle 能在所有主流平台上運行(包括 windows)。完全支持所有的工業標准。採用完全開放策略。可以使客戶選擇最適合的解決方案。對開發商全力支持。

2.可伸縮性:並行性 1. SQL server 並行實施和共存模型並不成熟,很難處理日益增多的用戶數和數據卷,伸縮性有限。 2. Oracle 並行伺服器通過使一組結點共享同一簇中的工作來擴展windownt的能力,提供高可用性和高伸縮性的簇的解決方案。如果windowsNT不能滿足需要,用戶可以把資料庫移到UNIX中。Oracle的並行伺服器對各種UNIX平台的集群機制都有著相當高的集成度。

3.性能: 1. SQL Server 多用戶時性能不佳 2. Oracle 性能最高, 保持開放平台下的TPC-D和TPC-C的世界記錄。

4.客戶端支持及應用模式 :1. SQL Server C/S結構,只支持windows客戶,可以用ADO、DAO、OLEDB、ODBC連接。 2. Oracle 多層次網路計算,支持多種工業標准,可以用ODBC、JDBC、OCI等網路客戶連接。

5.操作簡便性: 1. SQL Server 操作簡單,但只有圖形界面。 2. Oracle 較復雜,同時提供GUI和命令行,在windowsNT和unix下操作相同。

6.使用風險性 :1. SQL server 完全重寫的代碼,經歷了長期的測試,不斷延遲,許多功能需要時間來證明。並不十分兼容。 2. Oracle 長時間的開發經驗,完全向下兼容。得到廣泛的應用。完全沒有風險。

7.價格:ORACLE貴過SQLSRVER

⑹ 使用oracle資料庫總結

去ORACLE的網站下載一個個人版本的ORACLE安裝程序,下個10G版本吧
然後安裝,全點下一步,或者你看他給你的中文提示下一步安裝就可
建立資料庫的話安裝會給你裝的
裝完要配置NET MANAGER里的監聽程序 點添加資料庫 輸服務名和路徑
然後還要配置服務名
然後就可以用SQL PLUS登陸了
默認的帳戶
sys 密碼 change_on_install
system密碼 manager
裝完cmd sqlplus /nolog 然後conn sys/change_on_stall as sysdba
默認的話會有個樣本用戶scott下面有一些表 裡面還有數據,但是scott用戶默認是鎖定的,上面conn sys/change_on_stall as sysdba以後,再輸alter user scott account unlock;然後就可以conn scott/tiger了,然後就可以select * from emp;了記得連接完後一般SQL語句都要用『;』分號結束。

簡單說了下,裡面還有很多細節,可以加我HI BAIDU
最好找本oracle 10g入門的書看看

⑺ 總結MySql,Mssql,Oracle的優缺點和異同

1。oracle體積最大,MsSQL體積大,MySQL體積小。
2。MsSQL只能用在Windows下,MySQL、oracle是多平台的.
3.MsSQL要錢,MySQL免費的(windows下是收費的,但很少),oracle(免費使用)官方提供下載,呵呵
如果要技術支持
巨貴。

熱點內容
奧維地圖伺服器地址怎麼填 發布:2024-04-25 12:40:04 瀏覽:965
低配置游戲玩哪個平台 發布:2024-04-25 12:35:04 瀏覽:559
glinux下載 發布:2024-04-25 12:30:09 瀏覽:84
安卓手機可以用的谷歌叫什麼 發布:2024-04-25 12:05:57 瀏覽:943
linux改變用戶所屬組 發布:2024-04-25 11:50:33 瀏覽:469
rsa加密演算法java代碼 發布:2024-04-25 11:40:07 瀏覽:883
如何改變拉桿箱上的初始密碼 發布:2024-04-25 11:17:23 瀏覽:799
內網掛代理虛擬機如何配置網卡 發布:2024-04-25 11:15:06 瀏覽:687
明日之後緩存怎麼清理 發布:2024-04-25 11:14:56 瀏覽:205
華為mate30怎麼退回安卓版 發布:2024-04-25 11:08:49 瀏覽:898