存儲過程merge
㈠ oracle存儲過程 使用游標 比對臨時表和業務表兩張表 相同數據找出來 做標記 在插入臨時表中
使用merge into就可以了。
示例
MERGE INTO bonuses D
USING (SELECT employee_id, salary, department_id FROM employees
WHERE department_id = 80) S
ON (D.employee_id = S.employee_id)
WHEN MATCHED THEN UPDATE SET D.bonus = D.bonus + S.salary*.01
DELETE WHERE (S.salary > 8000)
WHEN NOT MATCHED THEN INSERT (D.employee_id, D.bonus)
VALUES (S.employee_id, S.salary*.01)
WHERE (S.salary <= 8000);
㈡ 在oracle中,大數據量情況下,merge是否比cursor 快啊目前我們存儲過程都是用cursor,但很慢。。
看你的業務邏輯是否復雜.
如果簡單的, 可以一句 merge 語句就處理掉的。
那麼當然優先使用 merge 處理比較好。
假如業務邏輯很復雜, 一句 merge 語句無法處理。
迫不得已,只能使用 游標處理的。
可以嘗試使用 BULK COLLECT
看看是否能有一些性能上面的提升
http://hi..com/wangqing999/blog/item/2ea041cc0d4606037e3e6f20.html
㈢ Oracle使用merge into 編寫存儲過程 遇編譯錯誤:PL/sql: ORA-00926: 缺失 VALUES 關鍵字
Oracle使用猜碼掘merge into 編寫存儲過程 遇編譯錯誤,是設置錯誤造成的,解決方法如下:
1、首先穗核新建存儲過程,Create or ReplaceProcere CHK_SYS_EMP 檢查系統工號。
㈣ 高分求助SQL存儲過程詳細分析,最好每句解釋一下
ALTER procere [dbo].[wvsp_updateTaskStatus]
@ttype int,
@id int,
@status int // 這一段主要是定義存儲過程需要的參數
as
begin 開始存儲過程
if @ttype=0 // 開始判斷 如果傳進來的@ttype=0
begin //開始執行
if (@status=3) //如果(@status=3)
begin //開始執行函數
insert into tb_queuelog([type],mid,code,otherparams,created) //往表名為tb_queuelog的表插入數據,以上為要插入的欄位
select @ttype,mid,code,otherparams,created
from tb_mergequeue
where id=@id //要插入欄位的數據從表tb_mergequeue 搜索出來,與上表要插入的欄位一一對應,搜索條件為:id=@id
delete from tb_mergequeue
where id=@id //刪除tb_mergequeue表中where id=@id的欄位
end //結束@status=3條件循環
else//如果(@status不等於3,進入另一個方法
update tb_mergequeue
set status=@status
where id=@id //更新tb_mergequeue的數據
end //結束(@status不等於3的條件循環
else if(@ttype=1) //如果 (@ttype=1 -- 頁面同步任務
begin開始
if (@status=3)
begin
insert into tb_queuelog([type],mid,code,otherparams,created)
select @ttype,mid,code,otherparams,created
from tb_syncqueue
where id=@id
delete from tb_syncqueue
where id=@id
end
else
update tb_syncqueue
set status=@status
where id=@id
end
select @@rowcount //取得記錄總數
end 結束存儲過程
㈤ mysql 存儲過程 若主鍵沖突則更新,不沖突則插入數據
你可以分兩部份導入
先導入在表裡有IDDATE的更新部份
mysql> UPDATE 表1 SET 列名=(SELECT 列名 FROM 表2
WHERE 表1.IDDATE=表2.IDDATE)
WHERE IDDATE in (SELECT IDDATE FROM 表2);
再導入插入部份
INSERT INTO 表1 (SELECT IDDATE,列名 FROM 表2
WHERE DDATE not in (SELECT IDDATE FROM 表2));
㈥ 存儲過程優化oracle,merge into 表全表和查詢表一部分哪個效率高
merge into主要是要將a與using的表進行一一對比,隨著a表的增大,using後的表查詢的改如渣速度在變慢,主要優化select *from a inner join b on a.id=b.id這條查詢,因為a表在不斷增大,b表的大小如何橡畢,二者的連接關系核悄是什麼,通過執行計劃可以看出。
㈦ 在存儲過程裡面使用mergeinto出錯了,看不出來哪裡錯了
merge into RoomType a using #RoomType b
on b.TypeName=a.TypeName
when matched then
update a --這個a不能要
set a.TypePrice=b.TypePrice
where b.TypeName=a.TypeName
when not matched then
insert into RoomType (這老燃個表好含氏名也不能友散加) values(@TypeName,@TypePrice,@IsTv,@IsKongTiao,
@Remark)
㈧ SQL Server 存儲過程的幾種常見寫法分析
一、多數指令是相同的,包括創建和修正存儲過程的指令。
二、很多細微的指令有不同,具體如下(不僅):
1 mysql支持enum,和set類型,sql server不支持
2 mysql不支持nchar,nvarchar,ntext類型
3 mysql的遞增語句是AUTO_INCREMENT,而mssql是identity(1,1)
MYSQL:create table basic(id int key auto_increment,name varchar(20));
MSSQL: create table basic(id int identity(1,1) , name varchar(20))
4 msms默認到處表創建語句的默認值表示是((0)),而在mysql裡面是不允許帶兩括弧的
5 mysql需要為表指定存儲類型
6 mssql識別符是[],[type]表示他區別於關鍵字(可選用來包含表名、欄位名),但是mysql卻是 `(重音符,也就是按鍵1左邊的那個符號)
7 mssql支持getdate()方法獲取當前時間日期,但是mysql裡面可以分日期類型和時間類型,獲取當前日期是cur_date(),當前完整時間是 now()函數
8 mssql不支持replace into 語句,但是在最新的sql20008裡面,也支持merge語法
9 mysql支持insert into table1 set t1 = 『』, t2 = 『』 ,但是mssql不支持這樣寫
10 mysql插入多行支持這樣寫 insert into tabl1 values (1,1), (1,1), (1,1), (1,1), (1,1), (1,1), (1,1) MSSQL不支持
11 mssql不支持limit語句,是非常遺憾的,只能用top 取代limt 0,N,row_number() over()函數取代limit N,M
12 mysql在創建表時要為每個表指定一個存儲引擎類型,而mssql只支持一種存儲引擎
13 mysql不支持默認值為當前時間的datetime類型(mssql很容易做到),在mysql裡面是用timestamp類型
14 mssql裡面檢查是否有這個表再刪除,需要這樣:
if
exists (select * from dbo.sysobjects where id =
object_id(N'uc_newpm') and OBJECTPROPERTY(id, N'IsUserTable')
= 1)
但是在mysql裡面只需要 DROP TABLE IF EXISTS cdb_forums;
15 mysql支持無符號型的整數,那麼比不支持無符號型的mssql就能多出一倍的最大數存儲
16 mysql不支持在mssql裡面使用非常方便的varchar(max)類型,這個類型在mssql裡面既可做一般數據存儲,也可以做blob數據存儲
17
mysql創建非聚集索引只需要在創建表的時候指定為key就行,比如:KEY displayorder (fid,displayorder)
在mssql裡面必須要:create unique nonclustered index
index_uc_protectedmembers_username_appid on dbo.uc_protectedmembers
(username asc,appid asc)
18 mysql text欄位類型不允許有默認值
19mysql的一個表的總共欄位長度不超過65XXX。
20一個很表面的區別就是mysql的安裝特別簡單,而且文件大小才110M(非安裝版),相比微軟這個龐然大物,安裝進度來說簡直就是.....
21mysql的管理工具有幾個比較好的,mysql_front,和官方那個套件,不過都沒有SSMS的使用方便,這是mysql很大的一個缺點。
22mysql的存儲過程只是出現在最新的版本中,穩定性和性能可能不如mssql。
23 同樣的負載壓力,mysql要消耗更少的CPU和內存,mssql的確是很耗資源。
24php連接mysql和mssql的方式都差不多,只需要將函數的mysql替換成mssql即可。
25mysql支持date,time,year類型,mssql到2008才支持date和time。
26變數賦值
MYsql:變數賦值SELECT @min_price:=MIN(price),@max_price:=MAX(price) FROM shop
MSsql:變數賦值SELECT @min_price=MIN(price),@max_price=MAX(price) FROM shop
三、總的來說,如果是簡單的存儲過程代碼,要修改,不會太難。如果是復雜的系統,要移植會很難很難。