[본문스크랩] PL/SQL (4) - 연산자

오라클 | 2007. 12. 21. 15:27
Posted by 시반

###################################################################################################

#   source site : blog.naver.com/tangamjaelt

#   master : 강용운

#   email : tangamjaelt@korea.com

#   last release : 2007.05.07

###################################################################################################

 

연산자 종류

 

- 대입 연산자

      변수   :=    값

 

- 산술 연산자

      ** : 지수연산자. 10**5 = 10*10*10*10*10

      + - * / : 산술계산

 

- 비교 연산자 : 반환값은 True / False.

      =  : 대등 연산자

     <>, !=, ~=  : 부등 연산자

     <, >, <=, >=  : 범위 비교

     LIKE  : 패턴일치 연산자  (log% : log로 시작하는 모든 것.  log___ : log로 시작하고 log 뒤에가 3자리인 것)

     BETWEEN a AND b : 지정한 범위(a~b) 사이

     IN  : 값이 목록내에 있는지 

     IS NULL  : 값이 null인지 조사

 

 

 

[예제1] LIKE 연산자를 사용한 함수  - 함수이기 때문에 RETURN 값을 지정하여야 한다.

********************************************************************************************************************

CREATE OR REPLACE FUNCTION mobile_phone (phone_number IN VARCHAR2)

RETURN VARCHAR2 AS

BEGIN
        IF phone_number LIKE '___-%-____' THEN

                IF SUBSTR(phone_number,1,3) = '011' THEN
                        RETURN 'SK Telecom 011';

                ELSE IF SUBSTR(phone_number,1,3) = '016' THEN
                        RETURN 'KTF 016';

                     ELSE
                        RETURN 'ETC...';

                     END IF;
                END IF;
        END IF;
END;
/
********************************************************************************************************************

 

SQL> set serveroutput on

 

SQL> select * from dba_objects where object_name like 'MOBILE%';  ☞ VALID 상태 확인

 

 

SQL> select mobile_phone('016-0000-0000') MAKER from dual;

 

MAKER
--------------------------------------------------------------------------------
KTF 016

 


 

- 논리 연산자

     AND, OR, NOT

 

- 스트링 연산자

     ||  : 스트링 연결 연산자.  ex) myname = 'Kang' || ' ' || 'Yong Woon';

 

 

 

연산자 우선순위

- 눈으로 확인하기 어려운 복잡한 식의 경우 괄호를 사용하여 우선순위를 제어하거나 보기 쉽게 한다.

 

  ①  **, NOT

  ②  +,- (양수,음수)

  ③  *,/

  ④  +,-,||  

  ⑤  =, <>, !=, ~=, <, >, <=, >=, LIKE, BETWEEN, IN, IS NULL

  ⑥  AND

  ⑦  OR

 

 

NULL

- NULL 값 조사시엔 항상 IS NULL 연산자를 사용해야 한다.    ex) IF a = NULL   ▶   IF a IS NULL

- NVL 함수를 통해 값이 NULL 일때 기본값을 지정할 수 있다.   NVL(식, Null 일때 값)

 

 

형 변환

- 자동으로 형변환이 이루어지거나, 직접 형변환을 지정할 수 있다.

- 자동으로 형변환이 이루어지게 하는 것보다는 명시적으로 변환시키는 것이 좋다.

- 관련 함수

TO_DATE : 문자 → 날짜

TO_NUMBER : 문자 → 숫자

TO_CHAR : 숫자,날짜 → 문자

 

 

[본문스크랩] PL/SQL (3) - 블럭 구조

오라클 | 2007. 12. 21. 15:27
Posted by 시반

###################################################################################################

#   source site : blog.naver.com/tangamjaelt

#   master : 강용운

#   email : tangamjaelt@korea.com

#   last release : 2007.05.04

###################################################################################################

 

PL/SQL을 마스터하기 위해서는 블럭 구조와 블럭의 다양한 종류, 블럭의 사용법을 이해하는 것이 필수적이다.

 

 

Anonymous Block (이름 없는 블럭)

- 아무런 이름이 없는 블럭으로 프로시저나 함수, 트리거의 본문을 형성하지 않는 블럭

- 이는 SQL*Plus 스크립트의 일부로 인라인으로 사용될 수 있으며, 오류 처리 목적으로 프로시저와 함수 블럭 내부에 포함될 수도 있다.

