oracle动态update语句

本文详细介绍了如何使用MyBatis的动态SQL来解决更新表单时出现的空值问题,包括使用<trim>标签进行条件拼接,以及如何在查询、增加和删除操作中运用动态SQL。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、今天公司项目提交更新表单出错,这个bug交给了我。

2、OK,debugger一下,发现提交的时候后台打印出错,提示大概就是这样  SQLException '17004'  其实很简单,这种错误一般都是说某一列传进来的值为null,因此报错,所以追踪下去,发现是update语句没有做动态传值处理,也就是说需要写成动态sql语句

3、那么Mybatis的动态sql语句是怎么样的呢?

update TableName
<trim prefix="set" suffixOverrides=",">
<if test=" XX!=null and XX!='' ">
XX = #{xx,jdbcType='varchar'},
</if>
<if test=" XX!=null and XX!='' ">
XX = #{xx,jdbcType='varchar'},
</if>
<if test=" XX!=null and XX!='' ">
XX = #{xx,jdbcType='varchar'},
</if>
<trim>

4、解释一下<trim>

官方文档大概意思:<trim>节点标签:trim主要功能是可以在Trim包含的内容前加上某些前缀(prefix),也可以在Trim包含的内容之后加上某些后缀(suffix)还可以把Trim包含内容的首部的某些内容忽略掉(prefixOverrides) ,也可以把Trim包含的内容的尾部的某些内容忽略掉(suffixOverrides)

 

<trim prefix="set" suffixOverrides=",">

所以这行代码的意思是:在前面加上set,去掉最后的逗号。

5、既然都说到update动态sql了那么顺便回顾一下其他动态sql的写法。

6、查询

SELECT    XX,  XX  
     FROM TableName 
     WHERE  1=1
    <if test="XX !=null and XX!='' ">  
     ADN XX LIKE CONCAT(CONCAT('%', #{XX, 
     jdbcType=varchar}),'%')  --模糊查询
    </if>  
    <if test="XX != null and XX != '' ">  
        AND XX = #{XX, jdbcType=INTEGER}  
    </if>   
</if>   

7、增加

insert into TableName
(
<trim suffixOverrides=",">
        <if test="xx!=null and xx!=''">
            xx,
        </if>
        <if test="xx!=null and xx!=''">
            xx,
        </if>
      </trim>
)
values
(
<trim suffixOverrides=",">
        <if test="xx!=null and xx!=''">
            #{xx},
        </if>
        <if xx="name!=null and xx!=''">
            #{xx},
        </if>
      </trim>
)

8、删除

delete from TableName where xx in
 <!-- foreach用于迭代数组元素 
             open表示开始符号
             close表示结束符号
             seprator表示元素间的分割符
             items表示迭代的数组
        -->
        <foreach collection="array" 
               open="(" close=")" 
            separator="," item="xx">
            #{xx}
        </foreach>

9、有问题欢迎指出,谢谢
 

### Oracle UPDATE语句使用方法 #### 单表更新示例 在Oracle数据库中,`UPDATE`语句用于修改现有表中的数据。语法如下: ```sql UPDATE table_name SET column1 = value1, column2 = value2,... WHERE condition; ``` 例如,将部门ID为10的所有员工工资提高10%[^1]。 ```sql UPDATE employees SET salary = salary * 1.1 WHERE department_id = 10; ``` 此命令会找到所有属于部门编号为10的雇员,并将其薪水增加至原来的1.1倍。 #### 多列同时更新 还可以在同一语句内更改多列的数据。比如同时修改供应商名称和地址两个字段的内容[^3]。 ```sql UPDATE suppliers SET supplier_name = 'New Supplier Name', supplier_address = 'New Address' WHERE supplier_id = 1; ``` 这将会把具有特定ID号的供应商的名字及其住址更改为新的值。 #### 跨表关联更新 对于涉及两张或多张表格之间的联合操作,则可以通过子查询的方式实现跨表更新。由于Oracle不提供类似于SQL Server那样的`UPDATE FROM`语法,所以一般采用以下几种形式之一来进行处理[^2]: - **利用MERGE语句** `MERGE INTO target_table t USING source_table s ON (join_condition)` 这种方式允许基于某些条件从源表向目标表插入新行或更新已有行。 - **嵌套子查询** 可以在一个`UPDATE`语句里包含一个返回单一值或者集合的结果集作为设置表达式的组成部分 ```sql UPDATE employee e SET bonus = ( SELECT AVG(salary)*0.1 FROM employees WHERE department_id = e.department_id ) ``` 上述例子展示了如何根据同一部门内的平均薪资计算奖金数额并分配给每位成员。 #### 性能优化技巧 为了提升大批量数据更新的速度,在编写程序逻辑时可考虑运用快速游标特性,即无需预先声明即可直接应用于循环体内;另外就是充分利用ROWID伪列来加速定位待改写的记录位置[^4].
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值