㈠ 用oracle存儲過程將一張表的數據查出插入另一張表
1、創建測試表,
create table test_tbl_1(id number, value varchar2(20));
create table test_tbl_2(id number, value varchar2(20));
㈡ Oracle存儲過程,更新大量數據,如何循環分批次提交
可通過以下方法:
以100條數據為例,如果海量數據可參考。
如test表中有如下數據:
sql">declare
iint;--定義變數
v_countint;--定義變數
v_loopint;--定義變數
begin
selectcount(*)intov_countfromtest;--計算表內數據總數
selectceil(v_count/10)intov_loopfromal;--計算需要循環次數
i:=1;--為i賦值
whilei<=v_looploop--循環退出條件
updatetestsetbegintime=<=10;--執行更新
commit;--提交
i:=i+1;--i依次加1
endloop;--結束循環
end;
㈢ Oracle存儲過程和游標操作
--第一個題目,我的表叫stu,你別忘了改成你的表名
createorreplaceprocerepro7
as
cursorc_emp1isselectename,salfromstu;
venamestu.ename%type;
vsalstu.sal%type;
vnewsalstu.sal%type;
vfdnumber:=0;
begin
openc_emp1;
loop
fetchc_emp1intovename,vsal;
exitwhenc_emp1%notfound;
vfd:=vsal*0.2;
ifvfd<=300
thenupdatestusetsal=sal+vfdwhereename=vename;
vnewsal:=vsal+vfd;
dbms_output.put_line('員工'||vename||'漲了'||vnewsal||'工資');
endif;
endloop;
closec_emp1;
end;
㈣ 在SQL中存儲過程的一般語法是什麼
1、 創建語法
createproc|procerepro_name
[{@參數數據類型}[=默認值][output],
{@參數數據類型}[=默認值][output],
....
]
as
SQL_statements
2、 創建不帶參數存儲過程
--創建存儲過程
if(exists(select*fromsys.objectswherename='proc_get_student'))
dropprocproc_get_student
go
createprocproc_get_student
as
select*fromstudent;
--調用、執行存儲過程
execproc_get_student;
3、 修改存儲過程
--修改存儲過程
alterprocproc_get_student
as
select*fromstudent;
4、 帶參存儲過程
--帶參存儲過程
if(object_id('proc_find_stu','P')isnotnull)
dropprocproc_find_stu
go
createprocproc_find_stu(@startIdint,@endIdint)
as
select*fromstudentwhereidbetween@startIdand@endId
go
execproc_find_stu2,4;
5、 帶通配符參數存儲過程
--帶通配符參數存儲過程
if(object_id('proc_findStudentByName','P')isnotnull)
dropprocproc_findStudentByName
go
createprocproc_findStudentByName(@namevarchar(20)='%j%',@nextNamevarchar(20)='%')
as
select*fromstudentwherenamelike@nameandnamelike@nextName;
go
execproc_findStudentByName;execproc_findStudentByName'%o%','t%';
(4)rowid存儲過程擴展閱讀:
SQL存儲過程優點:
1、重復使用。存儲過程可以重復使用,從而可以減少資料庫開發人員的工作量。
2、減少網路流量。存儲過程位於伺服器上,調用的時候只需要傳遞存儲過程的名稱以及參數就可以了,因此降低了網路傳輸的數據量。
3、安全性。參數化的存儲過程可以防止SQL注入式攻擊,而且可以將Grant、Deny以及Revoke許可權應用於存儲過程。
㈤ oracle存儲過程中動態游標使用rowid的問題
rowid是一個表中某行值的物理地址,這個欄位並不真實存在於表中。。。所以你查詢的時候會報錯!
㈥ oracle 存儲過程中如何用ROWID
1
一般說來,ROWID不是普通的字元串,所以,在與字元比較或做其它運算的時候,需要做轉換.
即:
ROWIDTOCHAR
(x.ROWID)
or
CHARTOROWID(xxxxxxx)
這樣轉換過後,應當能解決你面臨的問題.
2
剔重的過程一般要根據實際情況來做.
比如有完全相同的記錄,有按條件相同的記錄(不完全相同),有固定重復次數的情況,有不是固定重復次數的情況...根據不同的情況,可以採用相應的簡便辦法.
當然,你可以編制統一的剔重過程,就一勞永逸了.流程也很簡單,按照你"關心"的條件進行排序,開游標去一條一條的取,第一條和第二條比,按條件相同,刪除其中一條,比如刪除第二條,那就還用第一條去和第三條比,..直到不同,再用這條不同的和它相臨的下一條比,再比到不同....
如果是完全相同的情況.....
按全表所有欄位分組,取每組最大或最小的....將此查詢建立成新表即可..
㈦ oracle 存儲過程中如何用ROWID
1 一般說來,ROWID不是普通的字元串,所以,在與字元比較或做其它運算的時候,需要做轉換.
即: ROWIDTOCHAR (x.ROWID)
or CHARTOROWID(xxxxxxx)
這樣轉換過後,應當能解決你面臨的問題.
2 剔重的過程一般要根據實際情況來做.
比如有完全相同的記錄,有按條件相同的記錄(不完全相同),有固定重復次數的情況,有不是固定重復次數的情況...根據不同的情況,可以採用相應的簡便辦法.
當然,你可以編制統一的剔重過程,就一勞永逸了.流程也很簡單,按照你"關心"的條件進行排序,開游標去一條一條的取,第一條和第二條比,按條件相同,刪除其中一條,比如刪除第二條,那就還用第一條去和第三條比,..直到不同,再用這條不同的和它相臨的下一條比,再比到不同....
如果是完全相同的情況..... 按全表所有欄位分組,取每組最大或最小的....將此查詢建立成新表即可..
㈧ 資料庫基礎詳解:存儲過程、視圖、游標、SQL語句優化以及索引
寫在文章前:本系列文章用於博主自己歸納復習一些基礎知識,同時也分享給可能需要的人,因為水平有限,肯定存在諸多不足以及技術性錯誤,請大佬們及時指正。
存儲過程 是事先經過編譯並存儲在資料庫中的一段SQL語句的集合。想要實現相應的功能時,只需要調用這個存儲過程就行了(類似於函數,輸入具有輸出參數)。
優點 :
缺點 :
Delete用來刪除表的全部或者部分數據,執行delete之後,用戶需要提交之後才會執行,會觸發表上的DELETE觸發器(包含一個OLD的虛擬表,可以只讀訪問被刪除的數據),DELETE之後表結構還在,刪除很慢,一行一行地刪,因為會記錄日誌,可以利用日誌還原數據;
Truncate刪除表中的所有數據,這個操作不能回滾,也不會觸發這個表上的觸發器。操作比DELETE快很多(直接把表drop掉,再創建一個新表,刪除的數據不能找回)。如果表中有自增(AUTO_INCREMENT)列,則重置為1。
Drop命令從資料庫中刪除表,所有的數據行,索引和約束都會被刪除。不能回滾,不會觸發觸發器。
觸發器(TRIGGER)是由事件(比如INSERT/UPDATE/DELETE)來觸發運行的操作(不能被直接調用,不能接收參數)。在資料庫里以獨立的對象存儲,用於保證數據完整性(比如可以檢驗或轉換數據)。
約束(Constraint)類型:
從資料庫的基本表中通過查詢選取出來的數據組成的虛擬表(資料庫中只存放視圖的定義,而不存放視圖的數據)。可以對其進行增/刪/改/查等操作。視圖是對若干張基本表的引用,一張虛表,查詢語句執行的結果,不存儲具體的數據(基本表數據發生了改變,視圖也會跟著改變)。
可以跟基本表一樣,進行增刪改查操作( 增刪改操作有條件限制,一般視圖只允許查詢操作 ),對視圖的增刪改也會影響原表的數據。 它就像一個窗口,透過它可以看到資料庫中自己感興趣的數據並且操作它們。 好處:
用於定位在查詢返回的結果集的特定行,以對特定行進行操作。使用游標可以方便地對結果集進行移動遍歷,根據需要滾動或對瀏覽/修改任意行中的數據。主要用於互動式應用。它是一段私有的SQL工作區,也就是一段內存區域,用於暫時存放受SQL語句影響的數據,簡單來說,就是將受影響的數據暫時放到了一個內存區域的虛表當中,這個虛表就是游標。
游標是一種能從包括多條數據記錄的結果集中每次提取一條記錄的機制。即游標用來逐行讀取結果集。游標充當指針的作用。盡管游標能遍歷結果中的所有行,但他一次只指向一行。
游標的一個常見用途就是保存查詢結果,以便以後使用。游標的結果集是由SELECT語句產生,如果處理過程需要重復使用一個記錄集,那麼創建一次游標而重復使用若干次,比重復查詢資料庫要快的多。通俗來說,游標就是能在sql的查詢結果中,顯示某一行(或某多行)數據,其查詢的結果不是數據表,而是已經查詢出來的結果集。
簡單來說:游標就是在查詢出的結果集中進行選擇性操作的工具。
讓緩存更高效。對於連接查詢,如果其中一個表發生變化,那麼整個查詢緩存就無法使用。而分解後的多個查詢,即使其中一個表發生變化,對其它表的查詢緩存依然可以使用。分解成多個單表查詢,這些單表查詢的緩存結果更可能被其它查詢使用到,從而減少冗餘的查詢。減少鎖競爭。
索引是對資料庫表中一列或多列的值進行排序的一種結構(說明是在列上建立的),使用索引可快速訪問資料庫表中的特定信息。如果想按特定職員的姓來查找他或她,則與在表中搜索所有的行相比,索引有助於更快地獲取信息。索引的一個主要目的就是加快檢索表中數據,亦即能協助信息搜索者盡快的找到符合限制條件的記錄ID的輔助數據結構。
當表中有大量記錄時,若要對表進行查詢,第一種搜索信息方式是全表搜索,是將所有記錄一一取出,和查詢條件進行一一對比,然後返回滿足條件的記錄,這樣做會消耗大量資料庫系統時間,並造成大量磁碟I/O操作。第二種就是在表中建立索引,然後在索引中找到符合查詢條件的索引值,最後通過保存在索引中的ROWID(相當於頁碼)快速找到表中對應的記錄。
例如這樣一個查詢:select * from table1 where id=10000。如果沒有索引,必須遍歷整個表,直到ID等於10000的這一行被找到為止。有了索引之後(必須是在ID這一列上建立的索引),即可在索引中查找。由於索引是經過某種演算法優化過的,因而查找次數要少的多。可見,索引是用來定位的。
從應用上分, 主鍵索引(聚集) , 唯一索引(聚集/非聚集) , 普通索引 , 組合索引 , 單列索引和全文索引
㈨ 為什麼oracle 隱式游游標+rowid進行存儲過程批量更新慢,造成鎖表,單獨在sql窗體中執行秒過
for 里的語句條件不對,A、B表都沒鏈接條件
另外你這種loop寫法還不如直接寫一個update,反正也沒有做到分批提交。
要分批提交,最簡單定義個變數,每次循環+1,5000一次commit這樣寫
if mod(i,5000)= 0 then
commit;
endif;
㈩ oracle刪除多張表數據, 存儲過程
報什麼錯,能把錯誤貼一下嗎
另外注意delete語句和select還是有區別的,delete時只能刪除滿足條件的行,所以在delete後面不用指定列欄位,即
delete D2_HC t where fkpkid in (d2_cpkid) and hctype='2';