- DECLARE 라는 예약어를 사용하여 시작하고 다음 예약어인 BEGIN 사이에 변수를 선언한다.

- BEGIN 예약어는 블럭의 절차적 부분이 시작된다는 것을 알려준다. 프로그램 코드가 이 부분에 온다.

- EXCEPTION 예약어는 블럭에서 예외 처리 코드를 갖는다.

 

*******************************************************

DECLARE

      변수 선언문;

BEGIN

      프로그램 코드

EXCEPTION

      오류처리 코드

END;

*******************************************************

 

 

Function Block (함수 블럭)

- DECLARE 예약어 대신 그 자리에 함수 헤더가 온다.

- 함수 헤더는 함수 이름과 파라미터들을 기술하고, 반환값의 형을 나타낸다.

- 인수목록 : 함수에 대한 입력 파라미터와 출력 파라미터 목록을 기술한다.

- RETURN : 반환값에 대한 데이터형을 기술한다.

*******************************************************

FUNCTION 이름 [(인수목록)] 

RETURN 데이터형 {IS, AS}

      변수 선언문;

BEGIN

      프로그램 코드

(EXCEPTION

      오류처리 코드)

END;

********************************************************************************************************************

DECLARE
        temp NUMBER;

 

        FUNCTION iifn(boolean_expression IN BOOLEAN,
                        true_number IN NUMBER,
                        false_number IN NUMBER)
        RETURN NUMBER IS

 

        BEGIN
                IF boolean_expression THEN
                        RETURN true_number;


                ELSIF NOT boolean_expression THEN
                        RETURN false_number;


                ELSE
                        RETURN NULL;


                END IF;
        END;

BEGIN
        DBMS_OUTPUT.PUT_LINE(iifn(2>1,1,0));
        DBMS_OUTPUT.PUT_LINE(iifn(2>3,1,0));

        temp := iifn(null, 1, 0);

        IF temp IS NULL THEN
                DBMS_OUTPUT.PUT_LINE('NULL');
        ELSE
                DBMS_OUTPUT.PUT_LINE(temp);
        END IF;
END;
/

********************************************************************************************************************

 

 

 

Procedure Block (프로시저 블럭)

- 함수와 비슷하다.

- 함수와 다른점은 함수는 값을 반환하고 식에 사용할 수 있지만, 프로시저는 값을 반환하지 않으며 식에 활용할 수 없다.

*******************************************************

PROCEDURE 이름 [(인수목록)] {IS, AS}

      변수 선언문;

BEGIN

      프로그램 코드

(EXCEPTION

      오류처리 코드)

END;

********************************************************************************************************************

DECLARE
        first_number NUMBER;
        second_number NUMBER;

 

        PROCEDURE swapn(num_one IN OUT NUMBER,
                        num_two IN OUT NUMBER) IS
                temp_num NUMBER;
        BEGIN
                temp_num := num_one;
                num_one := num_two;
                num_two := temp_num;
        END;

 

BEGIN
        first_number := 10;
        second_number := 20;
        DBMS_OUTPUT.PUT_LINE('First Number =' || TO_CHAR(first_number));
        DBMS_OUTPUT.PUT_LINE('Second Number =' || TO_CHAR(second_number));

 

        DBMS_OUTPUT.PUT_LINE('Swapping...');
        swapn(first_number, second_number);

 

        DBMS_OUTPUT.PUT_LINE('First Number =' || TO_CHAR(first_number));
        DBMS_OUTPUT.PUT_LINE('Second Number =' || TO_CHAR(second_number));
END;
/
********************************************************************************************************************

 중첩 블럭

- Block 내에 Block 이 들어감

- 변수는 블럭 내부에서만 사용 가능하다. 상위 레벨의 변수는 하위 레벨에서 모두 사용 가능하다.

- BEGIN 내에 정의

********************************************************************************************************************

DECLARE
        error_flag BOOLEAN := false;

BEGIN
        DBMS_OUTPUT.PUT_LINE('100~1000 counting');

        DECLARE
                hundreds_counter NUMBER(1,-2);
        BEGIN
                hundreds_counter := 100;

                LOOP
                        DBMS_OUTPUT.PUT_LINE(hundreds_counter);
                        hundreds_counter := hundreds_counter + 100;

                        IF hundreds_counter > 1000 THEN
                                EXIT;
                        END IF;
                END LOOP;
        EXCEPTION
        WHEN OTHERS THEN
                error_flag := true;
        END;

        IF error_flag THEN
                DBMS_OUTPUT.PUT_LINE('Can not count.');
        ELSE
                DBMS_OUTPUT.PUT_LINE('Count Done.');
        END IF;
