UPDATE 문을 사용하여 Db2 데이터 업데이트

UPDATE 문이나 MERGE 문을 사용해서 표의 데이터를 변경할 수 있습니다.

UPDATE문은 WHERE절에 지정한 검색 조건을 만족시키는 행 수에 따라 테이블의 0개 이상의 행을 수정합니다.

UPDATE 또는 MERGE 문을 사용하여 단일 행에서 업데이트할 값을 지정할 수 있습니다. 상수, 호스트 변수, 표현식, DEFAULT 또는 NULL을 지정할 수 있습니다 NULL을 지정하면 행을 제거하지 않고 행의 열에서 값을 제거할 수 있습니다.

UPDATE 문의 예

범용 프로그래밍 인터페이스 정보 시작.
  • 직원이 승진했다고 가정해 보겠습니다. NEWEMP 테이블에서 이동을 반영하는 직원 데이터의 몇 가지 항목을 갱신하려면 다음과 같은 UPDATE문을 사용하십시오.

    UPDATE NEWEMP
      SET JOB = 'MGR',
      DEPT = 'E21'
      WHERE EMPNO = '100125'; 
  • DSN8C10.EMP 에서 직원 번호 000190의 전화번호를 3565로 변경합니다.

       UPDATE DSN8C10.EMP
         SET PHONENO='3565'
         WHERE EMPNO='000190';
  • D11 의 각 구성원에게 100달러씩 인상해 주세요.

      UPDATE DSN8C10.EMP
        SET SALARY = SALARY + 100
        WHERE WORKDEPT = 'D11';
  • 직원 000250이 휴직 중입니다. 직원의 급여 값(급여, 보너스, 커미션)을 0으로 설정합니다.

       UPDATE DSN8C10.EMP
         SET SALARY = NULL, BONUS = NULL, COMM = NULL
         WHERE EMPNO='000250';
    또는 다음과 같이 표현할 수도 있습니다
       UPDATE DSN8C10.EMP
         SET (SALARY, BONUS, COMM) = (NULL, NULL, NULL)
         WHERE EMPNO='000250';
  • DSN8C10.EMP에 PROJSIZE라는 열이 추가되었다고 가정해 보겠습니다. 이 열은 해당 직원의 부서가 책임지고 있는 프로젝트의 수를 기록합니다. E21 의 각 직원에 대해, 해당 부서가 담당하는 프로젝트의 수로 PROJSIZE를 업데이트합니다.

       UPDATE DSN8C10.EMP
         SET PROJSIZE = (SELECT COUNT(*)
                         FROM DSN8C10.PROJ
                         WHERE DEPTNO = 'E21') 
         WHERE WORKDEPT = 'E21';               
  • C1 커서 위치가 있는 행에 해당하는 직원의 급여를 두 배로 올립니다.
       EXEC SQL UPDATE DSN8C10.EMP
         SET SALARY = 2 * SALARY
         WHERE CURRENT OF C1;
  • 직원 테이블 EMP1 이 다음 문장으로 생성되었다고 가정합니다

       CREATE TABLE EMP1
         (EMP_ROWID    ROWID GENERATED ALWAYS,
          EMPNO        CHAR(6),
          NAME         CHAR(30),
          SALARY       DECIMAL(9,2),
          PICTURE      BLOB(250K),
          RESUME       CLOB(32K));
     
    호스트 변수 HV_EMP_ROWID에 직원 번호가 '350000'인 직원의 ROWID 열 값이 포함되어 있다고 가정합니다. 이 ROWID 값을 사용하여 직원과 사용자 정의 함수 UPDATE_RESUME를 식별하고, 직원의 급여를 $1000 인상하고, 해당 직원의 이력서를 업데이트합니다.
       EXEC SQL UPDATE EMP1
         SET SALARY = SALARY + 1000,
             RESUME = UPDATE_RESUME(:HV_RESUME)
         WHERE EMP_ROWID = :HV_EMP_ROWID;
  • 직원 테이블 X에서, 평균 이하 급여를 받는 직원에게 10%의 급여 인상을 적용합니다.

      EXEC SQL UPDATE EMP X
        SET SALARY = 1.10 * SALARY
        WHERE SALARY < (SELECT AVG(SALARY) FROM EMP Y
        WHERE X.JOBCODE = Y.JOBCODE);
  • 평균 급여보다 낮은 급여를 받는 ' E11 ' 부서의 직원 급여를 평균 급여 수준으로 인상하십시오.

      EXEC SQL UPDATE EMP T1
        SET SALARY = (SELECT AVG(T2.SALARY) FROM EMP T2)
        WHERE WORKDEPT = 'E11' AND
              SALARY < (SELECT AVG(T3.SALARY) FROM EMP T3);  
  • E11 에 속한 직원들에게 급여의 10%에 해당하는 보너스를 지급하십시오.
      EXEC SQL 
        DECLARE C1 CURSOR FOR  
          SELECT BONUS  
          FROM DSN8710.EMP 
          WHERE WORKDEPT = 'E12'  
          FOR UPDATE OF BONUS;  
      EXEC SQL  
        UPDATE DSN8710.EMP  
          SET BONUS = ( SELECT .10 * SALARY FROM DSN8710.EMP Y  
                        WHERE EMPNO = Y.EMPNO ) 
          WHERE CURRENT OF C1;
  • 테이블 T1 의 행이 10개로 구성된 행 세트에 커서 CS1 가 있다고 가정하면, 행 세트의 모든 10개 행을 업데이트합니다.
    EXEC SQL UPDATE T1 SET C1 = 5 WHERE CURRENT OF CS1; 
  • 테이블 T1 의 행이 10개로 구성된 행 세트에 커서 CS1 가 있다고 가정할 때, 행 세트의 네 번째 행을 업데이트합니다.
    short ind1, ind2;
    
    int n, updt_value;
    
    stmt = 'UPDATE T1 SET C1 = ? WHERE CURRENT OF CS1 FOR ROW ? OF ROWSET'
    
    ind1 = 0;
    
    ind2 = 0;
    
    n = 4;
    
    updt_value = 5;
    
    ...
    
    strcpy(my_sqlda.sqldaid,"SQLDA");
    
    my_sqlda.sqln = 2;
    
    my_sqlda.sqld = 2;
    
    my_sqlda.sqlvar[0].sqltype = 497;
    my_sqlda.sqlvar[0].sqllen = 4;
    my_sqlda.sqlvar[0].sqldata = (int *) &updt_value;
    my_sqlda.sqlvar[0].sqlind = (short *) &ind1;
    
    my_sqlda.sqlvar[1].sqltype = 497;
    my_sqlda.sqlvar[1].sqllen = 4;
    my_sqlda.sqlvar[1].sqldata = (int *) &n;
    my_sqlda.sqlvar[1].sqlind = (short *) &ind2;
    
    EXEC SQL PREPARE S1 FROM :stmt;
    
    EXEC SQL EXECUTE S1 USING DESCRIPTOR :my_sqlda;
  • POLICY 테이블이 존재하며, 단일 포괄-제외 기간인 BUSINESS_TIME으로 정의되어 있다고 가정합니다. 이 표에는 BK 열의 값이 ' P138 ', CLIENT 열의 값이 ' C882 ', TYPE 열의 값이 'PPO', 기간이 '2013-01-01', '2020-12-31'인 행이 있습니다. '2014-01-01'로 시작하는 행의 일부를 업데이트하여 TYPE 열을 'HMO'로 설정합니다

    UPDATE POLICY
    	FOR PORTION OF BUSINESS_TIME 
    		FROM '2014-01-01' TO '9999-12-31'
    		SET TYPE='HMO'
    		WHERE BK='P138', CLIENT='C882';

    UPDATE 문이 처리된 후, 테이블은 원래 행 대신 2개의 행을 포함합니다. 한 행에 기간 값이 있는 경우 ('2013-01-01', '2014-01-01') tYPE 열의 값(업데이트 전의 값)은 'PPO'이고, 기간 값('2014-01-01', '2020-12-31')이 있는 다른 행은 TYPE 열의 값(UPDATE 문으로 시작된)이 'HMO'입니다.

  • INTARRAY와 CHARARRAY 배열 유형, INTA, CHARA, SI 변수, 그리고 T1 테이블이 다음과 같이 정의되었다고 가정해 보십시오.변경 시작
    CREATE TYPE INTARRAY AS INTEGER ARRAY [6];
    CREATE TYPE CHARARRAY AS CHAR(20) ARRAY [7];
    CREATE VARIABLE INTA AS INTARRAY;
    CREATE VARIABLE CHARA AS CHARARRAY;
    CREATE VARIABLE SI INT;
    CREATE TABLE T1 (COL1 CHAR(7), COL2 INT);
    변경 끝

    CHARA, INTA, SI에 값을 할당합니다.

    SET CHARA = ARRAY [ 'a', 'b', 'c' ];
    SET INTA = ARRAY [ 1, 2, 3, 4, 5 ];
    SET SI = 1;

    T1 테이블에 행을 삽입한 다음, 변수 SI의 값으로 인덱싱되는 CHARA와 INTA 배열의 값을 사용하여 행 값을 업데이트합니다.

    INSERT INTO T1 VALUES ('abc', 10);
    UPDATE T1 
     SET COL1 = CHARA[SI],
     COL2 = INTA[SI];

    표 행에서, ' COL1 '는 이제 'a'를 포함하고, ' COL2 '는 1을 포함합니다.

    모든 행의 열 COL2 의 값을 배열 INTA의 카디널리티로 설정합니다.

    UPDATE T1
     SET COL2 = CARDINALITY(INTA);

    표 행에서, COL2 는 이제 5를 포함합니다.

  • POLICY 테이블이 존재하며, 단일 포괄-포괄 기간인 BUSINESS_TIME으로 정의되어 있다고 가정합니다. 이 표에는 BK 열의 값이 ' P138 ', CLIENT 열의 값이 ' C882 ', TYPE 열의 값이 'PPO', 기간이 '2013-01-01', '2020-12-31'인 행이 있습니다. 다음과 같은 UPDATE 문을 실행한다고 가정해 보겠습니다:

    UPDATE POLICY
    FOR PORTION OF BUSINESS_TIME 
    BETWEEN '2014-01-01' AND '9999-12-31'
    SET TYPE='HMO'
    WHERE BK='P138', CLIENT='C882';

    UPDATE 문이 처리된 후, 테이블은 원래 행 대신 2개의 행을 포함합니다. 기간 값이 있는 한 행('2013-01-01', '2013-12-31')의 TYPE 열 값은 업데이트 전의 값인 'PPO'이고, 기간 값이 있는 다른 행('2014-01-01', '2020-12-31')의 TYPE 열 값은 'HMO'입니다.

범용 프로그래밍 인터페이스 정보 끝.