티스토리 툴바


technology/web | script2011/01/07 14:21

HTML5 한글 번역 사이트가 있어서 참조한다.
이런 일들은 하는 사람들 ... 훌륭하다.

저작자 표시
Posted by 승현아범
TAG HTML, 번역
technology/web | script2010/04/19 16:41
어제 경훈이 결혼으로 역전의 용사들을 다시 만날 수 있었다.
이제는 이런 경조사가 아니면 얼굴 보기도 힘들다.
다들 뿔뿔히 흩어져 각자의 삶을 살고 있지만 그래도 IT라는 그늘은 한결같다.
개발자로, 관리자로, 어떤 친구는 CEO로 ...
그나마 다들 잘 지내고 있어서 고맙고 다행이다라는 생각이 든다.


각자가 알고 있는 소식들을 나누고 얘기를 한참이나 했다.
역쉬 화제는 스마트폰이다.
인터넷이 붐을 일으킬때의 상황과 비슷한 느낌이다.
1996년 군대를 제대하고, 웹을 한창 공부할 때도 같은 느낌이었는데 ...  (netscape vs. iexploer)
지금은 iphone 과 android에 맞춰서 개발을 하느라 분주하다.
그때도 지금과 다름없이 누가 시장을 점유할까가 모두의 관심사였다.
예전 상황에 비추어보면, ms가 apple을, netscape가 android를 닮았다.
(사실 그때는 netscape가 조금 더 시장 점유율이 높았던 기억이 난다.)
그때와 조금 다른 상황이라면 좌우가 좀 바꼈고, android가 이미 open시장에 나왔다는 정도일까...
지금의 후배들은 이 netscape와 ms의 전쟁을 기억 못하겠지만, 이 전쟁(그때는 전쟁이라고 표현들을 했음) 을 참고해서 현재의 스마트폰을 바라본다면,,,  좀 더 잼있는 관전 포인트가 되지 않을까 싶다.

저작자 표시
Posted by 승현아범
technology/web | script2010/03/14 00:39

1. Creating Stored Procedures

PROCEDURE / FUNCTION
: 차이점은 리턴값 여부??

    -. sqlplus 시작시마다 매번 "sql>define _editor=vi" 귀찮으니깐...
       login.sql 파일을 생성하여, 해당 구문을 넣으면 항상 실행된다.
       (set serveroutput on size unlimited 도 포함하면 좋지....)

    -. procedure 작성하고,

    -. 에러나면 "show error" 로 확인하고,

    -. execute "프로시져 이름" 실행

    -. 외부/프로그램에서 실행시에는 BEGIN my_proc; END; 식으로 호출하면 됨.

    * Procedure Parameter Mode
        -. IN : 외부에서 전달된 파라미터를 정의할 때
        -. OUT : 생성된 데이터를 외부로 전달 할때
        -. INOUT : IN OUT 변수를 하나로 ...

    -. 외부/프로그램에서 정의한 BIND변수를 실행할 때는 ":"을 사용한다.
        sqlplus 또는 Pro*C 에서 직접 지정한 변수는 BIND변수다.

    -- my_proc 프로시져 생성
    CREATE OR REPLACE PROCEDURE my_proc (p_id IN NUMBER, p_name OUT VARCHAR2)
    IS
        v_last_name employees.last_name%TYPE;
    BEGIN
        SELECT last_name INTO v_last_name
        FROM employees
        WHERE employee_id = p_id;
        p_name := v_last_name;
    END;
    /
    -- my_proc 프로시저의 OUT리턴값을 확인하기 위해서 다음을 실행
    DECLARE
        v_name VARCHAR2(30) := 'HELLO';
    BEGIN
        DBMS_OUTPUT.PUT_LINE(v_name);
        my_proc(102, v_name);
        DBMS_OUTPUT.PUT_LINE(v_name);
    END;
    /

    -- IN OUT 변수를 하나의 파라미터로 사용하기
    -- JOBS 테이블에서 job_id로 조회하고, job_title를 리턴받는다.
    CREATE OR REPLACE PROCEDURE pr_get_job (p_job IN OUT VARCHAR2)
    IS
    BEGIN
        SELECT job_title INTO p_job
        FROM jobs
        WHERE job_id = p_job;
    END;
    /
    -- pr_get_job 프로시저의 OUT리턴값을 확인하기 위해서 다음을 실행
    DECLARE
        v_job VARCHAR2(30) := 'SA_MAN';
    BEGIN
        DBMS_OUTPUT.PUT_LINE(v_job);
        my_proc(v_job);
        DBMS_OUTPUT.PUT_LINE(v_job);
    END;
    /

    * 삭제시에는
        DROP PROCEDURE procedure_name;