END;
/
********************************************************************************************************************

 

 

 

 

Trigger Block (트리거 블럭)

- 트리거란 어떤 동작이나 사건이 발생했을 때 샐행되는 코드를 정의하는데 사용된다.

- 처음에 나타나는 구문은 트리거의 종류, 트리거와 연결된 테이블, 트리거가 발생해야 할 때를 말해주는 것이다.

- 예를 들어 특정 User가 CREATE, DROP, ALTER 등의 DDL 문을 실행하게 되면 트리거에서 사용을 막게 할 수 있다.

***************************************************************

CREATE [OR REPLACE] TRIGGER 트리거이름

{BEFORE|AFTER} 동사목록 ON 테이블이름

[[REFERENCING 상호관계이름] FOR EACH ROW [WHEN (조건)]]

DECLARE

      선언문

BEGIN

      PL/SQL코드

END;

****************************************************************

- 동사목록 : 트리거를 발생시키는 SQL 동사

- 테이블이름 : 트리거가 정의되는 테이블

- 조건 : 트리거 실행 조건

- 선언문 : 변수, 레코드, 커서 선언문으로 구성

- PL/SQL코드 : 트리거가 발생할 때 실행되는 PL/SQL 코드

 

[본문스크랩] PL/SQL (2) - 데이터형

오라클 | 2007. 12. 21. 15:26
Posted by 시반

###################################################################################################

#   source site : blog.naver.com/tangamjaelt

#   master : 강용운

#   email : tangamjaelt@korea.com

#   last release : 2007.05.01

###################################################################################################

 

데이터형 (datatype)

- PL/SQL 에서 블럭은 프로그래밍의 기본 단위이다.

- 블럭은 프로그램 코드와 변수 선언문을 둘 다 갖고 있다.

 

스칼라 변수

VARCHAR2

가변 길이 문자 스트링

CHAR

고정 길이 문자 스트링

NUMBER

고정 소수점 또는 부동 소수점 숫자

DATE

날짜

BOOLEAN

TRUE/FALSE

 

변수 명명 규칙

① 변수이름은 문자,$,_,# 으로 구성된다.

② 변수이름은 반드시 문자로 시작한다.

③ 변수이름은 최대 30자이다.

④ 변수이름은 대소문자를 구분하지 않는다.

⑤ 알아보기쉽게 쓴다.  (empyearsal → emp_year_sal → Emp_Year_Sal)

⑥ 변수, 함수, 프로시저 이름등을 쉽게 구분하기 위해 예약어는 대문자만 사용하는 경우도 있다.

 

변수선언

student_id VARCHAR(16);

student_name VARCHAR2(10000);

 

변수에 값 할당

student_id := 'kangyw';

student_name := 'Kang Yong Woon';

 

CHAR 와 VARCHAR 차이점

- CHAR 는 고정된 길이의 데이터를 저장. 빈공간은 공백으로 채워짐. (ex. 학번,사번,주민번호 등 정해진 길이)

   스트링 비교를 할 경우, 공백도 1byte로 계산됨.

- VARCHAR 는 정해지지 않은 길이의 데이터를 저장하는데 사용됨.

 

 

[예제1] CHAR는 VARCHAR의 차이점.

 

$ vi /export/home/oracle/plsql/test_35p.sql

 

********************************************************************************************************************

DECLARE

         student_id CHAR(20);

         student_name VARCHAR(20);

BEGIN

         student_id := 'kangyw';

         student_name := 'kangyw';

 

         IF

                  student_id = student_name;

         THEN

                  DBMS_OUTPUT.PUT_LINE('Same');

         ELSE

                  DBMS_OUTPUT.PUT_LINE('Not Same');

         END IF;

END;

/

********************************************************************************************************************

 

SQL> SET SERVEROUTPUT ON

SQL> @/export/home/oracle/plsql/test_35p

 

 

- CHAR 와 VARCHAR 모두 20 byte를 할당 받지만,

- CHAR는 kangyw 을 사용하고 남은 14byte를 공백으로 채우고, VARCHAR 는 6 byte만 사용하고 14 byte는 사용하지 않는다.

