一、merge into插入數據出現主鍵沖突?
在后臺中開發了一個存儲過程用到merge into,主要是根據主鍵值來查看目標表中是否有該主鍵值,如果有進行更新,否則插入,然而在測試過程中經常出現ORA-00001 主鍵沖突。
前端開發人員口口聲聲說傳入的數據不會有重復值,懷疑數據庫的問題。我相信Oracle不會有這樣的bug。
索性我在后臺演示出現該錯誤的方法。
1、創建測試表
create table T_TEST
(
A CHAR(1),
B NUMBER
)
2、創建測試存儲過程
create or replace procedure test(i_num in number) is
begin
MERGE INTO t_test t
USING (SELECT '1' a, ROWNUM b FROM DUAL CONNECT BY ROWNUM <= i_num) TA
ON (t.a = TA.a)
WHEN MATCHED THEN
UPDATE SET T.b = t.b + TA.b
WHEN NOT MATCHED THEN
INSERT VALUES (TA.a, TA.b);
commit;
end test;
3、執行存儲過程test
SQL> exec test(12);
PL/SQL procedure successfully completed
SQL> select * from t_test;
A B
- ----------
1 12
1 11
1 10
1 9
1 8
1 7
1 6
1 5
1 4
1 3
1 2
1 1
12 rows selected
SQL>
4、清空t_test
SQL> truncate table t_test;
Table truncated
SQL>
5、添加主鍵
SQL> ALTER TABLE T_TEST ADD CONSTRAINT PK_T_TEST PRIMARY KEY (A) USING INDEX;
Table altered
6、在t_test中添加一行數據
SQL> exec test(1);
PL/SQL procedure successfully completed
SQL> select * from t_test;
A B
- ----------
1 1
7、此時嘗試再次添加多行數據,此時會出現錯誤ORA-30926,原因是在Using選項后面中a有多個重復值
SQL> exec test(10);
begin test(10); end;
ORA-30926: 無法在源表中獲得一組穩定的行
ORA-06512: 在 "TEST.TEST", line 3
ORA-06512: 在 line 1
SQL>
8、清空t_test
SQL> truncate table t_test;
Table truncated
9、嘗試添加多行a值相同的數據,提示主鍵沖突
SQL> exec test(10);
begin test(10); end;
ORA-00001: 違反唯一約束條件 (TEST.PK_T_TEST)
ORA-06512: 在 "TEST.TEST", line 3
ORA-06512: 在 line 1
SQL>
由此可以證明還是由于傳入的數據有重復值導致的。
具體得在程序中繼續跟蹤,好讓他們心服口服。
二、oracle怎么導出數據?
1、打開電腦左下角【開始菜單】,在右側找到【運行】選項2、在彈出的運行欄輸入【cmd】,點擊確定3、在彈出的cmd命令行界面輸入【exp】命令,點擊回車4、此時進入oracle命令行界面,輸入用戶名和密碼,點擊回車5、登錄成功設置導出數據參數,選擇數據文件導出路徑,點擊回車6、參數設置完成,此時進行導出表數據操作7、操作完成找到存放的路徑,可以看到此書生成一個DMP文件。
三、oracle怎樣導出數據?
1、打開oracle數據庫,點擊登陸選項,點擊文件選項,點擊新建選項,最后點擊sql窗口;
2、然后在sql窗口中進行編寫sql語句的操作,勇sql語句進行查詢出想要導出來的數值;
3、然后在查詢出來數據的地方,不要選中數據,把鼠標放到空白單元格處進行鼠標右鍵操作,找到復制到Excel選項;
4、然后在復制到excel中選擇想要保存的格式-->作為xls保存,打開后則是excel形式的數據;
5、默認的保存路徑-->將鼠標放在excel名稱上-->會出現路徑-->根據路徑打開即可。
四、oracle數據庫里怎么把字體調大?
說的不太清楚
1,加大字體是在界面CSS上設置字號大小的
2,表示單個字節可以放多少個字
五、oracle數據庫如何造數據?
oracle數據庫造數據的方法無非兩種:
一個是使用oracle的建庫工具dbca,這是一個圖形界面工具,而且使用起來也方便且容易理解。
另一種方法就是手工庫,這也就是我們今天要討論的內容。
手工建庫比起使用dbca建庫來說,是比較麻煩的,但是如果我們學好了手工建庫的話,就可以使我們更好的理解oracle數據庫的體系結構。
六、怎么把oracle數據導入sqlserver數據?
可以的
1、在目的SQL Server數據庫服務器上安裝ORACLE Client軟件或者ORACLE ODBC Driver.
通過oracle客戶端,在netmanager中建立“服務(TNS server)”,并測試連接上oracle數據庫正常
2、在sqlserver的DTS(導入和導出數據工具)進行
(1)選擇數據源:
數據源:oracle in oracle9i
選擇:用戶/系統DSN:
點擊新建DSN:選擇數據源類型:系統數據源,
下一步:選擇驅動程序:oracle in oracle9i,下一步,完成 ,
進入oracle odbc driver configration頁面
再輸入:datasorce name:GZDS
TNS server name:gz(通過netmanager定義好TNS server)
user:(oracle登錄用戶)
填寫好以后,進行"TEST Connection"
可以連通,則點擊“ok”,DSN建立完成
數據源選擇完成,點擊“下一步”進入“選擇目的”
(2)選擇目的
目的:用于SQL Server的Microsoft OLE DB提供程序
服務器:192.168.0.63
選擇:使用sqlserver身份登錄
用戶名:sa 密碼:pass
并刷新,選擇好數據庫:test(目的數據庫,提前建立好的)并點擊“下一步”
a.從數據源復制表和數據(下一步:選擇源表及視圖)
b.用一條查詢語句指定要傳輸的數據(進行sql編輯)
(通過以上選擇好要復制的數據表或者相關視圖)
再點擊下一步“保存、調度和復制包”
(3)“保存、調度和復制包”
時間:立即運行
再點擊下一步:進行:“正在完成DTS導入導出”向導
(4)完成:
點擊:“完成”按鈕,系統進入數據復制“正在執行包”的頁面,
可以看到數據正在復雜的進度條
注意:在ORACLE表和SQL Server表之間'轉換'那步很重要,
可以改變默認的字段數據類型,如image->text,decimal->int
七、oracle全局數據庫和oracle實例?
全局數據庫和實例,只有在集群時才有區別。一個全局數據庫對應多個實例。
八、Oracle使用Merge into有沒有簡單的寫法?一條數據原表沒有。怎么刪除目標表的這行數據?
必須都要寫一遍,你這要刪除需要按條件delete啊,merge的原理你要弄明白啊,merge是根據源表對目標表進行匹配查詢,匹配成功時更新,不成功時插入
九、oracle怎么批量insert數據?
百萬級的數據量真的不算大,使用一些常用的同步就好了,創建一個DBLINK,然后使用MERGE就可以了,兩個庫中的主鍵不一樣,就從對方的庫中抽過來(INSERT 操作),相同則更新(UPDATE操作)
或者使用觸發器也可以,當數據有變動時,自動執行相應的操作寫入到對方庫中。
十、oracle 數據庫性能?
一、數據庫性能指標
數據庫性能一般用兩個方面的指標來衡量:響應時間和吞吐量。響應越快,吞吐量越大,數據庫性能越好。
1. 操作系統有關的指標:CPU平均利用率、內存平均占用率、硬盤占用率、I/O數量、網絡時延
2. 數據庫有關的指標:I/Owait、Mem平均使用率、cpu平均使用率、在一次I/O操作中所讀的最大BLOCKS數、Log的增長情況、數據庫的訪問速度、數據庫能支持的最大用戶數、數據庫CACHE命中率、不同數據庫參數下的性能情況、鎖的處理
二、Oracle
注:以下指標取自Oracle的性能分析工具Statspack所提供的性能分析指標。
1.關于實例效率(Instance Efficiency Percentages)的性能指標
(1)緩沖區未等待率(Buffer Nowait %)
指在緩沖區中獲取Buffer的未等待比率。該指標的值應接近100%,如果該值較低,則可能要增大buffer cache。
(2)Redo緩沖區未等待率(Redo NoWait %)
指在Redo緩沖區獲取Buffer的未等待比率。該指標的值應接近100%,如果該值較低,則有2種可能的情況:
1.online redo log沒有足夠的空間;
2.log切換速度較慢。
(3)緩沖區命中率(Buffer Hit %)
指數據塊在數據緩沖區中的命中率。
(4)內存排序率(In-memory Sort %)
指排序操作在內存中進行的比率。當查詢需要排序的時候,數據庫會話首先選擇在內存中進行排序,當內存大小不足的時候,將使用臨時表空間進行磁盤排序,但磁盤排序效率和內存排序效率相差好幾個數量級。
(5)共享區命中率(Library Hit%)
該指標主要代表sql在共享區的命中率。
(6)軟解析的百分比(Soft Parse %)
該指標是指Oracle對sql的解析過程中,軟解析所占的百分比。軟解析(soft parse)是指當Oracle接到Client提交的Sql后會首先在共享池(Shared Pool)里面去查找是否有之前已經解析好的與剛接到的這一個Sql完全相同的Sql。當發現有相同的Sql就直接用之前解析好的結果,這就節約了解析時間以及解析時候消耗的CPU資源。
(7)閂命中率(Latch Hit%)
指獲得Latch的次數與請求Latch的次數的比率。