sqlfororacle
實現方式錯了,批量移動數據應該使用Cursor,而不是像分頁那樣每次都查詢。
每次都查詢可能會導致重復數據。
正確方式應該是打開一個Cursor,循環Cursor來插入,使用計數器來控制每次COMMIT的行數:
declare
TYPE R_CURSOR IS REF CURSOR;
i number;
a1_cursor R_CURSOR;
a1_row A1%ROWTYPE;
begin
open a1_cursor FOR
select ID, NAME from A1;
i := 0;
loop
fetch a1_cursor
into a1_row;
exit when a1_cursor%notfound;
INSERT INTO A2 VALUES a1_row;
i := i + 1;
if i >= 5 then
commit;
i := 0;
end if;
end loop;
close a1_cursor;
commit;
end;
『貳』 在sqlserver中 與oracle的表連接查詢
在我們使用SQL Server資料庫的過程中,有時需要將SQL Server數據導出,導入到其他的資料庫中,比如導入到Oracle中。
假設要將SQL Server中的Northwind資料庫中的Procts表導出到Oracle的Scott用戶
首先需要有安裝SQL Server企業版
1.打開工具:
開始->程序->
導入和SQL Server數據導出數據
2.下一步,選擇數據源
[數據源]選擇「用於SQL Server的Microsoft OLE DB提供程序」,這應該是預設值。
[伺服器]選擇要導出數據的伺服器,如果是本機,選擇(local)
[資料庫]選擇要導出的數據所在的庫,這里選擇Northwind
3.下一步,選擇目的
[目的]選擇Microsoft ODBC for Oracle
[DSN]選擇用戶/系統DSN一項,然後在下拉列表框中找一個已經連接到了Scott用戶的DSN名稱。
如果下拉列表中沒有,點下拉列表框右側的[新建],出現創建新數據源界面。
接下來選擇系統數據源,下一步,在驅動程序列表中選擇Microsoft ODBC for Oracle
下一步,完成,出現Microsoft ODBC for Oracle安裝界面
[數據源名稱]隨便輸入,比如sss
[說明]可以不填
[用戶名稱]填入要SQL Server數據導出到的Oracle用戶名稱,這里是scott
[伺服器]填入要連接到Oracle伺服器所使用的服務名,比方說使用sqlplus scott/tiger@server1可以連接到資料庫,那麼這里就填入server1。如果本機就是伺服器,使用sqlplus scott/tiger即可連接到資料庫,這里空著不填即可。
這樣就創建好了一個數據源sss,保證下拉列表框中選擇了sss一項。
[用戶名]填入SQL Server數據導出到的Oracle用戶名稱,這里是scott
[密碼]填入SQL Server數據導出到的Oracle用戶使用的密碼,這里是tiger
4.下一步,指定表復制或查詢
如果要導出的內容是整個表,選擇[從源資料庫復製表和視圖]
如果要導出的內容是表的一部分列,行,可以選擇[用一條查詢指定要傳輸的數據],這時需要寫出一個查詢語句
這里選擇第一項[從源資料庫復製表和視圖]
5.下一步,選擇源表和視圖
點中要導出的表Procts一行的復選框,目的、轉換兩欄就會出現內容。
目的可以用來選擇表名。轉換可以用來修改列的數據類型或是整個建表的SQL語句
6.下一步,保存、調度和復制包
選中立即運行
7.下一步,正在完成DTS導入/導出向導
8.完成
提示「成功地將n個表從Microsoft SQLServer復制到了Oracle」
9.完成,關閉導入導出程序
注意:因為oracle的表名都是大寫的,而SQL的表可能是大小混寫的,所以導入後在oracle里查不到該表,比如這個Procts表在oracle里查詢就應該寫成select * from scott."Procts";為了方便查詢可以通過批量修改表名為大寫以便後面導數據的工作。
---導完數據後執行下面語句,生成把表名修改成大寫的操作
select 'ALTER TABLE '||'"'||table_name||'"'||' RENAME TO '|| upper(table_name)||';' from user_tab_comments;
把生成的文件執行即可把此用戶下的所有表名修改成大寫。
『叄』 如何使用oracle提供的SQL
使用oracle提供的SQL跟其他資料庫一樣,都是標準的sql語句。
Oracle基本語法集錦
1、表
create table test (names varchar2(12),
dates date,
num int,
dou double);
2、視圖
create or replace view vi_test as
select * from test;
3、同義詞
create or replace synonym aa
for dbusrcard001.aa;
4、存儲過程
create or replace proce dd(v_id in employee.empoy_id%type)
as
begin
end
dd;
5、函數
create or replace function ee(v_id in employee%rowtype) return varchar(15)
is
var_test varchar2(15);
begin
return var_test;
exception when others then
end
6、三種觸發器的定義
create or replace trigger ff
alter delete
on test
for each row
declare
begin
delete from test;
if sql%rowcount < 0 or sql%rowcount is null then
rais_replaction_err(-20004,"錯誤")
end if
end
create or replace trigger gg
alter insert
on test
for each row
declare
begin
if :old.names = :new.names then
raise_replaction_err(-2003,"編碼重復");
end if
end
create or replace trigger hh
for update
on test
for each row
declare
begin
if updating then
if :old.names <> :new.names then
reaise_replaction_err(-2002,"關鍵字不能修改")
end if
end if
end
7、定義游標
declare
cursor aa is
select names,num from test;
begin
for bb in aa
loop
if bb.names = "ORACLE" then
end if
end loop;
end
8、速度優化,前一語句不後一語句的速度快幾十倍
select names,dates
from test,b
where test.names = b.names(+) and
b.names is null and
b.dates > date('2003-01-01','yyyy-mm-dd')
select names,dates
from test
where names not in ( select names
from b
where dates > to_date('2003-01-01','yyyy-mm-dd'))
9、查找重復記錄
select names,num
from test
where rowid != (select max(rowid)
from test b
where b.names = test.names and
b.num = test.num)
10、查找表TEST中時間最新的前10條記錄
select * from (select * from test order by dates desc) where rownum < 11
11、序列號的產生
create sequence row_id
minvalue 1
maxvalue 9999999999999999999999
start with 1
increment by 1
insert into test values(row_id.nextval,....)
『肆』 提問:我的 Navicat for Oracle ,寫SQL語句時,自帶的 代碼提示工具 不好用了,寫代碼時,沒有提示。
題主是不是沒有用完全限定的表名才會這樣,舉個例子吧,
select ID
from proct;
這樣子欄位ID是不會有代碼提示補全的;
只有寫:
select proct.ID
from proct;
才會有代碼提示~
又或者是軟體選項的問題,打開「工具」--「選項」--「常規」--「代碼附加選項」都打上勾看是否能解決
『伍』 sqldevelope怎麼遠程連接oracle資料庫
第一種情況:
若oracle伺服器裝在本機上,那就不多說了,連接只是用戶名和密碼的問題了。不過要注意環境變數%ORACLE_HOME%/network/admin/是否設置。
第二種情況:
本機未安裝oracle伺服器,也未安裝oracle客戶端。但是安裝了pl sql development、toad sql development、sql navigator等管理資料庫的工具。在虛擬機或者另一台電腦上安裝了oracle伺服器,也就是虛擬機或者另一台電腦此時作為伺服器。
這種情況下,本人以pl sql development遠程連接ORACLE服務端資料庫為例:
1、在安裝oracle伺服器的機器上搜索下列文件:
oci.dll
ocijdbc10.dll
ociw32.dll
orannzsbb10.dll
oraocci10.dll
oraociei10.dll
sqlnet.ora
tnsnames.ora
classes12.jar
ojdbc14.jar
把這些找到的文件復制放到一個文件夾,如 oraclient,將此文件夾復制到客戶端機器上。如放置路徑為 D:oraclient。
2、配置tnsnames.ora,修改其中的資料庫連接串。
oracledata = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.58)(PORT = 1521)) (CONNECT_DATA = (SERVICE_NAME = oracledata) )
其中,oracledata是要連接的服務名;HOST = 192.168.0.58,是伺服器IP地址;PORT = 1521是埠號。
3、添加第一個環境變數,名為TNS_ADMIN,值為tnsnames.ora文件所在路徑(如:D:oraclient,特別是重裝後或其它操作,忘了TNS_ADMIN變數,plsql登陸就會報無法解析指定的連接標識符),這是為了能夠找到上面說的tnsnames.ora。這步是最重要的。
添加第二個環境變數(可有可無):逗NLS_LANG = SIMPLIFIED CHINESE_CHINA.ZHS16GBK地,(AMERICAN_AMERICA.US7ASCII 是ASCII編碼類型,其它類型可自己到伺服器看一下或網上查找一下)(本步驟暫時要做對,如果編碼不對,會產生亂碼)。
4、下載並安裝PL SQL Developer配置應用:
打開PL SQL Developer,登入界面點取消,進入後選擇菜單欄 tools->preferences->connection :
Oracle Home=D:oracleclient OCI library=D:oracleclientoci.dll
5、再次打開plsql則會在database中有oracledata 選項輸入用戶名密碼就可以登陸。
第三種情況:
本機未安裝ORACLE伺服器,但是安裝了oracle客戶端,也安裝了pl sql development、toad sql development、sql navigator等管理資料庫的工具。在虛擬機或者另一台電腦上安裝了oracle伺服器,也就是虛擬機或者另一台電腦此時作為伺服器。
這種情況下,本人以pl sql development遠程連接oracle服務端資料庫為例:
1、打開oracle客戶端中的net manager,配置要遠程連接的資料庫名、IP地址等,如果net manager中沒有要遠程連接的資料庫名,則新建即可。
2、其他步驟與第二種情況中的2---5相同。
第四種情況:
本機未安裝oracle伺服器,也未安裝pl sql development、toad sql development、sql navigator等管理資料庫的工具,但是安裝了oracle客戶端。在虛擬機或者另一台電腦上安裝了ORACLE伺服器,也就是虛擬機或者另一台電腦此時作為伺服器。
這種情況下,本人以oracle客戶端中的sqlplus遠程連接oracle服務端資料庫為例:
1、打開oracle客戶端中的net manager,配置要遠程連接的資料庫名、IP地址等,如果net manager中沒有要遠程連接的資料庫名,則新建即可。
2、同第二種情況中的步驟二。
3、同第二種情況中的步驟三。
4、打開sqlplus:
(1)如果用sys用戶登入,則用戶名:sys 密碼:xxxxxx 主機字元串:要連接的資料庫名 as sysdba,登入即可。
(2)如果用其他用戶登入,則用戶名:xxx 密碼:xxxxxx 主機字元串:要連接的資料庫名,登入即可。
注意事項:
1、伺服器端和客戶端防火牆需要關閉;
2、我們經常會遇到***服務無法啟動,那麼需要打開Net Configuration Assistant修復,或者新建***服務。
3、資料庫密碼如果忘了怎麼辦看按照以下方法修改密碼即可:
開始-->運行-->cmd
輸入 :sqlplus /nolog 回車
輸入 :connect / as sysdba 回車
用戶解鎖 : alter user system account unlock 回車
修改密碼:alter user system identified by manager
4、怎樣判斷資料庫是運行在歸檔模式下還是運行在非歸檔模式下看
進入dbastudio,歷程--〉資料庫---〉歸檔查看。
5、另外,如果本機和別的機子均安裝了oracle伺服器端,那麼本機如果要連接別的機子,就必須修改tnsnames.ora.
『陸』 sql server2005 建立連接伺服器時訪問介面沒有microsoft ole db provider for oracle選項
需要在「伺服器對象」——>「鏈接伺服器」——>「訪問介面」下,找到OraOLEDB.Oracle選項,單擊右鍵選擇屬性,然後在訪問介面選項下勾選「允許進程內」(Allow inprocess),即可解決上面問題,有時候,可能需要重新新建此鏈接伺服器。
『柒』 sql怎樣跨資料庫查詢oracle
假定您現在擁有一個以Microsoft.NET為架構的網路訂購系統,但是品管維護系統卻仍然使用一套舊式的Oracle資料庫應用程序。當您的顧客在產品保固期間下了產品更換之類的訂單,則該筆訂單將不收取任何費用。此時您需要從Oracle資料庫得到實時的查詢結果。借著建立連結伺服器的方式(linkedServer),您將可以從SQLServer實時查詢出位於Oracle資料庫的顧客資料,找出誰是您既有的客戶。
當您的資料分散在不同的SQLServer資料庫時,藉由連結伺服器可讓您執行跨伺服器之分布式查詢。當所有的資料庫伺服器都是SQLServer,則連結伺服器的設定十分容易,而且在SQLServer線上手冊中就涵蓋了您所需要了解的所有事項。然而,當部分資料是放在Oracle資料庫伺服器的時候,這就可能帶給您許多挑戰。舉例來說,光是設定連結伺服器就不是一件容易的事。您必須了解到:即是您要在SQLServer的EnterpriseManager設定一個Oracle連結伺服器,這台SQLServer對Oracle來說就是一個客戶端。所以您必須在SQLServer所在的伺服器成功地安裝並組態Oracle之客戶端軟體。因為Oracle提供的產品只支持Oracle8以後的資料庫,所以我假設您正在使用的都是Oracle8以後的資料庫。在OracleNet8函式庫則提供了SQLServer所需要的客戶端軟體。
設定連接伺服器時是利用Microsoft所提供的OLEDB ProviderforOracle,使用的Oracle網路函式庫為SQL*Net2.3.3.0.4或是以後的版本,不過這是Oracle7.3資料庫所提供的。換句話說,要設定Oracle資料庫為SQLServer的連接伺服器時,Oracle資料庫只要是7.3.3.4以後的版本,並搭配適當的SQL*Net或是Net8函式庫即可。
在Oracle資料庫中,一個schema即代表著SQLServer專家們所熟知的單一資料庫(譯者注2)。連接至Oracle資料庫時,您必須提供schema名稱、密碼以及主機聯機字元串(hoststring)。每一個特定的Oracle帳戶都擁有一個Oracleschema,而且只能有一個schema。所以schema名稱其實就等於該schema擁有者的帳戶名稱。您可以查詢Oracle的資料字典(Datadictionary)以得到更多有關schema的內容。
至於Oracle聯機字元串又可稱為服務名稱(servicename)或是系統識別資料(SystenIdentifier,SID)。我們所謂的SQLServer資料庫個體(instance)在Oracle則稱為資料庫(database)。所以安裝OracleServer時,安裝程序OracleUniversalInstaller(為一個圖形介面之安裝程序,與SQLServer的Setup程序類似)將會詢問您SID名稱為何,以作為Oracle資料庫之名稱。
這個部分原作者所提到schema的解釋有點問題。Oracleschema可視為同一個使用者所擁有的所有資料庫對象(schemaobjects)之集合。舉例來說,使用者scott所建立的EMPtable其完整名稱為SCOTT.EMP,而SCOTT就是EMP的schema名稱。所以schemaname其實就是一個Oracle資料庫之使用者帳號。但是絕對不能拿來跟資料庫相提並論!因為SQLServer的資料庫架構包含了datafiles與logfiles,但是Oracle的schemaobjects只存在於tablespace中。為了避免部分讀者產生混淆,特此說明。
『捌』 Oracle PL/SQL 局一中的FOR語句: 用for語句求得前100個自然數中偶數和。
mod(x,y)函數的意義是 求x除以y的余數,例如mod(5,2)=1,5除以2餘1,mod(2,2)=0, 2除以2等於1餘數是0,所以答案是0,這個程序塊就是利用這樣的求余的原理來循環判斷1-100之間的偶數,凡是能被2除盡的就是偶數。
代碼中FOR循環100次,i從100開始反向循環,99,98··以此類推到1截止退出循環。
if mod(i,2)=0 --
mod(i,2)=0的意思是i除以2無余數,如果無余數,則說明i是偶數(只有偶數除以2才能除盡)。
then s:=s+i; --
那麼變數s加上這個偶數i變成新的s,進入到下一個循環判斷,若非偶數直接進入下個循環,若為偶數s的值累加,直到循環結束,100以內所有的偶數累加成為最終的變數S。