- 공백을 무시하고 비교하기 위해서는 rtrim 함수를 사용한다.

 

 

[예제2] RTRIM 을 사용하여 문자 비교하기 (우측 공백 제거 함수)

 

$ vi /export/home/oracle/plsql/test_36p.sql

 

********************************************************************************************************************

DECLARE

         student_id CHAR(20);

         student_name VARCHAR(20);

BEGIN

         student_id := 'kangyw';

         student_name := 'kangyw';

 

         IF

                  RTRIM(student_id) = student_name;

         THEN

                  DBMS_OUTPUT.PUT_LINE('Same');

         ELSE

                  DBMS_OUTPUT.PUT_LINE('Not Same');

         END IF;

END;

/

********************************************************************************************************************

 

 

- 공백을 제거하니 Same 이라는 결과가 나온다.

 

 

NUMBER

- 고정 소수점과 부동 소수점 숫자를 정의

- 범위 : 1.0E-123 ~ 9.99E125 까지

- 정밀도 : 몇 자리를 사용할 것인지 표시

- 스케일 : 소수점의 위치를 표시

- 형식 : 변수명 NUMBER [(정밀도[,스케일])]

            예) NUMBER(4,2) ▶ 4자리 수이고 소수점은 오른쪽 2번째에 온다. 

                                         73.127 을 입력하면 반올림이 되어 73.13 이 나온다.

            예) NUMBER(3) ▶ 기본스케일 0. 정수로 표시되고, 소수 첫째자리에서 반올림 된다. 

                                       345.1 을 입력하면 345 로 표시된다. -345.12 를 입력하면 -345 로 표시된다.

            예) NUMBER(5,-2) ▶ 스케일이 음수로 표시되면 정수쪽으로 반올림이 발생한다.

                                           10345 을 입력하면 100단위로 끊어져, 10300 이 나온다. 주식 100주 단위로 표시할 때 사용.

 

[예제3] NUMBER

 

********************************************************************************************************************

DECLARE

        number1 NUMBER(4,2);

        number2 NUMBER(3);

        number3 NUMBER(5,-2);

BEGIN

        number1 := 73.127;

        number2 := 345.1;

        number3 := 10345;

 

        DBMS_OUTPUT.PUT_LINE(number1);

        DBMS_OUTPUT.PUT_LINE(number2);

        DBMS_OUTPUT.PUT_LINE(number3);

END;

/

********************************************************************************************************************

 

 

 

DATE

- 날짜와 시간값을 저장

- 기본적으로 날짜,시간이 항상 포함된다.

- 시간을 지정하지 않으면 자정으로 표시. (am 12.:00:00)

- 범위 : BC 471년 1월 1일 ~ AD 4712년 12월 31일 까지

- 시간을 빼고 날짜만 비교하려면 TRUNC 함수를 사용한다.

 

[예제4] DATE

 

********************************************************************************************************************

DECLARE

        birthday DATE;

BEGIN

        birthday := TO_DATE('28-DEC-1982', 'DD-MON-YYYY');

        DBMS_OUTPUT.PUT_LINE(birthday);

END;

/

********************************************************************************************************************

 

 

 

 

[본문스크랩] PL/SQL (1) - 개념과 예제

오라클 | 2007. 12. 21. 15:15
Posted by 시반

###################################################################################################

#   source site : blog.naver.com/tangamjaelt

#   master : 강용운

#   email : tangamjaelt@korea.com

#   last release : 2007.06.11

###################################################################################################

 

PL/SQL 이란?

- Procedural Language / Sturctured Query Language

- SQL에 프로그래밍 언어 설계 기능을 절차적으로 추가한 것

- 오라클사가 데이터베이스에서 SQL에 대해 절차적 로직을 실행하는 방법을 제공하기 위해 개발한 절차적 언어

- 데이터 캡슐화, 예외 처리, 정보 숨김, 객체 지향 등의 현대 S/W 공학 기능 제공

- SQL문을 블록 구조 및 프로시저 단위 코드에 포함시킬 수 있는 강력한 트랜잭션 처리 언어

 

PL/SQL 처리과정

- 오라클 선행 컴파일러에서 PL/SQL 블록(코드)를 제출하면 Oracle Server 내의 PL/SQL 엔진이 이를 처리한다.

- PL/SQL 엔진은 블록 내의 SQL문을 분리하여 하나씩 SQL문 실행자로 전송한다.

