ALTIBASE Windows 매뉴얼....

AND


This error is thrown if a user wants to log on a database but lacks the create session system privilege. In order to give someone this privilege, use:

grant create session to the_user;
AND


프로시져 원문
=================================================================================
CREATE OR REPLACE PROCEDURE "DCAUSER"."PROC_LONG_PROCESS" (long_1 OUT VARCHAR2,long_2 OUT VARCHAR2,long_3 OUT VARCHAR2,long_4 OUT VARCHAR2) is
    l_var_text varchar2(2000);
    l_counter number(5) := 0;
    i number(5) := 1;
    j number(5) := 1;
    l_rec_length number(9) := 0;
    l_size number(3) := 200; //DBMS_OUTPUT.PUT_LINE 출력스트링 제한. 더늘려도 됨 
    cursor c1 is
    select MD_LONG from TEST_LONG;
begin
    for c1_rec in c1 loop
        l_rec_length := length(c1_rec.MD_LONG);
        dbms_output.put_line('Record length is: '||l_rec_length);
        while l_rec_length > 0 loop
            l_counter := l_counter + 1;
            l_var_text := substr(c1_rec.MD_LONG,i,l_size);
            //DBMS_OUTPUT.PUT_LINE('Line '||l_counter||': '||l_var_text);
            if j=1 then long_1:=l_var_text;
            end if;
            if j=2 then long_2:=l_var_text;
            end if;
            if j=3 then long_3:=l_var_text;
            end if;
            if j=4 then long_4:=l_var_text;
            end if;
           
           
            i := i + l_size;
            l_rec_length := l_rec_length - l_size;
            j := j+ 1;
        end loop;
        i := 1;
    end loop;
end;


호출부분
================================================================================
declare
m1 varchar2(200); //DBMS_OUTPUT.PUT_LINE 출력스트링 제한. 더늘려도 됨
m2 varchar2(200);
m3 varchar2(200);
m4 varchar2(200);
begin
PROC_LONG_PROCESS(m1,m2,m3,m4);
DBMS_OUTPUT.PUT_LINE('Line '||1||': '||m1);
DBMS_OUTPUT.PUT_LINE('Line '||2||': '||m2);
DBMS_OUTPUT.PUT_LINE('Line '||3||': '||m3);
DBMS_OUTPUT.PUT_LINE('Line '||4||': '||m4);
end;

결과값
=================================================================================
Line 1: MMMMMMMMMMMMMMMMMMMMMMMMMM.....
Line 2: MMMMMMMMMMMMMMMMMMMMMMMMMM.....
Line 3: MMMMMMMMMMMMMMMMMMMMMMMMMM.....
Line 4: MMMMMMMMMMMMMMMMMMMMMMMMMM.....

LONG 필드의 각각 VARCHAR 변수에 200 씩 잘라져서 나옴
AND


일반적인 UPDATE문, 즉 Optimistic Lock 만으로 동시성을 확보하면서 여러 사용자가 동일한 데이터를 수정하더라도 정합성을 보장하는 방법

1. Version 필드를 통한 체크

첫번째 방법은 변경하는 테이블에 변경시간을 기록하는 컬럼을 추가하는 것이다 아래코드는 DEPT테이블에 last_mod라는 timestamp형식의 컬럼을 추가해 select for update로서 레코드 락을 걸지 않고 변경 컬럼 값만을 체크해 해당컬럼이 변경되었다면 update되지 않도록 수행하는 처리 절차를 구사한 예이다. 이방법은 명시적인 락을 걸지 않고도 정합성을 유지할 수 있다.

[session 1]
SQL> variable deptno number
SQL> variable dname varchar2(14) 
SQL> variable loc varchar2(13)
SQL> variable last_mod varchar2(50)
SQL> begin
:deptno:=10;
select dname,loc,last_mod
into :dname, :loc, :last_mod
from dept
where deptno := deptno;
end;
/

               <- 
                     [Session 2]
                      Update dept set SAL=1000, LOC='NEWYORK',
                      last_mod=SYSTIMESTAMP
                      where deptno=10;
                      다른 세션에 의해서 last_mod 컬럼의 값 업데이트

SQL> update dept
set dname=upper(:dname),
last_mod=SYSTIMESTAMP
where deptno=:deptno
and last_mod=to_timestamp_tz(:last_mod);
----------------------------------------------
0 rows updated <- 다른 세션에서 값이 변경되었기 때문에 변경된느 건이 없다.

