zoukankan      html  css  js  c++  java
  • ORACLE / PLSQL 插入或更新数据的几种方式

    第一种,直接用values 插入

    ---日期需要用TO_DATE操作
    INSERT INTO EMP (EMPNO,ENAME ,JOB,MGR, HIREDATE , SAL ,COMM, DEPTNO) VALUES 
    (1122,'STEVE','工人',2233,TO_DATE('2017-01-03','YYYY-MM-DD'),3000,500,20);

    第二种,用select 的方式插入

    INSERT INTO EMP (EMPNO,ENAME ,JOB,MGR, HIREDATE )
    SELECT EMPNO,ENAME ,JOB,MGR, HIREDATE  FROM EMP WHERE DEPTNO = 20   ;

    第三种,select () into () 方式插入,这种是游标中使用,存在于过程中,给游标赋值

    SELECT EMPNO,ENAME ,JOB,MGR, HIREDATE  FROM EMP WHERE DEPTNO = 20 
     INTO EMP (EMPNO,ENAME ,JOB,MGR, HIREDATE );

    第四种,用merge into 更新数据(比较复杂,但很好用),这个方法不需要先 DELETE 再 进行 insert ,只对需要核对的数据进行一次操作,比先DELETE 再INSERT效率要高。

    MERGE INTO ANN_FIN_PROFITDISTRIBUTE_total A  --要更新数据的表
      USING (SELECT B.VC_REPORT_ID VC_REPORT_ID,   ---using可以理解为,用这些查出来的数据去匹配更新
                    SUM(B.F_PER10_DIVIDEND) F_PER10_DIVIDEND_TOTAL,
                    SUM(B.F_DIVIDEND_CASH) F_DIVIDEND_CASH_TOTAL,
                    SUM(B.F_DIVIDEND_INVEST) F_DIVIDEND_INVEST_TOTAL,
                    SUM(B.F_DIVIDEND_TOTAL) F_DIVIDEND_TOTAL
               FROM ANN_FIN_PROFITDISTRIBUTE B
              WHERE B.VC_REPORT_ID = V_REPORT_ID
              GROUP BY B.VC_REPORT_ID) C
      ON (A.VC_REPORT_ID = C.VC_REPORT_ID)   --- ON 是非常关键的,决定着这些数据是否被更新
      WHEN MATCHED THEN  --如果 ON的条件满足,那么就更新数据,做如下的 update 处理
        UPDATE
           SET A.F_PER10_DIVIDEND_TOTAL  = C.F_PER10_DIVIDEND_TOTAL,
               A.F_DIVIDEND_CASH_TOTAL   = C.F_DIVIDEND_CASH_TOTAL,
               A.F_DIVIDEND_INVEST_TOTAL = C.F_DIVIDEND_INVEST_TOTAL,
               A.F_DIVIDEND_TOTAL        = C.F_DIVIDEND_TOTAL
      WHEN NOT MATCHED THEN  ---如果 ON 的条件不满足,则插入这些数据
        INSERT
          (A.VC_REPORT_ID,
           A.F_PER10_DIVIDEND_TOTAL,
           A.F_DIVIDEND_CASH_TOTAL,
           A.F_DIVIDEND_INVEST_TOTAL,
           A.F_DIVIDEND_TOTAL)
        VALUES
          (C.VC_REPORT_ID,
           C.F_PER10_DIVIDEND_TOTAL,
           C.F_DIVIDEND_CASH_TOTAL,
           C.F_DIVIDEND_INVEST_TOTAL,
           C.F_DIVIDEND_TOTAL);

    第五种,用update更新,这里就不用emp表了,懒得码字

    UPDATE ANN_HLD_OTHER_ACCEST   --表名
             SET (VC_REPORT_ID, --报表唯一标示
                  F_DEPOSIT_GUARAN, --存出保证金
                  F_SQUARE_MONEY, --应收证券清算款
                  F_VIVIDEND, --应收股利
                  F_INTEREST, --应收利息
                  F_SUBSCRIBE, --应收申购款
                  F_OTHER_ITEM --其他应收款
                  ) =
                 (SELECT V_REPORT_ID, --变量
                         C.F_A1031, --存出保证金
                         C.F_B3003, --应收证券清算款
                         C.F_A1203, -- 应收股利
                         C.F_A1204, --应收利息
                         C.F_A1207, --应收申购款
                         C.F_A1221 --其他应收款
                    FROM fact_HLD_hlddetail_PRICE C
                   WHERE C.VC_FUNDCODE = I_FCODE  --约束条件
  • 相关阅读:
    mormot2封装tcp
    mormot.net.client.pas
    mormot.net.server.pas
    delphi working with big data databases in Cassandra, Couchbase and MongoDB
    Grijjy.ProtocolBuffers.pas
    Grijjy.Bson.Serialization.pas
    GrijjyFoundation开源框架
    Unidac内存表使用
    传统关系型数据库正在完成华丽的蜕变
    使用arthas 分析java 应用的一个流程总结
  • 原文地址:https://www.cnblogs.com/yhoralce/p/7482614.html
Copyright © 2011-2022 走看看