您的位置:首页 > 数据库 > Oracle

Oracle_merge into 中 using 后的查询表如果有参数的情况

2012-08-11 15:57 357 查看
Oracle_merge into 中 using 后的查询表如果有参数的情况。

先说一下merge into 的基本语法

/*语法:
MERGE [INTO [schema .] table [t_alias]
USING [schema .] { table | view | subquery } [t_alias]
ON ( condition )
WHEN MATCHED THEN merge_update_clause
WHEN NOT MATCHED THEN merge_insert_clause;
*/

一般的 using 后是跟着一个具体的表名,但实际的开发中有时是带参数的情况,

以上的语法就不适合了,个人认为用动态的拼接字符串的方法,来解决问题。

我们来举例解释:

假设我们要 把店铺操作界面上选择的店铺插入到线上订单数据库的店铺表里,

从界面上的操作返回的是"店铺ID1,店铺ID2,店铺ID3......"的形式。

代码如下:

View Code

--说明:把店铺操作界面上选择的店铺插入到线上订单数据库的店铺表里
--作者:杨斌
--日期:2012-08-09
procedure insertSelectedShops(
strSelectedShopID in varchar2,      --店铺操作界面上选择的店铺ID,是"店铺ID1,店铺ID2,店铺ID3......"的形式。
out_error_row out number,           --错误行
out_error_msg out varchar2          --错误信息
)
is

str_sql varchar2(4000);--定义查询SQL语句变量
begin

out_error_row :=1;--错误行

str_sql := ' merge into T_XS_SHOP t1 ' ||
' using (select shop_id,SHOP_TYPE_ID,TITLE,APPKEY,APPSECRET,SESSIONKEY from t_base_shopup@yb where shop_id in ('||strSelectedShopID||')) t2 ' ||
' on (t1.shop_id = t2.shop_id) ' ||
' when matched then ' ||
'   update set t1.title =  t2.TITLE, ' ||
'             t1.pt_id = t2.SHOP_TYPE_ID, ' ||
'             t1.app_key = t2.APPKEY, ' ||
'             t1.appsecret = t2.APPSECRET, ' ||
'             t1.sessionkey = t2.SESSIONKEY, ' ||
'             t1.createtime =  '''|| to_char(sysdate,'YYYY/MM/DD/hh24:mm:ss') ||
''' when not matched then ' ||
'   insert (           ' ||
'           SHOP_ID,   ' ||
'           PT_ID,     ' ||
'           TITLE,     ' ||
'           APP_KEY,   ' ||
'           AppSecret, ' ||
'           SessionKey, ' ||
'           CREATETIME ' ||
'           )          ' ||
'           values     ' ||
'           (          ' ||
'           t2.shop_id,t2.SHOP_TYPE_ID,t2.TITLE,t2.APPKEY,t2.APPSECRET,t2.SESSIONKEY, ''' ||to_char(sysdate,'YYYY/MM/DD/hh24:mm:ss') ||
'''           )  ';

out_error_row := 2;--错误行

execute immediate str_sql;

out_error_row := 3;--错误行

exception
when others then
out_error_msg := '数据库错误:' || sqlerrm;

end insertSelectedShops;


代码解释:上面的代码using 中有一个参数strSelectedShopID,

最后用execute immediate执行以下。

一定要注意最后拼接的部分,如果是 ' ); '; 这样,就会报“数据库错误:ORA-00911: 无效字符”的错误。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