OracleSQL操作总结

 需要注意的是,如下操作,是在表中的每条数据有唯一标识的情况下执行的,其他情况不建议;

  • 第一步:创建备份表market_index_bak,并将原表数据复制到备份表

create table market_index_bak as select * from market_index;

  • 第二步:将原表需要修改字段类型的值更新为null

update market_index MI set MI.TOTALPROFIT = null, MI.DAILYPROFIT = null;

  • 第三步:修改字段类型

alter table market_index modify TOTALPROFIT number(20,6);
alter table market_index modify DAILYPROFIT number(20,6);

  • 第四步:将第二步置为null的字段,恢复到原有的值

update market_index MI set MI.TOTALPROFIT = (
    select MB.TOTALPROFIT from market_index_bak  MB where MB.GROUPNAME = MI.GROUPNAME
    and MB.CREATETIME = MI.CREATETIME
 ),
  MI.DAILYPROFIT = (
    select MB.DAILYPROFIT from market_index_bak  MB where MB.GROUPNAME = MI.GROUPNAME
    and MB.CREATETIME = MI.CREATETIME
 );

  •  第五步:清空、删除备份表

truncate table  market_index_bak ;
drop table market_index_bak ;

  • MySQL Oracle判断字段是否存在不存在添加字段

  • MySQL(Call、Drop语句要各占一行,再跑ALM流水线数据流水线时,需要以这种格式,否则新增字段不生效)
DROP PROCEDURE
IF EXISTS pro_AddColumn;
DELIMITER $$


CREATE PROCEDURE pro_AddColumn ()
BEGIN

IF NOT EXISTS (
	SELECT
		1
	FROM
		information_schema.`COLUMNS`
	WHERE
		table_name = 'sc_user'
	AND column_name = 'test_varchar'
) THEN
	ALTER TABLE sc_user ADD test_varchar VARCHAR (255) ;
END
IF ; END$$

DELIMITER ; 
CALL pro_AddColumn ;
DROP PROCEDURE pro_AddColumn ;
  • Oracle(最后一行要加上反斜杠,再跑ALM流水线数据流水线时,需要以这种格式,否则新增字段不生效)
DECLARE
  num NUMBER;
BEGIN
  SELECT COUNT(1)
    INTO num
    from cols
   where table_name = upper('sc_user')
     and column_name = upper('test_varchar');
  IF num = 0 THEN
    dbms_output.put_line('column do not exist,start add column......');
    execute immediate 'alter table sc_user add test_varchar varchar(100)';    
  else
    dbms_output.put_line('column exist...... ');
  END IF;
END;
/
  • with as更高效的使用场景

定义一个SQL查询结果,可以被整个SQL使用,查询结果使用两次及以上会把查询结果放到TEMP表中,
使用了临时表,就会增加额外的I/O开销,因此,表变量的方式并不太适合数据量大且频繁查询的情况
适合数据量大且不是频繁查询的情况
适用场景
1. 子查询过多时,且同一个子查询需要被多次使用的时候
2. UNION ALL使用场景,每隔被UNION ALL的查询,有部分查询条件重复时,可以用with as查询中间表,避免重复查询
缺点
3. with as的查询结果集相对于中间表不支持索引,而且with as查询的结果数据量大时,消耗的内存就大

  • oracle存储过程

create or replace proceduce  R_OVERDUE_PRO(datadate String) is
    --游标
    Cursor Cur is
        select * from tableName;
    --变量
    username varchar2(200);
begin
    --循环游标
    For Temp In Cur Loop
        username := '';
        if (Temp.flag = 1) then
            --逻辑代码
        elsif (Temp.flag = 2) then
            --逻辑代码
        end if;
    End Loop;
    --循环输出1到10,1 .. 10 指的是1到100
    For j in 1 .. 10 Loop
        dbms_output.put_line('>>>>>>>>j='||j)
    End Loop;
    commit;
end R_OVERDUE_PRO;
  • 批量插入(insert all...和merge into...)

  <insert id="insertUserBatch">
    INSERT ALL
    <foreach collection="list" item="map" index="index">
      INTO
      sc_user (username,user_age,gender,work_date)
      VALUESA
      (#{map.username},#{map.userAge},#{map.gender},#{map.workDate})
    </foreach>
    SELECT 1 FROM DUAL
  </insert>
  <!--单条记录merge,可以只执行更新或新增操作-->
  <insert id="MergeUserSingle">
    MERGE INTO sc_user A1 USING (select #{username} as username,#{userAge} as user_age,#{gender} as gender,#{workDate} as work_date from dual) A2
    ON (A2.username = A1.username)
    WHEN MATCHED THEN UPDATE SET A1.user_age=A2.user_age, A1.gender=A2.gender, A1.work_date=A2.work_date
    WHEN NOT MATCHED THEN INSERT (A1.username,A1.user_age,A1.gender,A1.work_date) VALUES (A2.username,A2.user_age,A2.gender,A2.work_date)
  </insert>
  <!--多条记录merge-->
  <insert id="MergeUserBatch">
    MERGE INTO sc_user A1 USING
    <foreach collection="list" index="index" item="map" separator=" union " open="(" close=")">
      select #{map.username} as username , #{map.userAge} as user_age,#{map.gender} as gender, #{map.workDate} as work_date from dual
    </foreach> A2
    ON (A2.username = A1.username)
    WHEN MATCHED THEN UPDATE SET A1.user_age=A2.user_age, A1.gender=A2.gender, A1.work_date=A2.work_date
    WHEN NOT MATCHED THEN INSERT (A1.username,A1.user_age,A1.gender,A1.work_date) VALUES (A2.username,A2.user_age,A2.gender,A2.work_date)
  </insert>
  • plsql中SQL查询条件带&符号的处理方法

如:select * from tablename where column=chr(38)||'字符串'||chr(38)||'字符串'

oracle中chr(38)代表的是&符号

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值