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
代码解释:上面的代码using 中有一个参数strSelectedShopID,
最后用execute immediate执行以下。
一定要注意最后拼接的部分,如果是 ' ); '; 这样,就会报“数据库错误:ORA-00911: 无效字符”的错误。
先说一下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: 无效字符”的错误。
相关文章推荐
- Oracle查询表空间使用情况以及其他查询
- 折腾Oracle问题小菜记[分页存储过程/查询所有表、视图、存储过程/查询表、视图、存储过程字段结构与参数](三)
- 如何根据v$parameter查询Oracle隐含参数
- Oracle 查询表空间使用情况
- [Oracle]ORA-19206: 用于查询或 REF CURSOR 参数的值无效
- oracle技术之oracle查询初始化参数的方法(四)
- Oracle查询表空间使用情况
- oracle查询锁表与解锁情况提供解决方案
- Oracle 多参数查询语句
- 尝试加载 Oracle 客户端库时引发 BadImageFormatException。如果在安装 32 位 Oracle 客户端组件的情况下以 64 位模式运行,将出现此问题。
- 尝试加载 Oracle 客户端库时引发 BadImageFormatException。如果在安装 32 位 Oracle 客户端组件的情况下以 64 位模式运行,将出现此问题。
- 如果出现oracle监听停止的情况,如何处理
- oracle隐含参数查询 $ksppi 和x$ksppcv
- oracle 查询表的大小,表空间的使用情况,默认表空间
- oracle入门(8)——实战:支持可变长参数、多种条件、多个参数排序、分页的存储过程查询组件
- 转:Oracle怎么处理动态SQL.ref cursor与using 参数的结合使用.来自AskTom.
- 在Oracle中查询表的大小、表的占用情况和表空间的大小
- oracle如果因为参数文件损坏无法启动
- oracle技术之oracle查询初始化参数的方法(二)
- 查询ORACLE用户表空间使用情况的SQL语句