一个oracle面试题

一个oracle面试题某天 群里突然冒出一个道友询问 oracle 的面试题 特此记录一下一系列过程 第一步建表 DROPTABLEser DROPTABLEter CREATETABLEs serv idNUMBER 10 prod idNUMBER 10 user typeVARCHAR2 30 te

某天,群里突然冒出一个道友询问oracle的面试题,特此记录一下

oracle面试题
一系列过程:
第一步建表:




DROP TABLE serv; DROP TABLE terminal; CREATE TABLE serv( serv_id NUMBER(10), prod_id NUMBER(10), user_type VARCHAR2(30), terminal_name VARCHAR2(20) ) tablespace ORAC_DATA pctfree 10 initrans 1 maxtrans 255 storage ( initial 11M next 1M minextents 1 maxextents unlimited ); COMMENT ON TABLE serv IS '用户资料表'; COMMENT ON COLUMN serv.serv_id IS '用户标识'; COMMENT ON COLUMN serv.prod_id IS '产品标识'; COMMENT ON COLUMN serv.user_type IS '用户类型'; COMMENT ON COLUMN serv.terminal_name IS '终端类型'; CREATE TABLE terminal( serv_id NUMBER(10), terminal_name VARCHAR2(20) ) tablespace ORAC_DATA pctfree 10 initrans 1 maxtrans 255 storage ( initial 11M next 1M minextents 1 maxextents unlimited ); COMMENT ON TABLE terminal IS '终端类型临时表'; COMMENT ON COLUMN terminal.serv_id IS '用户标识'; COMMENT ON COLUMN terminal.terminal_name IS '终端类型';
SELECT * FROM serv FOR UPDATE; SELECT * FROM terminal FOR UPDATE; 

serv 表结果如下:

结果
terminal 表结果如下
结果
第三步,创建存储过程如下:






--创建存储过程 CREATE OR REPLACE PROCEDURE sp_terminal IS BEGIN --更新serv表 方法一 UPDATE serv s SET s.terminal_name = ( SELECT CASE WHEN s.PROD_ID = 1 AND s.USER_TYPE = 'A' THEN '固话' WHEN s.PROD_ID = 1 AND s.USER_TYPE = 'B' THEN '小灵通' WHEN S.PROD_ID = 2 THEN '宽带' WHEN S.USER_TYPE = 'C' THEN 'CDMA' ELSE '-1' END terminal_name FROM SERV S1 WHERE S1.PROD_ID = S.PROD_ID AND S1.USER_TYPE = S.USER_TYPE ) WHERE EXISTS ( SELECT NULL FROM SERV S1 WHERE S1.PROD_ID = S.PROD_ID AND S1.USER_TYPE = S.USER_TYPE ); COMMIT; --更新serv表 方法二 UPDATE SERV S --用户资料表 SET S.TERMINAL_NAME=(SELECT CASE WHEN S.PROD_ID = 1 AND S.USER_TYPE='A' THEN '固话' WHEN S.PROD_ID = 1 AND S.USER_TYPE='B' THEN '小灵通' WHEN S.PROD_ID = 2 THEN '宽带' WHEN S.USER_TYPE='C' THEN 'CDMA' ELSE '-1' END AS TERMINAL_NAME FROM TERMINAL T --终端类型临时表 WHERE S.SERV_ID=T.SERV_ID) WHERE EXISTS (SELECT 1 FROM TERMINAL T1 WHERE S.SERV_ID=T1.SERV_ID); COMMIT; --更新terminal表 方法一 UPDATE terminal T SET T.TERMINAL_NAME = ( SELECT s1.TERMINAL_NAME FROM SERV S1 INNER JOIN terminal T1 ON S1.SERV_ID = t1.SERV_ID WHERE t1.SERV_ID = t.SERV_ID ) WHERE EXISTS ( SELECT s1.TERMINAL_NAME FROM SERV S1 INNER JOIN terminal T1 ON S1.SERV_ID = t1.SERV_ID WHERE t1.SERV_ID = t.SERV_ID ); COMMIT; --更新terminal表 方法二 UPDATE terminal T SET T.TERMINAL_NAME = ( SELECT CASE WHEN s.PROD_ID = 1 AND s.USER_TYPE = 'A' THEN '固话' WHEN s.PROD_ID = 1 AND s.USER_TYPE = 'B' THEN '小灵通' WHEN S.PROD_ID = 2 THEN '宽带' WHEN S.USER_TYPE = 'C' THEN 'CDMA' ELSE '-1' END terminal_name FROM SERV S WHERE t.SERV_ID = s.SERV_ID ) WHERE EXISTS ( SELECT CASE WHEN s.PROD_ID = 1 AND s.USER_TYPE = 'A' THEN '固话' WHEN s.PROD_ID = 1 AND s.USER_TYPE = 'B' THEN '小灵通' WHEN S.PROD_ID = 2 THEN '宽带' WHEN S.USER_TYPE = 'C' THEN 'CDMA' ELSE '-1' END terminal_name FROM SERV S WHERE t.SERV_ID = s.SERV_ID ); COMMIT; -------------- END sp_terminal;

后面,其他道友提出此种方法不适合数据量很大的情况,提出了一些方法,也记录在次

处于礼貌这里将聊天内容截图,仅仅展示相关文字

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/174071.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月27日 上午7:16
下一篇 2026年3月27日 上午7:16


相关推荐

  • clion2022.01.4激活码【中文破解版】2022.03.07

    (clion2022.01.4激活码)本文适用于JetBrains家族所有ide,包括IntelliJidea,phpstorm,webstorm,pycharm,datagrip等。IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html…

    2022年4月2日
    239
  • phpstorm2017 激活方法

    phpstorm2017 激活方法1 licenseserve 在线激活方式不是很推荐 自己有服务器的话可以考虑搭建以下地址可以用一下 不保证长期有效 http idea goxz gqhttp v2mc net 1017http idea imsxm comhttp idea ibdyr com2 本地激活成功教程激活 推荐 下载 http idea lanyus com ja

    2026年3月26日
    2
  • pandas DataFrame数据转为list

    pandas DataFrame数据转为list首先使用 np array 函数把 DataFrame 转化为 np ndarray 再利用 tolist 函数把 np ndarray 转为 list 示例代码如下 coding utf 8 importnumpya x pd read csv E Tianchi result features csv useco

    2026年3月17日
    2
  • querySelectorAll 遍历

    querySelectorAll 遍历直接 forEachdocum querySelecto p forEach i gt console info i 如果不能直接 forEachquery 返回的是 NodeList 无法直接 forEach 遍历 但是 貌似现在可以了 难到是浏览器都升级支持了 利用展开 document querySelecto

    2026年3月18日
    2
  • MySql实现两个查询结果相除

    MySql实现两个查询结果相除

    2021年7月13日
    199
  • c语言基础编程100道_创建窗体应用程序

    c语言基础编程100道_创建窗体应用程序结果图(可以按照这样做控件,也可以优化,另减法乘法等类似可以自行添加功能优化界面)代码实现using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Te…

    2022年8月18日
    13

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号