반응형

Null, Commit, Rollback
1. 널(Nul)값 처리
데이터베이스 테이블의 열들은 널값을 가질수있다. 널값은 공백 문자열이나 숫자 0 과는 같지않다. 종종 파워스크립트 프로그래밍을 할 때 널값에대한 특별한 처리가 필요하다.
WHERE 문에서의 예) ........... WHERE ... IS NULL;, 또는...............WHERE ... IS NOT NULL;
INSERT 문에서의 예) ........... VALUES ('9999', '8888',NULL, NULL)
UPDATE 문에서의 예) .......... SET remark = NULL WHERE.....;
1-1. 파워스크립트 산술연산에서의 널값
널값을 가지고 산술연산을 하면 그 결과 역시널값이 된다.
ex) IF IsNull(lr_a) THEN
             i = 0
        ELSE
             i= lr_a * 0.2 / 10
        END IF
만약 그 변수가 문자열 또는 다른 형의 변수라면 산술연산을 위해 비슷한 널의 처리가 필요하다.


1-2. 널 변수들과 컨트롤 속성들
SingleLineEdit 컨트롤의 Text 속성 또는 필드컨트롤의 비슷한 속성들을 널로 지정하였을 경우 예를 들어 sle_city.Text = ls_city 이 문장은 무시되고 그 컨드롤의 Text는 변경되지 않는다. 이 널값을 공백문자로 처리하려면 다음과 같은코드를 첨가 하여야 한다.
ex) IF IsNull(ls_city) THEN
             sle_city.Text =""
         ELSE
             sle-city.Text = ls_city
        END IF


1-3. SQL 산술연산의 널값들
sql문에서 산술연산이 가능하며, sql도 널값을 파워스크립트와 같은 방식으로 처리한다. 예를 들어 어떤 식의 일부의 결과가 널이라면 그식 전체의 결과가 널이 된다. 만약 널을 0과 같이 처리하려면 다음과 같이 한다.
ex) UPDATE pay
    SET totalpay = IsNull(sales, 0) + IsNull(tax, 0);
sql에 있는 isnull함수는 파위스크립트의 isnull함수와 다르다, 이함수는 널이 아닌 첫번째 파라미터를 반환한다.
위의 예제에서 sales나 tax가 널값이면 다음 파라미터인 0을 반환하는 것이다.


1-4. 지시(Indicator) 변수들
변수에 널 값이 지정되었는지 알아보는 가장쉬운 방법은 위에서 기술된 바와 같이 isnull함수를 사용하는 것이다.
다른 한가지 방법은 지시변수를 사용하는 것이다.
이것은 into문에 있는 값의 다음에 위치하는 별도의 변수이다,
만약 그값이 정상이면 지시변수는 0을 반환하고 널일경우 -1, 데이터 반환 오류일경우 -2를반환한다.
ex) SELECT city, openbalance
    INTO   :ls_city    :indvar_city,
           :ls_openbal :indvar_openbal
    FROM   customer
    WHERE  custid ='7777';
IF indvar_city = -1 THEN .......          //city의 값이 널
IF indvar_openval = -1 THEN .......       //openvalance의 값이 널


2. 트랜잭션 - Commit, Rollback
하나의 트랜잭션은 성공 또는 실패의 단위로써 sql 문들의 집합이다. 이는 데이터베이스의 무결성을 보장하기 위한방법이다. 서버마다 그 구문이 조금씩 다른데, ANSI-표준 SQL에서는하나의 트랜잭션이 그 데이터베이스에 영향을 미치는 INSERT 또는 UPDATE와 같은 명령들로 시작하고, COMMIT나 ROLLBACK과 같은 명령을 사용하여 끝낸다.
ex) execute multiple SQL statement here
IF everything worked THEN
      COMMIT;
ELSE
      ROLLBACK;
END IF
commit는 sql 문들에 의한 데이터베이스의 변경을 영구적으로 만든다. 반면, roolback은 그 변경들을 모두 취소시킨다.  이두경우 모두 그 트랜잭션을 끝내는 것이다. 그다음에 나오는 insert나 update와 같은 sql 문이 새로운 트랜잭션을 시작한다.
파워빌더는 commit와 roolback을 삽입된 sql의 형태로 지원한다.
그래서 위와 같이 그 명령들을 스크립트에 포함하여 사용할수 있으며 필요에 따라 using절을 수반할 수도 있다.


2-1. AutoCommit
파워스크립트의 트랜잭션 객체는 autocommit라는 속성을 가지고 있는데 이 속성은 트랜잭션에 중요한 영향을 미친다.
autocommit는 불린(boolean)값을 가지며 데이터베이스에 connect하기전이나 후에 그 값을 지정할 수 있다.
sqlca.AutoCommit = False
CONNECT;
autocommit을 지원하는 데이터베이스 상품에서는
 . autocommit의 값을 true로 지정하면 트랜잭션이하나도 없게 된다.
   그래서 각 sql 명령은 그 즉시데이터베이스에 적용된다. 이 경우 명시적인 commit나 rollback는 아무런 의미가 없다.
 . qutocommit의 값을 false로 지정하면 모든 sql명령들이 트랜잭션의 일부분이 되며,
    매번작업을 완료하기 위해 commit나 rollback를 수행해야 한다.
AutoCommit는 트랜잭션 객체의 속성들중 하나이다.그러므로 다른 속성들과 같이 그 값을 지정할수있다.
sqlca.DBMS =" ......."
sqlca.Databaxe =" ......"
.......
.......
sqlca.AutoCommit = False
COMMIT;
AutoCommit 의 디폴트 값은 True이다.


한 애플리케이션에서 AutoCommit의 값은 계속해서 바꿀 수가 있다. 그래서 필요에 따라 트란잭션처리를 변경할수 있다.
예를들어 다소 간단한 모듈일 경우 는시작모듈에서 autocommit의 값을 true로,
복잡한 모듈일 경우 시작에서 autocommit의 값을 false로 지정한다.
autocommit의 값을 변경하기 위해 disconnect를 하고다시 connect할 필요는 없다.

- 재스민의 파워빌더 싸부 수연아부지 DevTip에서 -

+ Recent posts