存儲過程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
三、總的來說,如果是簡單的存儲過程代碼,要修改,不會太難。如果是復雜的系統,要移植會很難很難。
