insert into/update/delete returning into语法

本文详细介绍了在PL/SQL程序设计中使用insertinto/update/delete returning into语法进行数据操作并返回相关信息的方法。包括返回信息的限制条件、具体用法及示例代码。

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

insert into/update/delete returning into语法用于在plsql程序设计中插入一条记录后返回插入的信息
到设定的变量中:
[color=red]注意:rownum不能返回,rowid可以返回。[/color]
[color=darkred]总结:
1,返回的时候直接使用被插入表的字段名称例如:returning rowid,deptno || ',' || dname || ',' || loc这里的rowid,dename,loc都是被插入表中的字段。
2,不能与DML语句和远程对象一起使用;
3,不能检索LONG 类型信息(也就是rownum不能被返回,只能返回rowid)
4,当通过视图向基表中插入数据时,只能与单基表视图一起使用。[/color]
5,update返回的是更新以后的字段的数值。
实例:
declare
v_rownum number;
v_rowid rowid;
v_info varchar2(30);
begin
[color=indigo] insert into dept values(8,'业务部','北京')
returning rowid,deptno || ',' || dname || ',' || loc
into v_rowid,v_info;[/color]
dbms_output.put_line(v_rowid);
dbms_output.put_line(v_info);
end;
输出结果:
SQL> declare
2 v_rownum number;
3 v_rowid rowid;
4 v_info varchar2(30);
5 begin
6 insert into dept values(8,'业务部','北京')
7 returning rowid,deptno || ',' || dname || ',' || loc
8 into v_rowid,v_info;
9 dbms_output.put_line(v_rowid);
10 dbms_output.put_line(v_info);
11 end;
12 /
AAAMfNAAEAAAAAMAAD
8,业务部,北京


PL/SQL procedure successfully completed

2,//更新时返回实例
DECLARE
Row_id ROWID;
info VARCHAR2(40);
BEGIN
UPDATE dept SET deptno=100 WHERE DNAME='财务室'
RETURNING rowid, dname||':'||to_char(deptno)||':'||loc
INTO row_id, info;
DBMS_OUTPUT.PUT_LINE('ROWID:'||row_id);
DBMS_OUTPUT.PUT_LINE(info);
END;
RETURNING子句用于检索被修改行的信息。当UPDATE语句修改单行数据时,RETURNING 子句可以检索被修改行的ROWID和REF值,以及行中被修改列的列表达式,并可将他们存储到PL/SQL变量或复合变量中;[color=red]当UPDATE语句修改多行数据时,RETURNING 子句可以将被修改行的ROWID和REF值,以及列表达式值返回到复合变量数组中。[/color]在UPDATE中使用RETURNING 子句的限制与INSERT语句中对RETURNING子句的限制相同。

3,删除时返回
DECLARE
Row_id ROWID;
info VARCHAR2(40);
BEGIN
DELETE dept WHERE DNAME='办公室'
RETURNING rowid, dname||':'||to_char(deptno)||':'||loc INTO row_id, info;
DBMS_OUTPUT.PUT_LINE('ROWID:'||row_id);
DBMS_OUTPUT.PUT_LINE(info);
END;

RETURNING子句用于检索被删除行的信息:当DELETE语句删除单行数据时,RETURNING 子句可以检索被删除行的ROWID和REF值,以及被删除列的列表达式,并可将他们存储到PL/SQL变量或复合变量中;[color=red]当DELETE语句删除多行数据时,RETURNING 子句可以将被删除行的ROWID和REF值,以及列表达式值返回到复合变量数组中。[/color]在DELETE中使用RETURNING 子句的限制与INSERT语句中对RETURNING子句的限制相同。