2. Creating Stored Functions

    * FUNCTION
        -. 리턴값이 할당되지 않는 곳에서는 사용 불가.
        -. SQL 안에서 함께 사용 가능하다.
        -. 프로시져와 비교해서 RETURN 절만이 추가된다.
    -- FUNCTION 사용하기
    -- join 으로 할 거 테스트하기 (이렇게 사용하지 말자) : 실제 Nested Loop Join을 발생시킨다..
    CREATE OR REPLACE FUNCTION fn_get_dept(p_dept IN NUMBER) RETURN VARCHAR2
    IS
        v_name VARCHAR2(50);>
    BEGIN
        SELECT department_name INTO v_name
        FROM departments
        WHERE department_id = p_dept;
        RETURN(v_name);
    END;
    /
    -- fn_get_dept FUNCTION 사용하기
    --column last_name format A20
    --column dname format A25
    SELECT employee_id, last_name, department_id,
                fn_get_dept(department_id) dname
    FROM employees;
    TIP) 위 처럼 하면, 모든 쿼리가 2번씩 실행되어, 성능에 지대한 영향을 끼친다.
          차라리 Sub Query 를 사용하자!
    (sub query는 같은 department_id 에 대해서는 쿼리가 한번만 실행된다!!)
    SELECT employee_id, last_name, department_id,
        ( SELECT department_name INTO v_name
        FROM departments
        WHERE department_id = A.department_id ) dname
    FROM employees A;
    * 삭제시에는
        DROP FUNCTION procedure_name;


    * Stored Function 제약사항!
    1) Parameter Mode : IN
    2) Parameter Data Type : Database Data Type
                                           -. Varchar2, Number : 정상
                                           -. Boolean, PLS-Integer : 사용불가
    3) Return Value Data Type  "2)" 동일
    4) DML 불가
    5) Commit , Rollback 불가
    6) 같은 테이블을 Fuction으로 만들고, 해당 Function을 같은 테이블로 처리시에는 에러!
         예) select ..., f(x) from emp  그리고  f(x) = select ... from emp 인 경우

    --> 실제 컴파일은 정상으로 처리되나, SQL과 함께 사용시에는 에러 발생됨!!!  (Runtime Error)


    * PROCEDURE 와 FUNCTION 차이
        -. standalone 형태로 사용할거면, procedure!!  (예 - 배치성 업무)
        -.


3. Creating Packages
    -. Oracle 패키지에서는 자주 사용 됨? (Forms, 기타 ... )
    -. OOP개념이 포함됨 (캡슐화)
    -. Specification + (Body) 로 구성됨.
        : spec에 정의한 내용들은 모두 public!  ex) public 변수, public procedure/function
          body에 정의한 내용들은 모두 private!  ex) private 변수, private proceduer/function
          body 내에서도 package 변수는 접근가능하나, local 변수라면 접근 불가.
          body없이 패키지만 사용하여, 상수 클래스와 같은 효과를 낼 수 있음.
    -. Anomymous, Procedure, Function 에서 사용 가능
        : Spec 접근 가능, Body 접근 불가
    -. 장단점.
        : 하나의 패키지로 묶으면, 한번의 IO만 발생하여, 성능이 좋다?
          대신 메모리 점유율 높아짐.
          여러개의 패키지로 안 묶고 단인 프로시져로 하면, 메모리는 낮지만 IO가 높아짐.
          그래서 관련있는 넘들만 패키지로 잘~ 묶을 것!

    * Spec
        -. public 성격, 외부 접근 가능
        -. Declaration : 선언

    * Body
        -. private 성격 : 외부 접근 불가
        -. Definition

    * 삭제
        DROP PACKAGE package_name;


    * BULK COLLECT
    * RETURNING ...
    * ...


10. Trigger
    -. DML/DDL Trigger 등이 있다.

    1) Statement Trigger
        : "For each Row" 사용하지 않음.
          DML 작업에 영향 받은 Row 수에 관계없이 1개 실행마다 1회만 fire

    2) Row Trigger
        : For each Row 키워드 사용
         영향받은 Row의 건수만큼 fire


    * Creating a DML Statement Trigger
    1) Trigger Timing : After, Before, (Instead of)
    2) Trigger Event : Insert, Update, Delete
    3) Trigger Table : ON <table명>
    4) Trigger Type : for each Row

    TIP) Trigger 를 이용해서 DML을 막을 수도 있다.
           -.  가령 업무 시간 이외에는 Insert 작업을 못 하도록 ...  (Page 10-11)
           -. 감사용도로써, DML을 일으키는 작업자와 시간, 예전 데이터 등을 기록 할 수도 있다. (Page 10-15)