중간에 값이 변경되지 않았다면 해당 LAST_MOD값이 일치하는 로우는 업데이트가 정상적으로 수행될 것이다. 다만 엔드유저 입장에서는 업데이트되지 않았더라도 아무런 에러메시지를 보여주지 않기 때문에 version컬럼이 일치하지 않는 다면 메세지를 보여줄수 있는 추가적인 로직을 구사하면 된다.


2. Pseudo 컬럼을 이용한 변경체크
앞의 변경컬럼을 사용하는 것은 추가적인 테이블 변경 작업을 수반하기 때문에 사용할 수 없는 테이블이 수정 불가는한 환경에서는 부적합할 수도 있다. 여기서 기존의 테이블에 컬럼추가 없이 Pseudo 컬럼을 이용한 방법을 사용할 수 있다. 이는 10g에서의 SCN번호를 가져올수 있는 ORA_ROWSCN함수를 사용해서 체크하는 방법을 이용하면 간단히 구현될 수 있다.
10g에서는 SCN값의 변경사항중 하나가 종래의 block level SCN에서 Row lovel SCN을지원하게 되었다는 것이다 (SCN은 System Change Number 또는 System Commit Number라고 병행해서 사용된다. 이 값은 커밋시마다 부여되는 오라클의 내부시계와 같은 역활을 수행한다.)

SQL> variable deptno number
SQL> variable dname varchar2(14) 
SQL> variable SCN_NUM varchar2(20)

SQL> begin
deptno:=10;
select dname,ORA_ROWSCN
into :dname, :SCN_NUM
from dept
where deptno = :deptno;
end;
/

SQL> update dept
set dname=upper(:dname),
where deptno=:deptno
ane ORA_ROWSCN=:SCN_NUM <- 위에서 읽은 ROW_SCN이 일치하면
                                                   해당로우는 업데이트 된다.
--------------------------------------------------------------------
1 rows updated

3. SELECT FOR UPDATE(비관적 잠금)의 동시성 증대
일반적으로 동시성 향상보다도 정합성에 초점을 두거나 LOST UPDATE를 방지하기 위한 목적으로 FOR UPDATE 옵션으로서 SELECT되는 해당 로우에 대한 잠금을 명시적으로 실행하는 방법을 많이 쓰고 있으리라고 생각된다. 그러나 이러한 명시적인 잠금은 잘 쓰면 정합성을 유지하는데 약이 되지만 잘못 쓸경우 엄청난 동시성 저해 요소가 될 수 있다.
만일 다중로우에 대한 락을 걸때 한건의 로우가 기존에 락이 걸린 상태면 전체가 잠금을 시도하는데 있어서 에러가 발생한다. 따라서 넓은 범위의 로우를 Locking 하고 싶은 경우 이 한건의 락이 해제 될 때까지 기다려야 하는 상황이 발생한다.

SELECT FOR UPDATE문장에서 SKIP LOCKED옵션을 사용한 예제
[SESSION 1]
SELECT DEPTNO,EMPNO,JOB,ENAME FROM EMPLOYEES
WHERE EMPNO=7934
FOR UPDATE NOWAIT;
<- 7934인 직원에 대해서 명시적인 잠금을 걸었다
DEPTNO EMPNO JOB       ENAME
---------------------------------------------
10           7934      CLERK  MILLER

[SESSION 2]
SELECT DEPTNO,EMPNO,JOB,ENAME FROM EMPLOYESS WHERE DEPT_NO=10 FOR UPDATE WAIT 5;
<- 7934인 직원을 포함해서 부서번호 10인 모든 로우에 락을 적용
* ERROR at line 1
ORA-00054 락관련 오류...

[SESSION 2]
SELECT DEPTNO,EMPNO,JOB,ENAME FROM EMPLOYEES WHERE DEPTNO = 10 FOR UPDATE SKIP LOCKED

에러가 발생하지 않고 다만 기존에 락이 걸린 레코드가 제외된 나머지 레코드가 표시된다.

출처 : 마소 2009년 07월호
AND

Problem(Abstract)
Users will see an "ORA-00988: missing or invalid password(s)" error from Oracle if any of their passwords for WebSphere Partner Gateway begin with a number.
 
Cause
Oracle limitation
 
Resolving the problem
Any password that begins with a number for an Oracle database must be entered as a double quoted string (ie "123456ABC") in the WebSphere Partner Gateway installation panels.
 
AND