如果在teturning 后边添加 rownum会有错误提示:
[color=red] ORA-00976: 此处不允许为 LEVEL, PRIOR 或 ROWNUM[/color]
### MyBatis Mapper XML 中 SQL 映射代码的含义 #### 1. `select` 标签的作用 `<select>` 标签主要用于定义查询操作。它通过指定的 ID 和参数映射到对应的 SQL 查询语句,并返回结果数据。其核心属性包括: - **id**: 唯一标识符,供接口方法调用。 - **parameterType**: 输入参数类型。 - **resultType** 或 **resultMap**: 定义返回的结果类型。 示例: ```xml <select id="getEmpByIdNames" parameterType="map" resultType="com.mybatis.employee.Employee"> SELECT * FROM table_employee WHERE id = #{param1} AND names = #{param2} </select> ``` 上述代码表示基于两个参数 (`id`, `names`) 进行员工表的查询操作[^3]。 --- #### 2. `insert` 标签的作用 `<insert>` 标签用于执行插入操作。它可以支持简单的插入逻辑,也可以配合动态 SQL 实现复杂场景下的插入需求。如果数据库支持 RETURNING 子句,则可以通过 `<select>` 来实现插入并获取返回值的操作[^2]。 示例: ```xml <insert id="insertEmployee" parameterType="com.mybatis.employee.Employee"> INSERT INTO employees (name, age, department_id) VALUES (#{name}, #{age}, #{departmentId}) </insert> ``` 对于某些特殊数据库(如 PostgreSQL),可以利用如下方式完成插入后立即返回数据: ```xml <select id="insertAndGetAuthor" resultType="domain.blog.Author" affectData="true" flushCache="true"> INSERT INTO Author (username, password, email, bio) VALUES (#{username}, #{password}, #{email}, #{bio}) RETURNING id, username, password, email, bio </select> ``` --- #### 3. `update` 标签的作用 `<update>` 标签负责更新数据库记录。通常会涉及多个字段的修改,因此常与动态 SQL 结合使用以提高灵活性。 示例: ```xml <update id="updateEmployee" parameterType="com.mybatis.employee.Employee"> UPDATE employees SET name=#{name}, age=#{age} WHERE id=#{id} </update> ``` 当需要有条件地设置字段时,可借助 `trim` 标签优化 SQL 语法[^1]: ```xml <update id="dynamicUpdateEmployee" parameterType="java.util.Map"> UPDATE employees <set> <if test="name != null">name=#{name},</if> <if test="age != null">age=#{age},</if> </set> WHERE id=#{id} </update> ``` --- #### 4. `delete` 标签的作用 `<delete>` 标签用于删除特定条件下的记录。它的功能相对简单,但也可能结合动态 SQL 提高适应性。 示例: ```xml <delete id="deleteEmployeeById" parameterType="int"> DELETE FROM employees WHERE id=#{id} </delete> ``` --- #### 动态 SQL 的用法 MyBatis 支持多种动态 SQL 标签,常见的有以下几个: - **`if`**: 判断条件是否成立。 - **`choose/when/otherwise`**: 类似于 Java 的 switch-case 语句。 - **`foreach`**: 遍历集合或数组。 - **`trim`**: 处理多余的关键字(如 `AND`、`,` 等)。 ##### 示例:`trim` 使用案例 假设有一个复杂的更新语句,仅需更新部分字段而非全部字段,此时可通过 `trim` 标签简化 SQL 构造过程: ```xml <update id="updateUserDynamic" parameterType="hashmap"> UPDATE users <trim prefix="SET" suffixOverrides=","> <if test="username != null">username=#{username},</if> <if test="password != null">password=#{password},</if> <if test="email != null">email=#{email},</if> </trim> WHERE id=#{id} </update> ``` 此代码片段中,`suffixOverrides=","` 表明移除最后多余的逗号;而 `prefix="SET"` 添加了必要的前缀[^1]。 --- #### 总结 MyBatis 的 Mapper XML 文件提供了强大的 SQL 映射能力,能够灵活应对各种 CRUD 场景。无论是基础的增删改查还是高级的动态 SQL 应用,都能满足实际开发中的多样化需求。 --- 问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值