- PL/SQL 코드는 Oracle Server 에 저장할 수 있으며, 이름 앞에 Stored를 붙여 부른다. (Stored Procedure)

- Oracle Developer 와 같은 오라클 툴에는 Oracle Server의 엔진과는 별도로 자체 PL/SQL 엔진이 존재한다.

 

실습에 필요한 권한

- CREATE PROCEDURE

- CREATE SESSION

- CREATE TABLE

- CREATE TRIGGER

- CREATE VIEW

- CREATE TYPE

 

실습에 필요한 패키지

- DBMS_OUTPUT

- DBMS_SQL

- UTL_FILE

- DBMS_PIPE

- DBMS_ALERT

 

※ 패키지 확인

SQL> SELECT OBJECT_NAME FROM DBA_OBJECTS WHERE OWNER='SYS' AND OBJECT_TYPE='PACKAGE';

 

 

PL/SQL Block 구조

********************************************************************************************************************

DECLARE

     변수 선언문;

BEGIN

     프로그램 코드;

EXCEPTION

     예외 처리문;

END;

********************************************************************************************************************

- 변수선언문 : 블럭에서 사용할 변수를 정의. 커서 정의와 중첩된 PL/SQL 프로시저 및 함수도 여기서 정의.

- 프로그램코드 : 블럭을 구성하는 PL/SQL 문.

- 예외처리문 : 런타임 오류나 예외 발생시 트리거되는 프로그램 코드.

 

- 각 블럭에서 문장의 끝을 알리기 위해 반드시 세미콜론(;)을 붙인다.

- BEGIN 내에 다른 블럭을 내포할 수 있다.

 

[예제1] 간단한 작성과 실행

********************************************************************************************************************

DECLARE

       x       NUMBER;

BEGIN

       x := 65400;

END;

/

********************************************************************************************************************

- 맨 끝의 '/' 슬래시는 SQL*Plus에게 PL/SQL 코드의 입력이 끝났음을 알리고 이를 오라클 데이터베이스로 보내는 역할.

 

 

 

[예제2] 결과 출력하기

- 출력은 DBMS_OUTPUT 패키지가 담당한다.

- 패키지 안에 dbms_output.put_line 프로시저 사용.

- 출력을 SQL*Plus 에서 보려면

  SQL> SET SERVEROUTPUT ON 을 먼저 실행해야 한다.

 

********************************************************************************************************************

DECLARE

       x       NUMBER;

BEGIN

       x := 65400;

       dbms_output.put_line('The variable x = ');

       dbms_output.put_line(x);

END;

/

********************************************************************************************************************

 

- 내용을 /export/home/oracle/plsql/test.sql 파일에 저장하고 불러들일 수도 있다. 기본확장자는 .sql 이다.

- 간단한 내용은 vi editor를 통해 수정하면 되겠지만, Buffer는 바로 직전의 SQL문만 저장하고 있기 때문에 긴 PL/SQL 프로시저는 반드시 텍스트파일로 만들어서 실행시키는 형식을 취하도록 한다.

 

$ vi /export/home/oracle/plsql/test.sql

내용기입

:wq

 

SQL> @/export/home/oracle/plsql/test

 

 

 

[예제3] 함수 작성하기

- PL/SQL을 사용하여 Stored 함수와 Stored 프로시저를 작성한다. 방금까지 작성했던 코드를 Stored 함수로 캡슐화 시키면 그것을 한번만 컴파일하고 데이터베이스에 저장해 놓았다가 나중에 다시 사용할 수 있다.

- DB내에 stored 함수를 만들어 놓으면 나중엔 그 함수만 불러다 쓰면 된다.

 

********************************************************************************************************************

CREATE OR REPLACE FUNCTION ss_thresh

RETURN NUMBER AS

         x       NUMBER;

BEGIN

         x := 65400;

         RETURN x;

END;

/

********************************************************************************************************************

- OR REPLACE 는 동일한 함수가 존재하면 덮어쓰라는 의미이다.

- 1~2줄 CREATE 부터 AS 까지가 DECLARE 부분이다.

- 함수를 생성하는 것은 오라클이고 SQL*Plus는 결과만 보여줄 뿐이다.

 

 

SQL> SELECT * FROM DBA_OBJECTS WHERE OBJECT_NAME = 'SS_THRESH';

 

 

 

[결과 확인]

