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 begin13 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 exception48 when others then 49 out_error_msg := '数据库错误:' || sqlerrm; 50 51 end insertSelectedShops;
代码解释:上面的代码using 中有一个参数strSelectedShopID,
最后用execute immediate执行以下。
一定要注意最后拼接的部分,如果是 ' ); '; 这样,就会报“数据库错误:ORA-00911: 无效字符”的错误。