저작자 표시
Posted by 승현아범
technology/web | script2010/03/11 16:06
1장. Introduction to PL/SQL

2장. Declaring PL/SQL Variables
3장. Writing Executable Statements

* Privilige
   -. System :  DBA로부터 권한 받음.
                    예) 시스템관리작업, Connection, 등
  -. Object : Owner + DBA로부터 권한 받음.
                    예) 테이블 Access 권한, Procedure 실행권한 등

* Role
   : System Privilige를 덩어리로 묶어 놓은 것. (관리목적으로...)


* Schema Object  -->  User 단위!!!
  1) Table
  2) Index : select 성능 높이고, DML은 성능 낮아진다.
  3) View
        -. 실제 Data는 없음.
        -. Base table 에서 데이터 가져온다.
        -. Database Dictionary 에서 해당 view query  문 저장
        -. DML Query 수행 가능
        -. 성능은 낮으나, 관리/보안 관련해서 좋다.
        -. 실제 Data를 포함하는 View도 있음 (Matialized view)

  4) Sequence
  5) Synonym
        -. alias(별명) 기능
        -. create public synonym dual for sys.dual ...
  6) Database Link
  7) Procedure
  8) Function
  9) Package
  10) Trigger


* Data type
    -. Date : 세기, 년도, 월, 일, 시, 분, 초, ...
                 select sysdate from dual 에서의 리턴값이 Date 타입
    -. Timestamp : 오라클9i 부터 추가 됨.
                           Date 타입 + Foractional second 추가 (초단위 이하 9자리까지 포함)
     -. 날짜 기간 (term) 에 사용된다.
       Interval Year to Month : 예) 1년 3개월
       Interval Day to Second : 예) 5일 6시간 20분 30초
        예) select  sysdate-근속기간  from dual ...     --> 날짜 계산에 좋다.

    -. CHAR : 문자 2K
    -. VARCHAR : 문자 4K
    -. Number : 숫자
    -. Date : 날짜
    -. Raw : 이진(Binary Data) : 4K
    -. LOB : 대용량 데이터 4G
            CLOB :Character ...
            BLOB : Binary ...
            BFile : 외부 OS 링크 정보 (DB와 OS File 모두 관리해야 함)

    -. Long : 문자 2G       --> 8i 시절에 사용되었으나 현재는 잘 사용하지 않음. 권장X
    -. Long Raw : 이진 2G   -> 8i 시절에 사용되었으나 현재는 잘 사용하지 않음. 권장X


 TIP) 환경변수
        show all
        show <환경변수>
        set <환경변수> <값>
        set feedback [on|off|b]


 * SQL*Plus 에서 "&"의 의미는? 치환변수
    예)
    > SELECT * FROM ...
       WHERE id = &id_num
    > Enter a value for id_num :
       _(cursor)

    cf) Bind 변수 (호스트 변수) : (java) Prepared Statement "?"

    Hard Parsing : 쿼리 컴파일
    Soft Parsing : SQL 원문 + P-Code + Execution plan
                         --> Cache 메모리에 저장하여 컴파일 여부 확인 (재사용 결정)
                              Library cache (shared pool)
                              --> 해당 메모리에 모든 SQL 남아 있음. LRU 알고리즘에 따라서
                                   가장 자주 사용하는 SQL은 남아 있고, 자주 쓰지 않는 SQL은
                                   사라진다.(Aging out)
                                   사라졌을 경우, 10g부터 AWR기능을 이용하여 찾는다.
                                   (또는 v$sql view 테이블을 백업받는다)


 * Transaction
    : 논리적인 작업단위 != 데이터 변경작업(SQL)

    Explicit Tx 종료방법
        -. commit or rollback 으로 Tx 종료

    Implicit Tx 종료방법
        1) Connection(Session) 종료
        2) Instance failure : DB 죽은 경우
        3) DDL(create, alter, drop, truncate) or DCL(grant) 명령어 수행
            --> auto commit!!!

    예) update - delete - create table - insert - rollback 수행했을 경우
         --> update - delete - create table 까지는 commit 수행되고,
              insert 작업은 rollback 됨!
              DDL이 auto commit 이기 때문에...

 * Boolean Data Type
    -. True
    -. False
    -. Null
        예1) SELECT * FROM XXXX
             WHERE name = NULL
             --> 조건문 자체가 NULL 이다. 검색하지 않는다!
                   NULL 처리는 "IS NULL" 로 확인한다.

        예2)
            TRUE AND TRUE       -> TRUE
            TRUE AND FALSE      -> FALSE
            TRUE AND NULL       -> NULL
            FALSE AND NULL      -> FALSE
            TRUE OR NULL        -> TRUE
            FALSE OR NULL       -> NULL

 * 조건문
    1) =, <>(!=), >, <, <=, >=
    2) LIKE 'S%'
        IN (100, 200, 300)
        BETWEEN 100 AND 200;
        IS NULL

 * 내장함수
    -. substr('oracle', 2, 3)   --> 'rac'
    -. substrb : substr과 동일하나, byte 단위로 처리함.
    -. rtrim('sos', 's')    --> 'so'
       rtrim('soss', 's')   --> 'so'
    -. ltrim
    -. decode(dept_id, 10, A, 20, B, others)
        : dept_id가 10이면 A, 20이면 B, 아니면 others
          그런데, decode는 oracle 전용 함수이다.
          그래서 ANSI 표준 SQL로 변경해 보면,
          CASE dept_id WHEN 10 THEN 'A'
                                WHEN 20 THEN 'B'
                                ELSE 'others' END
          또는
          CASE WHEN dept_id = 10 THEN 'A'
                   WHEN dept_id = 20 THEN 'B'
                   ELSE 'others' END

    -. Length('oracle') --> 6
       Lengthb('한글') --> 4

 * PL/SQL 구조
    DECLARE
        ...
    BEGIN
        ...
    EXCEPTION
        ...
    END

 * 변수
    a) PL/SQL 변수
            -. Scalar : CHAR, VARCHAR2, NUMBER, DATE (DB Data type)
                           Boolean, Binray-Integer, Binary-Double,, ...  (Non DB Data type)
            -. Composite : PL/SQL Record(record 구조)
                                   Index-By Table   : 배열구조
                                   Nested Table : 배열구조
                                   Varray : 배열구조
            -. Reference : REF(=Pointer구조와 유사)
            -. LOB : CLOB, BLOB, BFile

    b) Not PL/SQL 변수 : Bind변수(호스트변수)


    1) Identifier : 식별자(변수이름, 상수, user-define exception)
        -. 30자 이내
        -. a-z, A-Z, 0-9, #, _, $
        -. 문자로 시작
        -. DB, Table 상의 컬럼이름 중복사용 불가
        -. 대소문자 구분하지 않음
        -. 예약어 사용 불가

    2) 라인 구분자 : ;(세미콜론)
    3) 실행기호 : /
    4) 할당 연산자 : :=
        예) v_name := 'Smith'
    5) Comment (주석)
        한줄 주석 : --
        여러줄 주석 : /* ...   ... */ (반드시 /* 이후에 공백 포함해야 함)
    6) 리터럴 (Literal)
        -. SQL과 동일
    7) 연산자
        -. 산술 연산자 : +, -, *, /, **
        -. 비교 연산자 : =, >, <, >=, <=, <>(!=)
                              Between, And, In, Like, Is Null
        -. 논리 연산자 : And, Or, Not
        -. 연결 연산자(Concat) : ||

        --> SQL 과 모두 동일하다.
             (단, 2 ** 5 = 2에 5승 : PL/SQL에서만 사용)
    8) SQL Function
        -. Single-Row Function : UPPER, SUBSTR, LENGTH, ...
        -. Group Function : SUM, AVG, MAX, MIN, COUNT, STDDEV, VARIANCE, ...

        --> 그룹 함수 사용불가, 싱글함수는 모두 사용 가능 (단, DECODE만 빼고)

    9) 모든 변수의 초기값은 NULL 이다.


    TIP) 특수문자 처리
        SELECT   I'm Sam    FROM DUAL ...  에서 single appotropi(?) 표현하려면,
        --> SELECT   q'{ I'm Sam }'   FROM DUAL ...
             SELECT   q'[ I'm Sam ]'   FROM DUAL ...
             SELECT   q'! I'm Sam !'   FROM DUAL ...  와 같이 "q'{}" 처럼 쌍으로 묶어주면 된다.

저작자 표시
Posted by 승현아범
technology/web | script2010/03/11 16:04

4장. Interacting with the Oracle Server

1. SELECT ... INTO 절 ...
    --> Single-Row select 시에만 사용!! (여러건에 대해서는 Cursor를 사용)

   : Row Count >= 2 : TOO_MANY_ROWS 라는 Exception 발생됨.
     Row Count = 0 : NO_DATA_FOUND 라는 Exception 발생 됨.

2. DML

  INSERT , UPDATE , DELETE,

  MERGE : 9i 부터 생긴 DML
  MERGE INTO target_table
              USING src_table
              ON ( 조건 )
              WHEN MATCHED THEN
                   UPDATE SET ...

              WHEN NOT MATCHED THEN
                   INSERT INTO ...


  Multi-Table Insert 기능 등 ...


3. Tx : Commit, Rollback

4. SQL Cursor 속성
    SQL%ROWCOUNT
    SQL%FOUND
    SQL%NOTFOUND

* Cursor

    1) Implicit Cursor <-- 디폴트커서
        : select ... into ...,   DML문

    2) Explicit Cursor
        : 7장 : Multi-Row 처리

-. 클라이언트(SQLPlus, PL/SQL, Java, ...) 접속마다 서버측에 프로세스 생성 됨
-. 서버 프로세스에서 받아서 파싱하고, pcode 생성하고, Data file 에서 해당 정보를 가져온다.
-. 서버측에서는 파싱된 pcode를 SGA메모리(Shared Pool-Library cache, Database Buffer cache)에 올려 놓고,
   Library cache는 컴파일된 pcode, SQL, execute plan을 담고 있고, 이를 shared cursor 라고도 부른다.
   Soft Parsing = (Shared) Cursor가 공유 됨
                      = p-code 및 Execution Plan (in Library cache)이 재사용됨.
-. 클라이언트마다 개별 메모리 생성되는데,  (Private SQL Area, Session Memorry, SQL Work Area, ...)
    이 중에서 Private SQL Area메모리의 Hanle 정보가 바로 Cursor 이다.

-. Implicit Cursor는 바로 이 모든 작업을 Oracle이 자동으로 처리해주고,
-. Explicit Cursor는 이 작업 모두를 수동으로 처리해 줘야 ...
     a. 서버측에 Cursor(Private cursor) 를 생성하고,
     b. SQL을 execute 하고,
     c. 검색된 데이터(Active Set)를 row 별로 가져오고, (fetch 작업)
     d. SGA 메모리에서 해제 (Cursor Deallocate)


* Snapshot too old
-. select 등으로 데이터를 읽고 있는데, 다른 넘이 해당 데이터를 변경하고 commit 했다.
   commit 하지 않았다면 undo-segment 에서 예전 데이터를 가져와서 처리하면 되지만,
   commit 했다면, 최소 15분 동안은 유지되는 undo-segment 에서 해당 데이터를 읽어오고,
   15분이 지났다면 snapshot too old 가 발생한다.
   해결하려면,
   a. Query 문 재실행
   b. Select 문 튜닝
   c. undo segment 시간을 늘리기 위한 undo_retention 파라미터 값을 변경한다.
   d. Select 작업시 Row Locking 으로 다른 세션이 DML 작업을 하지 못하도록 ...



5장. Writing Control Structures

1. If문
   If ~ Then
   End if;

   If ~ Then
   ...
   Else
    ...
   End If;

   If ~ Then
   Elsif ~ Then
   Else ..
   End If;

   * 널(NULL)비교가 가능하다.
      IF(NULL < 1)      <-- 이 경우 리턴값은 NULL 이다!!! 에러가 아님!!
      또는 NVL 함수를 이용해도 됨.
      NVL(var_null, 0) < 11

2. Loop문
   Loop
    ..
        EXIT WHEN <조건식>
        ...
   END LOOP;


   WHILE <조건식> LOOP
    ...
   END LOOP;

   FOR i IN[REVERSE] 1..10 LOOP
   END LOOP;

    a. counter 변수(i)는 Declare 절에서 별도 선언하지 않음.
       :LOOP 시작, 종료시 Oracle에 의해 자동 할당/할당해지
       (LOOP내에서만 참조 가능)
    b.  10..1과 형식은 사용하지 않음.
        REVERSE 키워드 사용
    c. Lower/Upper bound는 리터럴, 상수 (반드시 정수여야 함)
    d. i 변수는 Reference만 가능. Assignement븐 불가능!




6장. Working with Composite Data Types

1.  PL/SQL  Record
    : 구조체 사용하는 것과 유사하다.

    DECLARE
        TYPE emp_rec_type IS RECORD
        (
            id NUMBER(3),
            name VARCHAR2(20),
            sdate DATE
        );
        emp_rec emp_rec_type;   // 실제 할당되는 부분

        예시)
        BEGIN
            emp_rec.id := 100;

        SELECT id, name, sdate
        INTO emp_rec
        FROM ...
        WHERE ...
        --> 이렇게 하면 id, name, sdate 의 값들을 emp_rec 라는 타입으로 한번에
             로딩이 가능하다.

        emp_rec2 employees%ROWTYPE;
        SELECT *
        INTO emp_rec2
        FROM employees
        WHERE ...
        --> 이렇게 하면 테이블의 컬럼을 하나도 수정하지 않고, 하드코딩 없이 테이블 컬럼
             정보를 그대로 받아 낼 수 있다.
             INSERT INTO XXX VALUES emp_rec2 및 UPDAE 도 활용 가능!!


2. Collection
    -. Index-By Table
    -. Nested Table
    -. Varray


    DECLARE
        TYPE ename_table_type IS TABLE OF VARCHAR(20)
        INDEX BY Binary_Integer;
        --> 테이블의 인덱스는 Binary_Integer 타입으로 하고, 컨텐츠는 VARCHAR(20)으로 하겠다는 의미.
             테이블의 인덱스는 Sequence 하지 않다.

        ename_table ename_table_type;

        예시)
        BEGIN
            ename_table(-123) := 'Smith';       // -123 인덱스값에 Smith 값 할당
            ename_table(0) := 'King';
            ename_table(1) := 'James';
            ename_table(3) := 'Alice'

            If ename_table(1) = ...  Then ...       // 비교
            v_temp := ename_table(3);           // 할당

            ename_table.COUNT --> 4로 리턴!
            ename_talbe.FIRST --> -125
            ename_talbe.LAST --> 3
            ename_table(ename_table.LAST) --> Alice 리턴!
            ename_table.EXISTS(2) --> false 리턴
            ename_table.PRIOR(1) --> 0 리턴
            ename_table.NEXT(1) --> 3 리턴
            ename_table.DELETE --> 모든 배열 삭제

    * 다차원 배열 또는 Collection 이 필요한 경우,
       Record 타입을 사용하면 된다.
       즉,  TYPE ename_table_type IS TABLE OF VARCHAR(20) 을
       TYPE ename_table_type IS TABLE OF emp_rec_type 으로 사용하면 된다.
       하나의 index 로 여러개의 컬럼을 갖을 수 있다.

       또는 테이블 컬럼과 동일하게 하려면,
       TYPE ename_table_type IS TABLE OF employy%ROWTYPE 이렇게 하면,
       employee 테이블의 컬럼과 동일한 타입을 갖는 구조를 갖을 수 있다.
       (참고.  employees.컬럼.%TYPE ...  )



7. Using Explicit Cursors

    * SQL문의 실행단계
                                                                                   in PL/SQL
    1). Cursor allocate (in PGA)                                        Declare
    2). Parse : Compile,                                                   Open
                     Library cache 참조,
                     Hard or Soft Parsing
    3). Bind : Bind 변수 값 적용 (into p-code)
    4). Execute : I/O 작업수행
                        Activeset 생성 (in PGA)
    5). Fetch : Active Set에 Row Pointer 변경                       Fetch
                    Cursor Attribute 정보 갱신
    6). Cursor deallocate                                                   close

    * Fetch 여부를 확인하는 방법
    Cursor명%ROWCOUNT --> row 갯수를 리턴
    Cursor명%FOUND  --> 데이터 있으면 True 리턴
    Cursor명%NOTFOUND --> 데이터 없으면 True 리턴

    * rownum 값은 실제로 Fetch 의 row 갯수를 리턴하는 것이다!!!!

    예시)
    Delare
        CURSOR  emp_id  IS
        SELECT id, name
        FROM EMP
        WHERE ...
        ORDER BY ...;

    BEGIN
        OPEN emp_cur;
        LOOP
            FETCH emp_cur INTO v_id, v_name;
            EXIT  WHEN emp_cur%NOTFOUND;  (or emp_cur%FOUND = False)
            ...
        END LOOP;
        CLOSE emp_cur;

    * Parsing 후 SQL원문, p-code, executing plan 비교 ...
       --> execution plan 튜닝과점에서...
            -. Access Plan : Full table scan,
                                    Index scan
            -. Join Method : Nested Loop Join       --> 적은 Row 일 경우, 효율적!!
                                     Hash Join                   --> 대량의 데이터에 적합!
                                     Sort-Merge Join        --> 정렬된 두 집합을 비교. eye check에 좋음.
            -. Join Order


8. Handling Exceptions

    Exception trapping  --> 정상종료
    Exception propagation   --> 비정상 종료

    1) Pre-Defined Exception
        -. 미리 정해진 에러 경우에 대해서 처리한다.
        예) TOO_MANY_ROWS, NO_DATA_FOUND, 등  (Page 8-12)

    2) Non-Predefined Exception
        -. WHEN OTHERS THEN + SQLCODE, SQLERRM
                예)
                    WHEN <exception_name> THEN
                        ...
                    WHEN OTHERS THEN
                        DBMS ... (SQLCODE || SQLERRM)

        -. User-defined exception 생성 + PRAGMA EXCEPTION_INIT
            : Predefined Exception이 아닌 오라클에러인 경우,
              사용자정의Exception으로 매핑시키고, 관련 처리를 수행한다. (Page 8-15)
              오라클에러를 Pre-Defined Exception처럼 처리한다.

    3) User-Defined Exception
        -. User Logical Error 인 경우로 업무로직상의 Exception을 던지고,
           받을때도 해당 사용자정의Exception 을 처리한다.

        --> 사용자정의Exception으로 체크하는 로직을 두거나, 또는 DB 레벨에서 체크를
             하는 방법도 있음.
             예) CREATE TABLE EMP (
                        ...
                        salary NUMBER(5,2) CHECK( salary >= 0) ...
                        : salary 컬럼은 값이 0 이상이어야 한다
                        ...
                   )

    TIP) 익명 블럭을 만들어서, EXCEPTION 처리를 하고, 이후 블럭에서 정상 처리한다.
            예)
                Declare
                    e_invalid_number EXCEPTION;
                Begin
                    Begin
                        Select ... Into ...
                        From ...
                        Where ...
                    Exception
                        When Others ...  Then
                        v_ret = 0;
                        ...
                    End

                    여기서 Exception이 발생했다면(변수로 구분), 이후 사후 처리를 한다.
                    If v_ret = 0 Then;
                    ...

                End

저작자 표시
Posted by 승현아범
technology/web | script2009/09/07 16:04
Mozilla 에서 Firefox 3.6 (현재버전 3.5.2) 부터 XPCOM 플러그인 지원을 중단한다고 발표했다.
흔히 Firefox에서의 ActiveX로 여겨지던 기술이었는데, 사라진다고 한다.
모대학교 산학협력 과제물로 Linux에서 전자서명 라이브러리를 개발한 적이 있었는데,
이때 사용했던 클라이언트 기술이 XPCOM 이었다.
대안 기술로는 2004년 SUN, Adobe, Mozilla, Apple, Opera 등이 합의한 NPAPI 기술로 변경된다고 한다.
MS 몇몇 브라우저에서는 지원이 된다는데...

어쨌든 알고 있는 기술 하나가 사장된다고 하니 ...  기분이 썩 좋지만은 않다.

저작자 표시
Posted by 승현아범
TAG NPAPI, xpcom
technology/web | script2009/05/15 17:41
소스코드를 이쁘게 보이기 위해서 SyntaxHighlighter 를 적용해 봤다.
이쁘긴 한데... 조금의 삽질이 있었기에... 아쉬움이 남는다.
-. 주로 Tistory를 이용할 때는 FF를 사용했는데... 이게 FF에서는 먹질 않아서 삽질 좀 했다.
혹시라도 이 내용을 설정하거나 참고하실 경우 언제나 상쾌한 기분 블로그를 참고하시기 바랍니다.
public class HelloTest()
{
    public static void main(String[] args)
    {
        System.out.println("Hello World");
    }
}
Posted by 승현아범
technology/web | script2009/04/15 14:41
간만에 책 소개를 한다.
시스템 튜닝이라 하면 주로 백오피스나 미들웨어와 같은 주요 시스템에 대해서 고려된다.
그렇지만 이 책에서는 서버쪽이 아닌 UI 단을 그 대상으로 하고 있다.
흔히 개발자들이 javascript을 간과했던것 처럼 UI 튜닝에 대해서도 같은 생각을 갖고 있지 않았나 싶다.

이 책은 크게 14가지의 튜닝 기법을 설명하고 있다.

1. HTTP 요청을 줄여라
2. 콘텐츠 전송 네트워크를 이용하라.
3. 헤더에 만료기한을 추가하라.
4. Gzip 컴포넌트 (압축을 사용해라)
5. 스타일시트는 위에 넣어라.
6. 스크립트는 아래에 넣어라.
7. CSS Expression을 피하라.
8. 자바스크립트와 CSS를 외부 파일에 넣어라.
9. DNS 조회를 줄여라.
10. 자바스크립트를 최소화하라.
11. 리다이렉트를 피하라.
12. 중복되는 스크립트를 제거하라.
13. ETag를 설정하라.
14. 캐시를 지원하는 Ajax 만들기.

주요 분석 대상이 되는 사이트는 미국 상위 10개 사이트(Amazone, AOL, CNN, eBay, Google, MSN, MySpace, Wikipedia, Yahoo!, YouTube) 이다. 각 사이트의 주요 튜닝 포인트를 어떻게 구현하고 있으며 성능 결과가 어떻게 나오는지에 관해서 설명한다.
또 재밌는 부분은 도대체 이러한 성능 비교 및 측정은 어떻게 하느냐인데... (사실 난 이 부분이 가장 흥미진진했다)
저자는 몇가지 툴을 소개하고 있다.

IBM Page Detailer
저자가 가장 선호하는 툴이라고 하는데 특별해 보이지는 않는다. 최근에는 각종 브라우저 플러그인들이 지원하는 내용들이라서... 그리고 아무래도 alphawoks 다 보니 UI가 그렇게 친절해 보이지는 않는다.
IBM에서 로그인 이후에 PageDetailerBasic526.exe 를 다운받으면 된다.
그리고 기타 Firebug, yslow, jslint, jsmin, iewatch 등을 소개하고 있다.
(IEWatch는 역자가 소개한 툴로 국내에서도 많이 알려져 있다.)

전반적으로 UI측명에서의 성능개선이라는 점이 상당히 눈에 띄는 내용이었고, Yahoo! 에서 근무한 저자의 노하우가 어깨너머로 많이 보이는 듯 싶었다.
최근 웹 2.0 이 강조되는 트랜드에서 웹개발자라면 읽어서 후회없는 책일 것 같아 추천한다.

참고 : Yahoo! Best Practices for Speeding Up Your Web Site
Posted by 승현아범
technology/web | script2009/04/03 18:10
Yahoo! releases new performance best practices

http://dean.edwards.name/packer/
Posted by 승현아범
technology/web | script2009/03/14 03:08
오늘 블로그를 방문했던 글들은 대부분 ActiveX 에 관련된 글들이 많았습니다.
그 시작은 차니의 블로그에 실린 "보안업체, 온실 속의 화초일 뿐..." 글이었는데 저의 현재 업종 및 이력과 상당 부분 관련이 있기 때문입니다.
전에 근무하던 직장이 국내유수의 보안업체였고, 현재는 흔히 얘기하는 "갑"이란 회사를 다니고 있습니다.
그리고 주로 좋아하는 분야는 표준과 관련된 동향들입니다.
이러한 상황이다보니 ActiveX 관련 글들은 상당히 민감할 수 밖에 없더군요.
그래서 입장이 틀린 3가지 생각을 정리하려 합니다.

  • 기존 보안업체에 근무했을 당시의 시각
          사실 두가지 관점 밖에는 없다. 돈과 기술!
          매출은 고객사가 주기 때문에 고객사의 의견이 최우선이다. (뭐 지금은 꼭 그런것만은 아닌것 같지만...) 
          고객사의 의견을 반영하고, 방향을 제시해 줄 수 있는 기술이 있어야만 한다.
          하지만 기술 또한 고객사의 의견에 맞춰질 뿐이다.
          간단한 예로, ActiveX 를 대체할 수 있는 기술이 있지만 개발을 위한 투자는 고객사로부터 나오기 때문이다.
          - 보통 프로토타입 정도는 업체에서도 개발을 한다. 하지만 제품으로써의 완성은 고객사가 결정하는 구조이다.
          이것이 한계였던것 같다... 창의적이고 선도적인 개발을 할 수 없었다는 한계

  • 표준과 웹의 동향을 지켜보는 시각
           차니의 블로그에 실린 글들에 대해서는 89% 정도 동의한다. - 나머지 11%는 시각의 차이가 있는거 같다.
           오픈웹에 실리는 글들에 대해서도 이해는 된다.
           하지만 위 글들은 사회적으로 많은 동의가 필요로 해 보인다. 아직 시간이 더 필요하다는 생각일뿐...

  • ActiveX를 서비스하는 시각
          대안이 없다!
          지금의 나의 생각이다. 업체와 당사간의 이해관계가 물려있고, 검증되지 않은 제품을 내가 검증하고 싶은 생각이 없기
          때문이다. 이럴때는 누군가(?)의 강제와 중재가 필요로 해 보인다.
          나의 작은 노력은 ActiveX 를 좀 더 빠르고, 쉽게 제거할 수 있도록 프로그램할 뿐이다.
          확실한(?) 대안이 나타날 때까지의 준비랄까...


세가지 생각은 너무나도 상반된 입장을 갖고 있다. 복잡하게 얽혀 있고, 여러 기관 및 업체, 사용자들의 이해관계가 물려 있다.
하지만 현재의 웹 표준화 추세들은 옳은 방향으로 보이며, 변화는 점점 피부에 와 닿을 만큼 빨리 다가오고 있다.
3월 25일 발표되는 김기창교수의 오픈웹 소송2심 결과가 기대된다.
Posted by 승현아범