- 함수를 작성하고 컴파일을 하였으니 이제 사용만 하면 된다. 함수이지만 ( )를 사용하지 않는 이유는 인수가 없기 때문.

 

SQL> SELECT SS_THRESH FROM DUAL;

 

 

- 함수 생성시 STATUS가 INVALID 로 되어 있어 사용할 수 없기 때문에 코드에 잘못된 부분이 있는지 확인하고 수정 후 VALID 상태로 변경해야 한다. 오래 사용하지 않는 함수나 프로시저, 패키지도 INVALID 상태가 될 수 있다.

 

 

[에러확인]

- 위의 예제에서 실수로 입력이 잘못되었을 경우 에러를 확인하는 방법은 에러가 나고 바로 SHOW ERRORS 를 쳐보면 된다.

 

 

Oracle Stored Procedure 생성

오라클 | 2007. 12. 21. 15:06
Posted by 시반

툴에 익숙해진다는건 많은 부분을 놓치고 살게 된다는 사실을 오늘도 알게 되었다.

항상 토드나 이클립스 플러그인등으로 콘솔창이 아닌 곳에서 작업을 하다보니

툴이 지원되지 않은 곳에서 작업을 하게 되었을 땐 대략 난감한 일들이....

 

오늘은 간만에 오라클 콘솔에서 디비를 백업한 후 변경된 function과 procedure를 반영하는 일이 생겼다.

헌데 이게 무슨일 아무리 해두 생성 자체가 되지 않았다.

흐음 왜그러지 왜그러지...설정스크립트를 잘못 만들었나?

파일을 열고 그중 하나를 복사해서 실행해 봤지만 생성은 무슨....역시나 택도 없었다.

 

곰곰히 살펴보니 아차 마지막에  "/"  게 빠져있는게 아닌가..

툴에서는 사용자 편의를 위해 기냥 실행시켜두 생성이 되도록 지원을 하고 있었던 탓에

나도 언제부턴가 프로시저 생성 스크립트 안에서 /를 쓰지 않고 있었던 게 오늘의 실수.

 

하루 하루 참 부끄럽게도 초보도 하지 않는 실수를 연발하고 있으니...

요새 내가 귀밑머리에 허연게 보이더니만 결국 치매였던가....

 

아래는 기냥 글을 마치기에는 아쉬운 맘에 프로시져 생성 기본 탬플릿을 올려본다.

 

CREATE OR REPLACE PROCEDURE PROCEDURE_NAME IS
V_TEMP NUMBER;
/******************************************************************************
   NAME:       PROCEDURE_NAME 
   PURPOSE:    사용목적 간략 기술 

   REVISIONS:
   Ver        Date        Author           Description
   ---------  ----------  ---------------  ------------------------------------
   1.0        2007-12-21          1. Created this procedure.

******************************************************************************/
BEGIN
    V_TEMP := 0;
   
   
EXCEPTION
    WHEN NO_DATA_FOUND THEN
        NULL;
    WHEN OTHERS THEN
        RAISE;
END PROCEDURE_NAME;
/

 

 

문자가 부적합하다니...로그를 찍어봐두 인수값을 찍어봐도 아무런 문제가 없건만

에러가 나더라. 원인은 sql마지막에 ; 이 찍혀있던 탓.

이궁 어플리케이션 내 오라클 sql문 마지막에는 ;를 빼고 해야 한다는 정말 초보적인 실수를...

 

여하튼 오타땜시 코드를 살펴봐야 하는 이 저주받을 손가락 같으니라구

 

다시는 그런 실수를 하지말라는 다짐아래 글을 남겨본다

 

원인 : 어플리케이션 안에 쿼리문에 쿼리 이외의 문자가 존재할 경우 발생

특히 쿼리 마지막에 ';' 가 존재할 경우 발생되기 쉬움

 

ex)

StringBuffer sql = new StringBuffer();

sql.append(" insert into dept (dept_id,name)  values(?,?) ; ");    <- 바로 이 부분

 
블로그 이미지

시반

시반(詩伴)이란 함께 시를 짓는 벗이란 뜻을 가지고 있습니다. 함께 나눌수 있는 그런 공간이길 바라며...

카테고리

분류 전체보기 (233)
개발 이야기 (73)
WEB2.0 (57)
DB2 (24)
MySQL (6)
오라클 (26)
기타 (44)
취미 (0)
잡담 (2)