点滴技术生活 2020-01-30
目录
在Oracle数据库中,dual是Oracle中的一个伪表,在Oracle数据库中的select语句的语法为:
SELECT column_1, column_2, ... FROM table_name;
即在使用select语句时,如果没有表名,就没办法执行查询,而当我们想查看当前时间sysdate
或者想计算出一个表达式例如2+3
的值的时候,如果没有表是无法执行操作的,故Oracle数据库出现了伪表dual的概念。
--查询当前时间,如果后面不跟表,则无法查询,例如 SELECT sysdate ; --正确写法 SELECT sysdate FROM daul;
总结:dual表就是oracle与数据字典自动创建的一张表,这张表是一个单行单列的表,这个表只有1列:DUMMY,数据类型为VERCHAR2(1),dual表中只有一个数据‘X‘, Oracle有内部逻辑保证dual表中永远只有一条数据。dual表主要是用来选择系统变量或是求一个表达式的值。
MERGE INTO Student S1 USING (SELECT '1001' as sid,'张三' as name,'95' as grade FROM dual) S2 on (S1.sid=S2.sid) WHEN MATCHED THEN UPDATE SET S1.name=S2.name,S1.grade=S2.grade WHEN NOT MATCHED THEN INSERT (S1.sid, S1.name,S1.grade) VALUES (S2.sid, S2.name,S2.grade ); --具体解释 --USING 这里是我们需要跟数据库进行比较的数据,这里传入的数据为('1001','张三','95'),为了保证USING后面的select有数据,在这里使用了dual表。 --on后面是我们要比较的条件 --WHEN MATCHED THEN 当存在学号为‘1001’这样的数据时,选择将数据库中的这条数据更新 --WHEN NOT MATCHED THEN 当不存在这条数据时,将这条数据插入到数据库中。
原理:在使用using 时搜出来的结果逐条与on条件匹配,然后决定是update还是Insert。 当USING后面的sql没有查询到数据的时候,Merge Into语句是不会执行update和Insert操作的。因此需要保证USING 后面的SELECT有数据,可以使用DUAL表作为USING后的表。
注意点:在实际项目中,using表后边传入的数据,可以是前台传过来的对象,例如前台传过来Student(SID:‘1001‘,NAME:‘张三‘,GRADE:‘95‘);这是可以这样:
MERGE INTO Student S1 USING (SELECT #{SID,jdbcType=VARCHAR} sid FROM dual) S2 on (S1.sid=S2.sid) WHEN MATCHED THEN UPDATE SET S1.name= #{NAME,jdbcType=VARCHAR},S1.grade=#{GRADE,jdbcType=VARCHAR} WHEN NOT MATCHED THEN INSERT sid,name,grade) VALUES (#{SID,jdbcType=VARCHAR} #{NAME,jdbcType=VARCHAR},#{GRADE,jdbcType=VARCHAR}) --mabatis最后语句不能以‘;’结尾,否则会报 ‘无效字符’ 错误。
原创不易,欢迎转载,转载时请注明出处,谢谢!
作者:潇~萧下
原文链接:https://www.cnblogs.com/manongxiao/p/12241833.html