Oracle_merge into 中 using 后的查询表如果有参数的情况
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
1 --说明:把店铺操作界面上选择的店铺插入到线上订单数据库的店铺表里 2 --作者:杨斌 3 --日期:2012-08-09 4 procedure insertSelectedShops( 5 strSelectedShopID in varchar2, --店铺操作界面上选择的店铺ID,是"店铺ID1,店铺ID2,店铺ID3......"的形式。 6 out_error_row out number, --错误行 7 out_error_msg out varchar2 --错误信息 8 ) 9 is 10 11 str_sql varchar2(4000);--定义查询SQL语句变量 12 begin 13 14 out_error_row :=1;--错误行 15 16 str_sql := ' merge into T_XS_SHOP t1 ' || 17 ' using (select shop_id,SHOP_TYPE_ID,TITLE,APPKEY,APPSECRET,SESSIONKEY from t_base_shopup@yb where shop_id in ('||strSelectedShopID||')) t2 ' || 18 ' on (t1.shop_id = t2.shop_id) ' || 19 ' when matched then ' || 20 ' update set t1.title = t2.TITLE, ' || 21 ' t1.pt_id = t2.SHOP_TYPE_ID, ' || 22 ' t1.app_key = t2.APPKEY, ' || 23 ' t1.appsecret = t2.APPSECRET, ' || 24 ' t1.sessionkey = t2.SESSIONKEY, ' || 25 ' t1.createtime = '''|| to_char(sysdate,'YYYY/MM/DD/hh24:mm:ss') || 26 ''' when not matched then ' || 27 ' insert ( ' || 28 ' SHOP_ID, ' || 29 ' PT_ID, ' || 30 ' TITLE, ' || 31 ' APP_KEY, ' || 32 ' AppSecret, ' || 33 ' SessionKey, ' || 34 ' CREATETIME ' || 35 ' ) ' || 36 ' values ' || 37 ' ( ' || 38 ' t2.shop_id,t2.SHOP_TYPE_ID,t2.TITLE,t2.APPKEY,t2.APPSECRET,t2.SESSIONKEY, ''' ||to_char(sysdate,'YYYY/MM/DD/hh24:mm:ss') || 39 ''' ) '; 40 41 out_error_row := 2;--错误行 42 43 execute immediate str_sql; 44 45 out_error_row := 3;--错误行 46 47 exception 48 when others then 49 out_error_msg := '数据库错误:' || sqlerrm; 50 51 end insertSelectedShops;
代码解释:上面的代码using 中有一个参数strSelectedShopID,
最后用execute immediate执行以下。
一定要注意最后拼接的部分,如果是 ' ); '; 这样,就会报“数据库错误:ORA-00911: 无效字符”的错误。