천객만래 [千客萬來] (It has an interminable succession of visitors)

이벤트에서 트랩될 수 있는 시스템 에러

Error.Number

Error.Text

1

0으로 나눔

2

참조할 오브젝트가 Null 임

3

배열의 영역이 초과됨

4

열거된 값이 함수의 범위를 벗어남

5

함수에서 음수값을 반환함

6

지정된 행/열에 데이터윈도우가 맞지 않음

7

외부 연결을 참조할 때 해결되지 않은 문제가 있음

8

널 스크립트를 가진 배열을 참조함

9

현재 애플리케이션에 DLL함수가 없음

10

DLL함수에 지원되지 않는 인자형이 있음

12

GetItem형과 DataWindow의 열 타입이 맞지 않음

13

속성 참조를 해결하지 못함

14

외부 함수에서 DLL 라이브러리를 열 때 에러 발생

15

외부 함수를 호출할 때 에러 발생

16

최대 스트링 크기를 초과함

17

D/W 오브젝트에서 참조한 데이터윈도우가 존재하지 않음

18

함수가 변환값을 갖지 않음

19

변수에서 이름을 바꿀 수 없음

20

데이터베이스 명령어가 성공적으로 준비되지 않았음

21

파일 참조 실행시간 에러

22

오브젝트 타입이 틀림

23

오브젝트의 타입이름을 변수의 타입이름으로 표시할 수 없음

24

함수 호출이 정의와 맞지 않음

25

Double형이나 실수형의 표현이 오버플로우됨

26

필드 이름 지정을 지원하지 않음

27

정수의 제곱에 음수를 가질수 없음

28

VBX에러 : 이름

30

외부오브젝트 테이터 타입의 이름을 지원하지 않음

31

지원되지 않는 외부 오브젝트 데이터형의 이름

32

외부 함수 호출시 이름을 찾을 수 없음

33

외부 오브젝트 함수 호출시 인자형이 맞지 않음

34

외부 오브젝트 함수 호출시 인자의 개수가 맞지 않음

35

외부 오브젝트 속성의 호출시 에러

36

외부 오브젝트 속성을 접근하는데 찾는 이름이 없음

37

외부 오브젝트 속성을 접근하는데 타입이 맞지 않음

38

외부 오브젝트 속성을 접근하는데 하위스크립트의 수가 부정확함

39

외부 오브젝트 속성을 접근하는데 에러 발생

40

자료형이 맞지 않음

41

문법에 맞지 않는 이상한 자료형이 있음

42

DLL 함수를 호출하는데 지정한 인자형과 필요한 인자형이 다름


애플리케이션 종료 에러

Error.Number

Error.Text

50

애플리케이션 참조를 해결할 수 없다

51

동적 라이브러리를 로드 하는데 실패

52

조상 오브젝트의 이름이 빠짐

53

이름에서 조상 오브젝트의 이름이 빠짐

54

이름에서 조상 오브젝트의 이름과 이름이 충돌함

55

요청된 함수를 수행하던 중에 윈도우 닫음 발생

56

데이터베이스 인터페이스가 원격 프로시저 호출을 지원하지 않음

57

데이터베이스 인터페이스가 배열함수(함수이름)를 지원하지 않음

58

이름을 위한 BLOB변수가 비었음

59

최대 길이를 초과

[출처] [펌] 에러코드|작성자 구우

Posted by SB패밀리
데이타윈도우 내용을 엑셀로 내려받기
 
  데이타윈도우의 데이타를 엑셀로 내려받을때 컬럼명이 영문으로 나오는 것을 볼
수 있습니다.
 
  화면에서의 컬럼명처럼 엑셀파일에서도 한글컬럼명이 보여지기를 원할 때 다음과
같이 작성하시면 원하는 결과를 얻을 수 있습니다.
 
a_code : dw 의 컬럼명
dbname : dw 컬럼 property
a코드 : 바꾸고자 하는 한글컬럼명
dw_sheet.modify("a_code.dbname = '거래선코드'")  // 엑셀 title이 거래선코드
dw_sheet.modify("a_name.dbname = '거래선명'")
dw_sheet.modify("pers_name.dbname = '대표자명'")
dw_sheet.modify("phon_numb.dbname = '전화번호'")
dw_sheet.SaveAs("c:\mis\test.xls",excel!,true)
Posted by SB패밀리

윈도우즈를 자동으로 종료하고 싶을 때 즉, 예약 종료를 하려할 때

shutdown 명령어를 사용하면 된다.


시작메뉴를 클릭하면 위와 같은 창이 나타나고 여기에서 아래쪽에 있는 실행(R)... 을 클릭한다.
그러면 아래와 같은 명령어 실행 창이 나타난다.
여기에서는 웬만한 윈도우즈 명령어가 경로에 관계없이 다 실행된다.



예약종료를 위해 입력할 명령어는

shutdown -s -t 초


예: 30분 뒤 예약 종료
shutdown -s -t 1800


그럼 도움이 되기를 바라면서.
Posted by SB패밀리

MessageBox PowerScript Function

사용자가 정의한 title, text, icon, buttonMessageBoxDisplay한다.

MessageBox (title, text , icon, button , default )

Parameter Description

--------- ------------------------------------------------------

title Message boxtitle bar에 지정한 문자열이 나타난다.
text
사용자가 원하는 textMessage boxDisplay한다.
text
numeric 자료형, string, boolean 값이 가능하다
Icon icon의 값은 사용자가 원하면 Message box의 왼쪽에 display하려는 icon들을 가리키는 data type들을 열거한다.

* Information! (Default)
* Stopsign!
* Exclamation!
* Question!
* None!

button 사용자가 display하려는 CommandButtonmessagebox하단에 setting하고
command button을 가리키는 data type을 열거한다.
버튼들은 열거된 데이타 타입의 순서로 번호붙여진다..

(optional)

* OK! - (Default) OK button
* OKCancel! - OK and Cancel buttons
* YesNo! - Yes and No buttons
* YesNoCancel! - Yes, No, and Cancel buttons
* RetryCancel! - Retry and Cancel buttons
* AboutRetryIgnorel - About, Retry, and Ignore buttons

default button의 번호는 default button으로 사용할 수 있다.
(optional) default1이고, 만약 사용자가 지정한 번호가 displaybutton 번호 이상이면 , MessageBoxdefault로 이용한다.




반환값

Integer 성공했다면 지정한 번호 (1, 2, 3)을 return 하고,

실패인경우 -1를 return한다.

title 이나 text 의 값이 null 이면, MessageBox 는 보여지지않는다.

사용자가 지정하지 않으면 파워빌더는 사용자가 버튼을 클릭하거나 엔터를 누를 때 스크립트 실행을 계속한다. 이것은 MessageBox가 버튼을 하나 가지고 있을 때 적합하다. 버튼이 많으면 스크립트안에 리턴값을 체크하고, 적합한 조치를 취하는 스크립트에 코드를 포함시켜야한다.

현재의 application 을 계속하기 전에 사용자는 MessageBox에 응답해야한다. 그러나, 사용자는 MessageBox에 응답하지 않고 다른 aplication으로 바꿀수 있다.

MessageBox"Greeting","Hello User" default icon, default button을 보여준다.
MessageBox("Greeting", "Hello User")

다음 문장은 함수의 결과와 exclamation iconOKCancel 버튼을 포함한 Result라는 제목의 MessageBoxdisplay한다.

integer Net
long Distance = 3.457

Net =
MessageBox("Result", Abs(Distance), & Exclamation!, OKCancel!, 2)

IF Net = 1 THEN
  ... // process OK
ELSE
  ... // Process CANCEL.
END IF



출처 : http://cafe.daum.net/pbcraft/3NoU/40?docid=7Zna|3NoU|40|20011102000753&q=%C6%C4%BF%F6%BA%F4%B4%F5%20MessageBox%20%B8%AE%C5%CF&srchid=CCB7Zna|3NoU|40|20011102000753

Posted by SB패밀리

요즘 노트북 해상도가 16:10 이란 이야기를 이번에 옵토마 프로젝터(EW674) 구입할 때 처음 들어봐서 해상도가 어떤지 좀 찾아봤습니다.
(전 16:9가 지원되면 제일 좋은건줄 알았어요. ㅠ_ㅠ)

위키피아에 찾아보니까~
"일정한 물리적 길이 단위인 1인치(25.4mm) 안에 표현되는 화소(Pixel)의 수를 말한다. 단위로 dpi(dots per inch)가 쓰인다. 예를 들어, 72 dpi라고 하면 1인치 안에 72개의 점이 들어간다는 뜻이다" 라고 되어있네요.

텔레비전에는 아래의 해상도가 있다는군요.

  • SDTV: 480i (640×480)
  • EDTV: 480p (720×480)
  • HDTV: 720p (1280×720)
  • HDTV: 1080p (1920×1080)


    표준 해상도는 아래와 같습니다.
  • QVGA 0.077 메가픽셀 = 320×240
  • VGA 0.3 메가픽셀 = 640×480
  • SVGA 0.5 메가픽셀 = 800×600
  • XGA 0.8 메가픽셀 = 1024×768 (XVGA라고 함)
  • WXGA 1.0 메가픽셀 = 1280×800)
  • SXGA 1.3 메가픽셀 = 1280×1024
  • WXGA+ 1.3 메가픽셀 = 1440×900
  • SXGA+ 1.4 메가픽셀 = 1400×1050
  • WSXGA+1.7 메가픽셀 = 1680×1050
  • UXGA 1.9 메가픽셀 = 1600×1200
  • WUXGA 2.3 메가픽셀 = 1920×1200
  • QXGA 3.1 메가픽셀 = 2048×1536
  • WQXGA 4.1 메가픽셀 = 2560×1600
  • QSXGA 5.2 메가픽셀 = 2560×2048
  • WQSXGA 6.6 메가픽셀 = 3200×2048
  • QUXGA 7.7 메가픽셀 = 3200×2400
  • WQUXGA 9.2 메가픽셀 = 3840×2400
  • WUQSXGA 11.3 메가픽셀 = 4200×2690

    컴퓨터 해상도는 더욱 복잡하군요.
    Q는 쿼터(1/2), W는 와이드, Q는 Quadruple(4배), H는 Hexadecatuple(16배), U는 울트라, X는 확장 이라고 합니다.
  • MDA text = 720×350 (72:35) 
  • CGV 128k = 640×200 (16:5)
  • CGV 64k = 320×200 (16:10)
  • CGV 32k = 160×200 (4:5)
  • 허큘레스 250.5k = 720×348 (60:29)
  • EGA 224k = 640×350 (64:35)
  • MCGA 64k = 320×200 (16:10)
  • MCGA 307k = 640×480 (4:3)
  • 8514 786k = 1024×768 (4:3)
  • VGA 307k = 640×480 (4:3)
  • VGA 224k = 640×350 (64:35)
  • VGA 64k = 320×200 (16:10)
  • VGA text = 720×400 (9:5)
  • SVGA 480k = 800×600 (4:3)
  • XGA 786k = 1024×768 (4:3)
  • XGA 307k = 640×480 (4:3)
  • XGA+ 786k = 1152×864 (4:3)
  • XGA+ 307k = 640×480 (4:3)
  • QVGA 75k = 320×240 (4:3)
  • WQVGA 126k = 480×270 (16:9)
  • HQVGA 38k = 240×160 (3:2)
  • QQVGA 19k = 160×120 (4:3)
  • WXGA 922k = 1280×720 (16:9 or 16:10)
  • WXGA 1024k = 1280×800 (16:9 or 16:10)
  • WXGA 1296k = 1440×900 (16:9 or 16:10)
  • SXGA 1310k = 1280×1024 (5:4)
  • WXGA+ 1296k = 1440×900 (16:10)
  • WSXGA+ 1764k = 1680×1050 (16:10)
  • UXGA 1920k = 1600×1200 (4:3)
  • WUXGA 2304k = 1920×1200 (16:10)
  • 2K 2212k = 2048×1080 (1.9) - DLP 시네마 기술
  • QXGA 3146k = 2048×1536 (4:3)
  • WQXGA 4096k = 2560×1600 (16:10)
  • QSXGA 5243k = 2560×2048 (5:4)
  • WQSXGA 6554k = 3200×2048 (25:16)
  • QUXGA 7680k = 3200×2400 (4:3)
  • WQUXGA 9216k = 3840×2400 (16:10)
  • 4K 7029k = 4096×1716 (2.39) DLP 시네마 기술
  • HXGA 12583k = 4096×3072 (4:3)
  • WHXGA 16384k = 5120×3200 (16:10)
  • HSXGA 20972k = 5120×4096 (5:4)
  • WHSXGA 26214k = 6400×4096 (25:16)
  • HUXGA 30720k = 6400×4800 (4:3)
  • WHXGA 36864k = 7680×4800 (16:10)

    너무 복잡해서 표를 찾아왔습니다. 참고로 하세요~ ^^

  • 너무 어렵습니다. 16:9 밖에 없는 줄 알았는데 노트북은 16:10을 많이 쓰고 있다니.. 새로운 사실을 많이 알았습니다.
    고수 분들 팁좀 많이 주세요~

    출처 : http://www.todaysppc.com/mbzine/bbs/view.php?id=free&page=1&page_num=35&select_arrange=headnum&desc=&sn=off&ss=on&sc=on&keyword=&no=157676&category=1


     

    Posted by SB패밀리



    Q) 데이터윈도우의 컬럼이 a1 ~ a50까지 있습니다.
       여기서 데이터윈도우를 Retrieve()후 특정 Row의 특정컬럼의 값이 'A'일 경우
       이 'A'가 속한 컬럼명을 얻는 방법 좀 알려주세요..

    A) 해당 컬럼명을 얻어 오는 방법은 아래 스크립트를 참고하시면 됩니다.
        ======================================================
            String ls_column, ls_original_border, ls_temp

            IF NOT dwo.name = "datawindow" then //DWObject 바탕을 클릭!
            IF dwo.band = "header" THEN
                IF dwo.name = "" THEN
               Messagebox("Error", "칼럼 헤더 오브젝트에 칼럼명이 없습니다.")
               Return
              END IF
            ls_column = Left(dwo.name, Pos(dwo.name,"_t") -1 )
            MessageBox('선택한 컬럼의 이름', ls_column)
      END IF
    END IF
    ======================================================

    Q) 버전관리프로그램을 개발중입니다.

       pbd파일을 DB에 저장할려고 image 형식으로 정했습니다.
       pb에서 FileOpen시 streamMode이면 파일사이즈 크기가 32764로 한정되어 있는데
       칼럼형식을 무엇으로 정해야 DB에 저장할수 있는지 조언을 바랍니다. DB서버는 oracle 9i를

       사용하고 있습니다
       Oracle Client 를 9i 로 사용하다가 oracle client 8i 로 변경 하였습니다 (oracle client 9i 삭제 후

       8i로 재설치)
       9i로 설정해서 PB를 사용할때는 잘 되다가 8i로 바꿔서 설치하고 나서는 connection 이 안되네요
       connection 할때 나오는 오류메시지는 아래와 같습니다
       답변 부탁드립니다
      ▶▶ 6. 오류메시지 ◀◀
        Please connect as the PowerBuilder Catalog Owner. This is necessary for
        the initial connection to Oracle to GRANT privileges on the repository.

    A)  Database profile 에 DB 연결하는 곳을 보시면 System 이란 Tab 이 있습니다.
         해당 Tab 에 catalog owner 가 SYSTEM 이 Default 일 텐데..
         사용하고 계시는 Owner 정보가 다른것 같습니다. 이 부분을 수정하시기 바랍니다.


    Q) 파워빌더에서 최기는 오라클로 접속하고, retrieve된 데이라를 가지고,
        sql에 접속하여, 데이터를 이관하는 프로그램 입니다.
        파워빌더에서 실행했을때는 에러가 나질 않는데, 실행파일을 만들고, 실행하면,
        오라클은 연결되는데, sql에는 접속이 안됩니다.
         1. 오라클 접속정보(application에서 )
             SQLCA.DBMS = "O84 ORACLE 8.0.4"
             SQLCA.LogPass = "xxxx"
             SQLCA.ServerName = "xxxx"
             SQLCA.LogId = "xxxx"
             SQLCA.AutoCommit = False
             SQLCA.DBParm = ""
             CONNECT USING sqlca;

         2. sql접속정보( open-> retrieve 후 )
              Sqlca2 = create transaction

              SQLCA2.DBMS = "ODBC"
              SQLCA2.AutoCommit = False
              SQLCA2.DBParm = "ConnectString='DSN=xxxxx;UID=xxxxxx;PWD=xxxxx'"
            
      ▶▶ 6. 오류메시지 ◀◀

       Database에 연결할 수 없습니다. 9999DBMS ODBC is not supported in your current insatllation
      
    A)  먼저, 두개이상의 트렌젝션을 생성하여 사용할때는 혼동될 소지가 있기 때문에
         SQLCA를 사용하시는것 보단, trans_ora, trans_odbc 등의 특정이름으로 사용하시는

         것이 좋습니다.
        첨부파일로 PB7에서 필요한 DLL들을 정리해놓은 문서를 올려드립니다.
        참고하시기 바랍니다.
        문서에는
            PBODB70.DLL : 파워빌더 ODBC 인터페이스
            PBOR870.DLL : 오라클 8 DLL
            등의 내용이 정리되어 있습니다.
        또한, 현재 파우빌더 8 버전까지 기술지원이 종료된 상태(2006년 8월 31일)입니다.
        8이하 버전은 글 읽기 권한만 가지게 됩니다.

    Q) dw안에 check box 컬럼이 있습니다
      이 체크박스 컬럼을 클릭할때 마다 몇개의 Row의 채크박스컬럼이 선택되어졌는지 표시할려고

      하는대 방법을 알려주시기 바랍니다
      클릭이벤에 다음과 같이 사용하였습니다
         long i, j
         for i = 1 to this.rowcount() step 1
          if this.getitemstring(i,"bal") = "1" then
            j = j + 1
          END IF  
         next
         st_1.text = String(j) + "행이 선택되었습니다"

      
    A) Clicked() 이벤트에 스크립트를 작성하면 스크립트가 먼저 실행되어 버리고
         화면에 체크가 되어지기 때문에 처음 체크했을때의 값은 가져오지 못하고
         두번째 아이템을 체크할때부터 인식되어 지게 되는 현상이었습니다.
        해결방법은....
         작성하신 스크립트를 Post 방식으로 호출하면 해결하실수 있습니다.
         ue_clicked()를 하나 만들고 DW의 Clicked() 이벤트에
           Post Event ue_clicked()
         처럼 호출해주면 원하는 결과를 얻으실수 있습니다. Test 해보시기 바랍니다.

    Q) 데이타윈도우 삭제를 했는데도 pbl사이즈만 자꾸 늘어납니다.
       export, import 반복하다보니 현재 25메가가 되었는데요..
      실행시 메모리 부족하다는 영문 메시지와 함께 파빌이 다운되어버립니다.
      그리고 해당 소스 들어갈때도 100번에 95번은 에러가 나는데 에러가 나고
      다운이 되면 그 소스 다신 안 들어가집니다.
      하던 개발작업을 못하고 있습니다.
      
    A)  현재 사용하고 계신 것에 많은 제약사항이 있네요.
         첫째, XP 는 PowerBuilder 8.0.3 이상에서만 보장되어 집니다.
         둘째, 아시겠지만, 해당 PBL 의 사이즈가 엄청나게 크군요.. PowerBuilder 에서 보장하고,
         권장하는 하는 PBD 의 size 는 2 MB 입니다.
         일단, 25 MB 짜리를 갈려서 하시는게 좋을듯합니다. 보장이 안되니까.. 어떨땐 되고, 어떨 때는
        안되는 것입니다.
         export, import 가 자주 있다고 하셧는데 이러한 경우, 해당 PBL 에서 오른쪽 마우스를 누르시면
         Optimize 라는 것이 있습니다. 이것을 통해 최적화를 하십시요.
         size 가 조금 줄어 들 것입니다.
         하지만, 근본적인 해결책이 되지 않으며, Source 의 size 에 대한 것은 지키시고, OS 에

         따른 PB 버전도 생각하시기 바랍니다.

    Q) temp3 = 84.5
      gyesanhak = 20
      pyongjum = round(temp3 / gyesanhak, 2)
      위와같은 식이 있을때 당연히 pyongjum은 4.23이 나와야 합니다.  4.225에서 반올림하므로...
      하지만 pyongjum의 형식이 double이면 4.22가 됩니다.
      이것을 decimal형식으로 선언을 하면 4.23이 되구요...
      
    A) Double 과 Real 과 같은 부동소수점 데이터 타입은 원래 정확한 값을 기억하지 못합니다.

        4.225 값을 저장 시켜도 4.2249999999999999 와 같이 인식하기 때문에 round 하지
       못한거구요. 이 문제는 비단 파워빌더 뿐만 아니라, 다른 언어도 마찬가지입니다.
       이 문제에대한 자세한 내용은 아래를 참고하세요.
         http://www.sybase.com/detail?id=1012599

    Q) 3 tier 방법으로 개발하려고 합니다.

       그래서 서버단, 클라이언트단 나누어서 배포를 하고 작업하는데요...
       클라이언트에서 서버단의  컴포넌트에 있는 함수를 콜하면 자꾸 에러메시지가 떨어집니다.
       이런 메시지 는 어떻게 나는거고 해결은 어떻게 해야할지...
       오류메시지를 첨부파일로 올립니다..
       더불어서  제규어에서 패키지를 지웠는데도 프럭시 생성시 지워지지 않은것처럼 클라이언트 쪽에

       프럭시가  생성이 되네요.. 이유가 무엇인지.. 정말 모르겠습니다.

    A) 우선 클라이언트단 로직은 정상적으로 서버컴포넌트를 호출하는 것으로 보입니다.  

        서버컴포넌트 로직 수행 중 에러가 발생되면 질문하신 것 처럼     "CORBA_TRANSACTION_ROLLEDBACK" 에러가 Display 됩니다.

        때문에, 정확한 원인을 파악하기 위해서는 서버 Log 를 확인 해서 에러가 발생된 위치를 찾고,

        해당 컴포넌트의 로직을 확인해 봐야합니다.

        만약 서버단에 에러가 발생되더라도 이를 클라이언트에 Display 하고싶지 않다면,

        해당 컴포넌트 속성중 tx_outcome 값을 failed 로 설정 하시면 됩니다.
         com.sybase.jaguar.component.tx_outcome = failed

    Q)  아래와 같이 프로시져를 생성하고 데이타 윈도우를 만들었는데 데이타윈도우 내에서 조회는

      되는데 run 해서 실행해면 윈도우에서 rtn = dw_List.Retrieve(ls_Fund_Cd) retrieve를 하면
      pls-00306 호출시 인수의 갯수나 유형이 잘못되었습니다. 라는 오류 메세지가 나옵니다.
      데이타윈도우에 Argument는 한개이고요 프로시져는 아래와 같습니다.
      CREATE OR REPLACE procedure sr_ops_fd_0001r_01 ( p_fund_cd in varchar2,
      out_cur OUT pkg_cursor.cur_out) is BEGIN
       -----------------------------------------------------------------
         begin
       -----------------------------------------------------------------
      Open out_cur FOR
    SELECT A.FUND_CD       FUND_CD,
       A.FUND_NM   FUND_NM,
       A.TYPE_GB   TYPE_GB,
       A.FIR_SEOLJ_YMD   FIR_SEOLJ_YMD,
       A.FIR_GIJUNGA   FIR_GIJUNGA,
       A.WT_BOSUYUL   WT_BOSUYUL,
       A.PM_BOSUYUL   PM_BOSUYUL,
       A.ST_BOSUYUL   ST_BOSUYUL,
       A.SM_BOSUYUL        SM_BOSUYUL,
       A.WT_BOSUYUL + A.PM_BOSUYUL + A.ST_BOSUYUL + A.SM_BOSUYUL   tot_bosuyul,
       DECODE(A.MULTI_CLS_GB, '1', '일반', '2', '상위', '3', '하위', '')     MULTI_CLS_GB,
       decode(A.ILIM_GB,'01','일임','02','손익','03','MMF','4', '자문', '')   ILIM_GB,
       D.EMP_NM   EMP_NM,
       A.PRV_STK_LOWLMT_WGT   PRV_STK_LOWLMT_WGT,
       A.PRV_STK_HIGHLMT_WGT   PRV_STK_HIGHLMT_WGT,
       B.MAEMAE_NM   MAEMAE_NM,
       TO_CHAR(A.sanghw_ymd, 'YYYYMMDD')   sanghw_ymd
      FROM   COM_FM0_M A,
       COM_MM0_C B,
       COM_EF0_M C,
       COM_EM0_M D
    WHERE  A.SUTAK_CD = B.MAEMAE_CD
    AND    A.FUND_CD = C.FUND_CD
    AND    A.EMP_ID = C.EMP_ID
    AND    'Y' = C.RPRS_MGR_GB
    AND    A.EMP_ID = D.EMP_ID
    AND    A.FUND_CD LIKE p_fund_cd
    ORDER BY A.FUND_NM;
    -----------------------------------------------------------------
      end;
    -----------------------------------------------------------------
    --<<process_end>>
    END;
    ▶▶▶ 6. 오류메시지 ◀◀◀
      pls-00306 호출시 인수의 갯수나 유형이 잘못되었습니다.

    A) 파워빌더 개발환경에서 DB연결하는 사용자ID와 실제 실행환경에서 DB연결할 때 사용되는

        사용자ID가 서로 다른 것 같습니다. 실행환경에 사용된 사용자ID는 pkg_cursor 에 접근할 수

        없는 사용자로 생각됩니다. 파워빌더 DB Profile 의 사용자와 sqlca.UserID 사용자
        정보를 동일하게 맞춰주면 해결할 수 있을겁니다.

    Q)  5,0 라이센스 시디를 가지고 있습니다.
       근데 5,3 라이센스 CD 라던가 패치파일을 받고 싶은데 자료실에 없던데요..
       sybase 본사 인터넷에서 직접 받아야 되나요?
      
    A)  답변의 첨부파일을 받아서 설치하시면 됩니다.
         설치시 주의사항은 5.0이 설치되어 있어야 합니다. (아래글 참조)
         ===============================================
          Enclosed you will find updated EAServer software. You must install this
          upgrade over EAServer 5.0 or higher. If you have an earlier version, upgrade
          to EAServer 5.0 or higher before installing EAServer 5.3
         ===============================================
         압축을 풀면 Redeme 파일이 있습니다. 먼저 읽어보신후 패치하시기 바랍니다

    Q) Appeon을 도입하려고 준비중인데....
       테스트로 commandline을 이용해서 활용 예제를 만들어 보고 있습니다.
       http://xxx.xxx.xxx:9988/text/index.html?xxxxx
       이런식으로 웹페이지를 호출을 하는데요
       새로 열린 브라우저 타이틀에 호출 URL이 그대로 노출이 되는 것 같은데요(XP에서)
       해결방안이 없나요
       CommandLine(?xxxxx) 정보가 노출되면 안되거든요..숨길 수 있는 방법은?
       그리고 Appeon FAQ에 있는 내용중에 application이 종료되면 웹브라우저도 같이 종료되는

       예제가 있는데요
       CommandLine을 사용한 예제도 부탁을 드립니다.
         y = Long(ls_y) + 438

    A)  1. Anchor 태그를 이용한 호출( http://xxx.xxx.xxx:9988/text/index.html?xxxxx )로는

              직접적으로 URL이 보이는 것을 막을 수가 없습니다.
             중간에 자바스크립트로 Anchor 태그를 호출하는 것을 하나 만들어서 사용자가 클릭하였을

             때 자바스크립트를 호출하시고 자바스크립트에서 Anchor태그를 이용하여 호출하거나 또는

             Anchor 태그로 넘겨야 하는 값을 Session 정보에 저장한 다음 Appeon에서 Session에

            있는 값을 읽어 오는 형태로 작업을 하셔야 할 것입니다.
          2. 저희 팀 홈페이지에 있는 자바스크립트를 이용한 Blank 페이지 종료하는 예제를

             이용하시면 됩니다.

    Q)  윈도우 user events 추가시 항목의 event id별 활용설명서를  볼 수 있는지요    

    A)     일단.. xp 를 사용하시려면, PowerBuilder 8.0.3 이상의 버전이셔야 합니다.
         Event ID 는 pbm_ 로 시작하고 ( PowerBuilderMessage ) 입니다.
         이것은 WM_ 로 시작하는 Event id 값과 1:1 로 매핑되어집니다.
         따라서 pbm_xxx 에 있는 것을 WM_XXX 로 생각하셔서, MSDN 에서 찾아보시면 됩니다.

    Q)  오라클 8에서 잘 실행되던 프로그램인데 db를 9.2.0으로 올리고 나서 에러가 납니다
      ▶▶▶ 6. 오류메시지 ◀◀◀
      String ls_company, ls_date, ls_no, ls_name, ls_dept_name

      DECLARE isp_slip_no PROCEDURE FOR ac_user.ac_sp_slip_no
      (:ls_company, :gs_dept, :ls_date);

    ls_date = as_date
      ls_company = Upper( Left(gs_comp_unit, 1) )

      IF gf_isdate(ls_date) THEN
      execute isp_slip_no;

      FETCH isp_slip_no
      INTO :ls_no;
      CLOSE isp_slip_no;

      SELECT dept_name
      INTO :ls_dept_name
      FROM ac_dept
      WHERE dept_code = :gs_dept;

      dw_1.SetItem(al_row, "slip_no", ls_no)
      dw_1.SetItem(al_row, "slip_row", '001')
      dw_1.SetItem(al_row, "input_user_id", gs_user)
      // dw_1.SetItem(al_row, "pe_v_employee_name", gs_user_name)
      dw_1.SetItem(al_row, "ccom_slip_user_name", gs_user_name)
      dw_1.SetItem(al_row, "ac_dept_code", gs_dept)
      dw_1.SetItem(al_row, "ac_dept_dept_name", ls_dept_name)    

         새로 오라클9 에 생성한 사용자 권한이 오라클8 사용자 권한과 다른 것 같습니다.
         첨부하신 내용처럼, ac_user.ac_sp_slip_no 프로시저를 호출하지 못하기 때문에
         발생되는 에러입니다. 담당 DBA와 상의해보시기 바랍니다.

    A)  현재사용중인 파워빌더6.0을 9.0으로 마이그레이션 하였고 데이타베이스도 정상적으로
       CONNECT하였습니다.
       그런데 file -> new ->에서 datawindow object를 만들려고하면 첨부된 내용처럼 에러가 생깁니다.
       다시 삭제하고 재설치해도 마찬가지입니다.
       기존에 6.0에서사용했던 datawindow object를 copy하여 9.0에서 open하여도 마찬가지입니다.
      도무지 이유를 모르겠습니다.  
      

    A)   이런 경우는 DLL이 꾜여서 발생하는 경우가 대부분입니다.
         먼저 DLL들이 정확하게 올라오는지 확인해보시기 바랍니다.
         DLL이 올라오는 것을 확인하는 방법은, 저희 핼프시스템에서 많이 다룬 내용입니다.
         검색에서 "제목+내용"으로 winmsd 를 검색하시면,많은 내용을 볼수 있습니다.
         -------------------------------------------------------------------------------
         PowerBuilder를 실행시키고, 로드된 모듈을 체크해 보시기 바랍니다. (각 버전 밑 위치 확인)
       * 체크 방법
        시작-> 실행 -> winmsd -> 소프트웨어 환경 -> 로드된 모듈
        그러면 로드된 소프트웨어에 가보시면, 파워빌더 관련 dll 들이 있는데. 여기 나오는 모든 버전이
        일치해야 하며 경로 또한 동일해야 합니다
        (program filessybaseShearedPowerBuilder  여기가 default 입니다)
        아울러, 파워빌더를 제거 하실때, 레지스트리 정리 까지 하시는 것을 권장합니다.


    Q)   버전관리프로그램을 개발중입니다.
       pbd파일을 DB에 저장할려고 image 형식으로 정했습니다.
       pb에서 FileOpen시 streamMode이면 파일사이즈 크기가 32764로 한정되어 있는데
       칼럼형식을 무엇으로 정해야 DB에 저장할수 있는지 조언을 바랍니다.

    A)  파일의 사이즈가 32764 로 한정되어 있는 것이 아니라 FileRead 함수가 한번에 읽을 수 있는
         크기가 32765 로 제한되어 있는 것 입니다. 32765 가 넘는 크기에 대해서는 루프를 돌면서
        읽어서 처리해야 합니다. 아래의 코드(파워빌더 헬프에 있는 예제)를 보시면 쉽게 이해하실 수
        있을 것입니다.
        컬럼형식은 image 나 기타 binary data 를 처리할 수 있는 형식으로 하시면 됩니다.
        컬럼형식에 대한 보다 자세한 내용은 데이터베이스 도움말을 참조하시기 바랍니다.

         integer li_FileNum, loops, i
         long flen, bytes_read, new_pos
         blob b, tot_b

         // Get the file length, and open the file
         flen = FileLength(sle_filename.Text)
         li_FileNum = FileOpen(sle_filename.Text, &
            StreamMode!, Read!, LockRead!)

         // Determine how many times to call FileRead
         IF flen > 32765 THEN
            IF Mod(flen, 32765) = 0 THEN
                loops = flen/32765
            ELSE
                loops = (flen/32765) + 1
            END IF
         ELSE
            loops = 1
         END IF

         // Read the file
         new_pos = 1

         FOR i = 1 to loops
            bytes_read = FileRead(li_FileNum, b)
            tot_b = tot_b + b
         NEXT

       FileClose(li_FileNum)
    Posted by SB패밀리
    와이브로와 와이파이의 큰 차이점은 규모와 범위에 있다고 하겠다.
     와이브로(Wibro)는 기지국 단위로 커버리지가 가능한 범위에서 사용하는 무선 인터넷이고
     와이파이(WiFi)는 무선공유기(AP)가 커버리지 가능한 범위에서 사용하는 무선 인터넷이다.
    현재 국내에서 와이브로는 KT가 주도하고 있다.
    와이브로는 도심의 야외, 빌딩 등 넓은 범위에서 무선인터넷을 사용하게 되고
    와이파이는 집이나 카페 등의 좁은 범위에서 무선인터넷을 사용한다고 생각하면 된다.


    ◇와이파이(Wi-Fi)
    = Wireless Fidelity의 약어로 무선접속장치(AP)가 설치된 곳을 중심으로 일정거리 이내에서 PDA나 노트북컴퓨터를 통해 초고속 인터넷을 이용할 수 있는 무선랜을 지칭한다.

    전송속도가 4~11Mbps로 대용량의 멀티미디어 정보도 주고받을 수 있으며 장시간사용해도 사용료가 저렴하다. 그러나 와이파이는 기지국당 커버리지가 30~200m 정도 로 매우 협소하다는 단점이 있기 때문에 이동성은 크게 떨어진다.

    KT의 네스팟이나 스페인에서 시작된 `폰(PONE)`서비스 등이 와이파이 기술을 기초로 하고 있으며 미국의 샌프란시스코를 비롯 주요 도시들은 시 지역 전체에 와이파이존을 구축하고 있다. 앞으로 미국이나 유럽 주요 도시에 깔린 와이파이망과 와이브로망이 결합되면 엄청난 파급효과를 몰고 올 것으로 예상된다.


    ◇와이맥스(Wimax) = 저렴한 값에 초고속 인터넷에 가까운 속도의 고정형 무선 인터넷을 가능하게 하기 위한 MAN(Metropolitan Area Network) 서비스 규격이다.

    전송속도는 빠르지만 기지국당 커버리지가 30~200m 정도로 매우 협소한 와이파이의 단점을 극복하기 위해 좀더 넓은 커버리지를 가진 무선통신기술로, 개활지에서 는 45km까지, 도심지에서도 1~2km까지 커버리지를 확대할 수 있다.

    그러나 와이맥스는 낙후 지역이나 중소형 사업장 혹은 대형 건물 등에서 사용하기 위해 고안되었기 때문에 기본적으로 고정형 서비스를 염두에 둔 규격으로 와이브로에 비해 이동성은 현저히 떨어진다.

    인텔 등을 중심으로 상용화를 위한 막바지 개발이 진행중인 와이맥스는 미국의 시장 조사기관인 프로스트&설리반 조사결과 2010년까지 전세계적으로 54억 달러 규모의 시장을 형성하고 올 해를 기점으로 연간 139%의 성장률을 보일 것으로 예측되고 있다.

    ◇와이브로(모바일 와이맥스) = 휴대전화처럼 언제 어디서나 이동하면서 초고속인터넷을 이용할 수 있는 서비스로 한국이 국제표준화를 주도하고 있는 차세대 이동통신 서비스이다.

    와이브로는 이동성, 속도, 가격면에서 앞선 기술로 평가받고 있다. 시속 100km의 고속으로 이동 중에도 인터넷을 이용할 수 있으며, 콘텐츠가 제한된 휴대폰 무선인터넷과 달리 유선인터넷과 똑같이 웹서핑을 사용할 수 있다. 한국에서 와이브로라는 이름으로 불리며, 해외에서는 모바일 와이맥스라고 불린다.

    삼성전자를 중심으로 해외시장 개척에 적극 나서고 있는 와이브로는 이번에 미국 스프린트넥스텔에 진출한 것을 계기로 차세대 이동통신 표준으로 등장할 가능성이 높아졌으며 CDMA(코드분할다중접속)에 이어 한국의 새로운 먹거리를 창출해낼 수있는 기술로 기대되고 있다.
    Posted by SB패밀리
    2010.02.02
    출처: ZDNetKorea

    빌게이츠는 리눅스 기반 서버로 자기 웹사이트를 서비스하고 있다.

     '더 게이츠 노츠'는 빌 게이츠 전 마이크로소프트(MS) 회장이 은퇴한 뒤 개설한 개인 홈페이지이자 블로그다. 사이트 상단에는 얼마 전 그가 친구등록수 25만명을 돌파한 트위터 계정도 보여주고 있다. 
     

    서버 운영체제(OS)로 리눅스를 사용하는 것은 드문 일이 아니다. 물론 그가 마이크로소프트(MS) 창립자라는 사실 때문에 아이러니할 수도 있다. 서버OS 시장에서 MS는 리눅스 진영에 큰 경쟁자였으니. 테크크런치는 지난달 30일(현지시간) "이건 회의장에서 맥북을 사용하는 게이츠 전 MS 회장이나 스티브 발머 현 MS 최고경영자(CEO)를 보는 것과 맞먹는 사건일 수도 있다"고 호들갑을 떨었다.

    이날 테크크런치는 "빌게이츠가 새로 만든 웹사이트는 정말 리눅스에서 돌아가는지" 확인하려고 영국 SW 및 인터넷 조사업체 넷크래프트 사이트에서 게이츠노츠 사이트에 관한 정보를 찾았다. 넷크래프트는 인터넷 사이트들로부터 공인 IP주소, 사용중인 서버 운영체제(OS)와 그 안에 돌아가는 웹서버 등 시스템 정보를 보여준다. 
     

    사용자가 요청한 웹사이트 정보를 상품이라고 하면 서버OS는 매장이다. 빌게이츠 사이트 OS 정보는 즉 사용자가 요청한 데이터를 어떤 서버에서 받아오는지 보여준다. 또 웹서버 정보는 원산지에 비유할 수 있다. 사용자가 요청한 데이터를 어디서 만들었는지 보여준다. 넷크래프트 자료에 따르면, 게이츠노츠 사이트(http://www.thegatesnotes.com)는 리눅스 OS를 사용하고 웹서버 시스템이 'MS 인터넷 인포메이션 서비스(IIS) 7.0'인 서버에서 운영된다. 다시말해 리눅스 OS 서버에서 IIS 7.0 웹서버에서 만든 데이터를 받아왔다는 얘기다.

    그런데 리눅스 환경에서는 IIS를 못돌린다. IIS는 MS 윈도 OS에서만 돌아가는 웹서버다.

    넷크래프트 자료가 틀린건 아니다.

     테크크런치에 따르면 빌게이츠는 웹사이트 운영을 위해 '캐시' 서버를 쓴다. 캐시서버란 원본 서버까지 가지 않고 자료를 찾아갈 수 있도록 미리 복제(캐시) 데이터를 보관해둔 서버를 가리킨다.

     캐시서버를 여러 곳에 두면 사용자들이 자료를 요청한 신호들이 멀리 돌아다니지 않고, 여러 캐시서버에 나뉘어 찾아가게 된다. 도시 사람들이 지역 특산품을 원산지까지 찾아가지 않고 각 지역 매장에서 구입하듯이 네트워크 트래픽과 서버 부담이 분산된다. 많은 부하를 감당하기 위해 서버와 네트워크 장비에 투자할 부담이 줄어드니 사이트 운영측은 관리비용을 줄일 수 있다. 캐시서버 사업자에게 절약한 관리비용보다 적은 대가를 주면 남는 장사다.

     아카마이 테크놀로지라는 회사가 이런 사업모델을 갖고있다. 캐시서버를 대규모로 깔아놓고 사람이 많이 몰리는 인터넷사이트를 운영하는 전세계 기업들을 고객으로 삼는다. 기업들이 인프라를 투자하고 관리하는 비용보다 아카마이에게 돈을 주고 캐시서버를 빌리는게 더 싸다.

     아카마이가 원본 웹사이트와 방문자 사이에서 이를 중계해 준다. 즉 인터넷에서 게이츠노츠 사이트를 방문한 사람들은 먼저 아카마이 서버에 찾아온 것이다. 아카마이 서버는 미리 비축해놓은 자료를 보여준다. 아카마이에서 직접 하는 일이기 때문에 아카마이 리눅스 OS가 서버 운영체제로 나오는 것이다. 한편 아카마이가 비축한 데이터에 원본 웹서버 정보가 들어있다. 웹서버 정보를 요청하면 원본 자료를 가져왔던 게이츠노츠 사이트에 대한 웹서버를 보여준다. 게이츠노츠 사이트에 실제 운영중인 서버는 IIS로 웹서비스를 운영하기 때문이다.

     전에 비슷한 일이 있었다. 지난 2003년 8월쯤 MS가 리눅스 서버를 사용해 MS 웹사이트(microsoft.com)를 운영한다고 알려졌다. 당시 MS는 자사 웹사이트에 아카마이 캐시서버를 썼다. 지금은 서버를 확충해 자체 서버를 운영하고 있다. 지금 넷크래프트에서 MS 웹사이트 정보를 열어보면 '윈도 서버 2003' OS와 'IIS 6.0' 웹서버를 사용한다고 나온다.

     MS가 IIS를 윈도OS에서만 쓸 수 있게 해놓으니 이런 소동도 있었던 것이다. 게이츠 전 MS 회장이 나중에 자기 개인 사이트를 '윈도 서버 2008 R2'로 바꿀지는 알 수 없지만.

     알고보면 놀랄 일도 아니다. 수타면 전문가도 인스턴트 짜장라면 끓여먹지 말란 법은 없으니까.

    트랙백 주소 : http://www.zdnet.co.kr/Reply/trackback.aspx?key=20100202142318


    자세한 내용은 출처 : http://www.zdnet.co.kr/Contents/2010/02/02/zdnet20100202142318.htm 에서 확인하면됩니다.

    Posted by SB패밀리

    -- 시작전 serveroutput을 on으로 바꾸어 output메시지를 볼수있도록 한다.

    SET serveroutput on;

    DECLARE
      psr_return NUMBER;
      psr_msg VARCHAR2(2000);
    BEGIN

    -- 파라미터 변수에 값 바인딩
      psr_return := 0000;
      psr_msg       := 'TEST';

     -- 프로시저 실행
      SP_APPROVELINE_SAVE ( 0, 'TEST', '20090925063000', '0001', psr_return, psr_msg);

      DBMS_OUTPUT.PUT_LINE('psr_return : '|| psr_return);
      DBMS_OUTPUT.PUT_LINE('psr_msg : '|| psr_msg);
    END;

    -- DB사용 툴에따라 빼줘야 작동 될 수 도있다.

    Posted by SB패밀리

    SQL EDITOR상에서의 편리한 단축키

    ESC: 열린 윈도우 닫기
    F1: 모든 단축키를 보여준다.
    F2: FULL SCREEN
    F4: Table, View, Proc, Funct, Package를 DESC(테이블명에 커서를 둔 상태에서 해야함)
    F6: SQL Editor와 결과창간의 전환
    F7: 화면을 모두 CLEAR
    F8: 실행했던 SQL들의 HISTORY
    F9: 모든 쿼리 실행(Ctrl+Enter는 현재 쿼리만 실행)
    Ctrl+F9: 실제 쿼리를 실행하지 않고 validate함
    Ctrl+. : table Completion (매칭되는 테이블목록 출력)
    Ctrl+T : Columns Dropdown (해당테이블의 컬럼목록 표시)
    Alt+Up : History Up (리눅스 bash의 UP키와 같다.)
    Alt+Down: History Down (리눅스 bash의 DOWN키와 같다.)
    Ctrl+Tab: MDI Child윈도간 전환

    그냥 'desc 테이블명' 을 치면, 팝업윈도로 해당 테이블의 컬럼목록윈도가 표시된다.
    이때, 해당 컬럼을 double-click하면 SQL Editor로 반영된다.

    "테이블명."까지 입력하고 좀 있으면, 해당 테이블의 컬럼목록이 표시된다.
    마치 프로그래밍툴에서 클래스내 멤버들의 목록을 표시하듯이..
    Ctrl+T는 출력된 목록을 취소했을 경우, 다시 불러낼때 쓰인다.

    test, member 2개의 테이블이 있다고 하자.
    select * from t까지 입력하고 Ctrl+.를 치면 select * from test로 테이블명을 완성시켜준다.
    system계정에서는 안되더군.. 일반계정만 가능했다.


    SQL문을 실행시

    Ctrl+Enter
    현재 커서의 SQL문 실행
    여러개의 SQL문이 있을때, SQL문들을 개행문자로 분리해주면 된다.
    해당 커서에서 개행문자가 있는 곳까지만 하나의 SQL문으로 간주한다.

    F9
    SQL Editor의 SQL문 실행하여 Grid에 출력.
    여러 SQL문들을 개행문자로 구분하지 않는다는 것을 제외하면, 위의 Ctrl+Enter와 동일하다.
    에디터내의 모든 SQL문은 하나로 취급하므로, 여러 개의 SQL문이 있으면 실행할 SQL문만 Selection하여 실행(F9)해준다.

    F5
    SQL Editor내의 모든 SQL문 실행. 여러개의 SQL문들을 모두 실행하여 SQL*PLUS와 같이 출력해준다.
    이것은 출력이 Grid로 표시되지 않고 Editor윈도에 표시되므로, SQL*PLUS의 출력과 같이,
    다른 편집기로의 복사/붙여넣기 할때 사용하면 유용하다.
    Posted by SB패밀리

    오라클 에서 사용되는 sql문 정리


    == SQL*Plus 기본 활용 방법 ==


    1. SQL 명령어는 다음과 같이 기술한다.
    l        SQL 명령어는 한 줄 혹은 여러 줄에 기술한다.

    l        일반적으로 절들은 수정하기 쉽게 다른 줄에 기술한다.

    l        TAB 을 사용할 수 있다.

    l        SQL 명령어 단어는 생략하거나 분리할 수 없다.

    l        SQL 명령어는 대소문자를 구분하지 않는다.

    l        SQL 명령어는 ; 으로 종료한다.

    l        SQL 명령어는 SQL BUFFER 에 저장된다.

    l        SQL BUFFER 에 저장된 SQL 명령어는 / 혹은 RUN 으로 실행할 수 있다.


    2. SQL*PLUS 명령어는 다음과 같이 기술한다.

    l        SQL*PLUS 명령어는 기본적으로 한 줄에 기술한다.

    l        SQL*PLUS 명령어는 대소문자를 구별하지 않는다.

    l        SQL*PLUS 명령어는 SQL BUFFER 에 저장되지 않는다.


    3. SQL*PLUS 명령어

    l        DESCRIBE table명 : TABLE 의 구조를 보여준다.

    l        SAVE file명 : SQL BUFFER 를 file 로 저장한다.

    l        START file명 : file 을 수행한다.

    l        @ file명 : file 을 수행한다.

    l        EDIT file명 : EDITOR 를 사용하여 file 을 편집한다.

    l        SPOOL file명 : QUERY 결과를 file 에 저장한다.

    l        SPOOL OFF : SPOOL FILE 을 닫는다.

    l        HOST : SQL*PLUS 를 떠나지 않고 HOST 상태로 간다.

    l        HELP 명령어 : SQL, SQL*PLUS, PL/SQL 에 대한 HELP 를 보내준다.

    l        EXIT : SQL*PLUS 를 종료한다.

     

     

    1. 데이터의 검색


    1-1. 전체 데이타의 검색

    가장 간단한 SELECT 문장의 형식은 다음과 같다.

    SELECT 절에는 검색하고 싶은 COLUMN 명들을 기술한다.

    FROM 절에는 SELECT 절에서 기술된 COLUMN 명들이 포함된 TABLE 명을 기술한다.

    TABLE 의 모든 ROW 와 모든 COLUMN 을 검색한다.

    u         SELECT * - FROM table명 ;


    [예제1-1] S_DEPT TABLE 로부터 모든 ROW 와 COLUMN 을 검색하시오.

    SELECT * FROM S_DEPT ;

     

    1-2. 특정 column의 검색

    SELECT 절에서 검색하고자 하는 COLUMN 명을 COMMA 를 사용하여 나열한다.

    COLUMN 순서는 검색하고 싶은 순서대로 나열한다.

    COLUMN HEADING 은 COLUMN 명이 대문자로 출력된다.

    u         SELECT column명, column명, column명,.. - FROM table명 ;


    [예제1-2] S_EMP TABLE 로부터 ID, LAST_NAME, START_DATE 를 검색하시오.

    SELECT ID, LAST_NAME, START_DATE FROM S_EMP ;

     

    1-3. 산술식을 사용한 검색

    산술 연산자를 사용하여 검색되는 데이타 값을 변경할 수 있으며 산술 연산식은 COLUMN 명, 상수 값, 산술 연산자로 구성됨.

    u         SELECT 산술연산식 - FROM table명 ;


    [예제1-3] S_EMP TABLE 로부터 ID, LAST_NAME, 연봉을 검색하시오.

    (연봉은 SALARY * 12 로 계산한다. (+,-,*,/,())

    SELECT ID, LAST_NAME, SALARY * 12 FROM S_EMP ;

     

    1-4. Column alias ( AS )

    기본적으로 COLUMN HEADING 은 COLUMN 명이 대문자로 출력된다. 그러나 많은 경우 COLUMN 명이 이해하기 어렵거나 무의미하기 때문에 COLUMN ALIAS 를 사용하여 COLUMN HEADING 을 변경할 수 있다.

    ANSI SQL 92 와 호환을 위해 ALIAS 앞에 AS 를 붙일 수 있다.

    ALIAS 에 공백이나 특수문자가 포함되거나 대소문자를 구별하고 싶으면 " " 로 막아준다.

    COLUMN ALIAS 를 사용하여 COLUMN HEADING 을 변경할 수 있다.

    u         SELECT column명 alias, column명 "alias", column명 as alias - FROM table명 ;


    [예제1-4] S_EMP TABLE 에서 LAST_NAME, (SALARY + 100) * 12, DEPT_ID 를 검색하시오. (단, COLUMN ALIAS 는 Employee, ANNUAL_SALARY, DEPARTMENT NO 로 정의하시오.)

    SELECT LAST_NAME "Employee", (SALARY + 100) * 12 AS ANNUAL_SALARY,

    DEPT_ID "DEPARTMENT NO"

    FROM S_EMP ;

     

    1-5. Column의 결합 ( || )

    COLUMN 과 다른 COLUMN, 산술연산식, 상수 값과 결합하여 하나의 COLUMN 으로 결합할 수 있다.

    u         SELECT column명|| column명 - FROM table명;


    [예제1-5] S_EMP TABLE 에서 FIRST_NAME 과 LAST_NAME 을 결합하여 ALIAS EMPLOYEE 로 검색하시오.

    SELECT FIRST_NAME || LAST_NAME EMPLOYEE  FROM S_EMP ;

     

    1-6. Null값 처리 ( NVL )

    특정 COLUMN 에 값이 입력되어 있지 않을 때, 그 값이 NULL 이며, NULL 값이 산술 연산식에 포함되면 그 결과도 NULL 이다.

    NULL 값은 0 이나 공백과 같지 않다. 그러므로 NVL FUNCTION 을 사용하여 NULL 값을 다른 값으로 대체하여야 한다.

    NULL 값을 다른 값으로 대체.

    u         NVL (number_column, 9),

    u         NVL (date_column, '01-JAN-95'),

    u         NVL (character_column, 'ABCDE')


    [예제1-6] S_EMP TABLE 에서 LAST_NAME, COMMISSION 값을 검색하시오.

    (COMMISSION 은 SALARY * COMMISSION_PCT /100 으로 계산하시오.)

    SELECT LAST_NAME, SALARY * NVL(COMMISSION_PCT,0) /100 COMMISSION

    FROM S_EMP ;

     

    1-7. 중복 row의 제거 ( DISTINCT )

    SELECT 결과 값에 중복된 값이 있을 때 중복을 피하고 UNIQUE 하게 검색한다. 중복된 ROW 를 제거한다.

    u        SELECT DISTINCT column명, column명 - FROM table명;


    [예제1-7] S_DEPT TABLE 에서 NAME 이 중복되지 않게 검색하시오.

    SELECT DISTINCT NAME  FROM S_DEPT ;

     

    1-8. 데이타의 정렬 ( ORDER BY )

    SELECT 되는 ROW 의 순서는 알 수 없다. 그러므로 ROW 를 SORT 하고 싶으면 ORDER BY 절을 사용하여야 한다.

    DATA 의 DEFAULT SORT 순서는 ASCENDING 이며 다음과 같다.

    l        숫자 : 1 에서 999 순으로 SORT 한다. ? 날짜 : 01-JAN-92 에서 01-JAN-95 순으로 SORT 한다.

    l        문자 : A 에서 Z 순서로 SORT 한다. ? NULL : ASC 순에서는 뒤에, DESC 순에서는 앞에 나온다.

    역순으로 SORT 하고 싶으면 COLUMN 명 뒤에 DESC 를 붙인다.

    COLUMN 명 대신에 ALIAS 혹은 SELECT 한 COLUMN 의 순서로 지정할 수도 있다.

    u        SELECT expr - FROM table명 - ORDER BY {column명, expr} [ASC|DESC] ;


    [예제1-8] S_EMP TABLE 에서 LAST_NAME, DEPT_ID, START_DATE 를 LAST_NAME 순으로 검색하시오.

    SELECT LAST_NAME, DEPT_ID, START_DATE

    FROM S_EMP ORDER BY LAST_NAME ;

     

     


    1-9. 특정 row의 검색 ( WHERE )

    WHERE 절에서 조건식을 기술하여 조건을 만족하는 ROW 만 검색할 수 있다.

    조건식은 COLUMN 명, COMPARISON OPERATOR, VALUE 로 구성되어 있다.

    문자 값은 ' ' 으로 묶어주고 값의 대소문자를 구별하여 적어준다. 날짜 값은 ' ' 으로 묶어주고 지정된 날짜 형태로 적어준다. '01-MAR-97', 숫자값은 값만 적어주며 특정 ROW 만 검색한다.

    u        SELECT expr - FROM table명 - WHERE expr operator value


    [예제1-9] S_EMP TABLE 에서 LAST_NAME 이 Magee 인 사원의 FIRST_NAME, LAST_NAME, TITLE 을 검색하시오. (=,>,<,>=,<=,<>)

    SELECT FIRST_NAME, LAST_NAME, TITLE

    FROM S_EMP WHERE LAST_NAME = 'Magee' ;

     

    1-10. 범위 지정검색 ( Between...and )

    BETWEEN OPERATOR 를 사용하여 범위를 지정할 수 있다. 범위를 지정할 때는 작은 값을 먼저 큰 값을 나중에 지정한다.

    두 범위의 한계 값을 포함한다.

    u        BETWEEN...AND... - NOT BETWEEN...AND...


    [예제1-10] S_EMP TABLE 에서 START_DATE 가 09-MAY-91 에서 17-JUN-91 사이에 입사한 사원의 FIRST_NAME, LAST_NAME, START_DATE 를 검색하시오.


    SELECT FIRST_NAME, LAST_NAME, START_DATE

    FROM S_EMP WHERE START_DATE BETWEEN '09-MAY-91' AND '17-JUN-91' ;

     

    1-11. 나열된 값중 선택 ( In[list] )

    IN OPERATOR 를 사용하여 나열된 값들 중에서 값을 검사한다.

    u        IN(LIST), NOT IN(LIST)


    [예제1-11] S_EMP TABLE에서 DEPT_ID 가 10, 31, 41, 50 인 사원의 FIRST_NAME, LAST_NAME, DEPT_ID 를 검색하시오.

    SELECT FIRST_NAME, LAST_NAME, DEPT_ID

    FROM S_EMP WHERE DEPT_ID IN (10, 31, 41, 50) ;

     

    1-12. 임의의 값찾기 ( LIKE )

    찾고자 하는 값을 정확히 모를 때, LIKE OPERATOR 를 사용하여 문자형태가 같은 ROW 를 검색한다.

    WILDCARD 를 사용하여 문자의 형태를 지정한다. (% : 여러 문자, _ : 한문자 )

    u        LIKE '형태', NOT LIKE '형태'


    [예제1-12] S_EMP TABLE에서 LAST_NAME 이 M 으로 시작하는 사원의 LAST_NAME 을 검색하시오.

    SELECT LAST_NAME FROM S_EMP WHERE LAST_NAME LIKE 'M%' ;

    SELECT LAST_NAME FROM S_EMP WHERE LAST_NAME LIKE '__M____' ;

     

    1-13. 정의되지 않은값 찾기( is null )

    IS NULL OPERATOR을 사용하여 값이 NULL 인 것을 찾을 수 있다.

    NULL 값은 값이 정의되지 않은 것을 의미하기 때문에 = OPERATOR를 사용하여 어떤 값과 비교할 수 없기 때문에 사용한다.

    u        IS NULL, IS NOT NULL


    [예제1-13] S_EMP TABLE에서 COMMISSION_PCT가 NULL인 사원의 LAST_NAME, SALARY, COMMISSION_PCT를 검색하시오.

    SELECT last_name, salary,commission_pct,last_name, salary

    FROM s_emp WHERE commission_pct is null;

     

    1-14. 조건식의 결합 ( AND | OR )

    조건식을 기술할 때 AND 와 OR 를 사용하여 여러가지 조건을 결합할 수 있다.

    AND 와 OR 가 같이 사용됐을 때 AND 가 먼저 수행되고 OR 가 나중에 수행된다.

    그러므로 우선순위를 바꾸고자 하면 ( ) 를 사용한다.

    u        WHERE 조건식 AND | OR 조건식


    [예제1-14] S_EMP TABLE에서 DEPT_ID가 41이고 TITLE이 Stock Clerk인 사원의 LAST_NAME, SALARY, DEPT_ID, TITLE을 검색하시오.

    SELECT LAST_NAME, SALARY, DEPT_ID, TITLE

    FROM S_EMP WHERE DEPT_ID = 41 AND TITLE = 'Stock Clerk' ;

     


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

    2. Single Row Functions


    2-1. 소문자로 변환

    모든 문자를 소문자로 변환시킨다.

    u        LOWER(COLUMN명)


    [예제2-1] S_EMP TABLE 에서 LAST_NAME 이 Smith 인 사원의 FIRST_NAME, LAST_NAME 을 소문자로 출력시키시오.

    SELECT LOWER(FIRST_NAME), LOWER(LAST_NAME)

    FROM S_EMP WHERE LOWER(LAST_NAME) = 'smith' ;

     

    2-2. 대문자로 변환

    모든 문자를 대문자로 변환시킨다.

    u        UPPER(COLUMN명)


    [예제2-2] S_EMP TABLE 에서 LAST_NAME 이 Smith 인 사원의 TITLE 을 대문자로 출력하시오.

    SELECT UPPER(TITLE) FROM S_EMP WHERE UPPER(LAST_NAME) = 'SMITH';

     

    2-3. 첫글자만 대문자로 변환

    단어의 첫글자는 대문자로, 나머지는 소문자로 변환시킨다.

    u        INITCAP(COLUMN명)


    [예제2-3] S_EMP TABLE 에서 TITLE 을 단어의 첫글자만 대문자로 출력시키시오.

    SELECT INITCAP(TITLE) FROM S_EMP ;

     

    2-4. 문자의 부분을 자름

    문자를 시작위치(M)에서 자리수(N) 만큼 잘라준다. 자리수(N)이 생략되면 시작위치(M)에서 끝까지 잘라준다.

    u        SUBSTR(COLUMN명, M, N)


    [예제2-4] S_PRODUCT TABLE 에서 NAME COLUMN 의 앞에서 부터 3글자가 Ace 인 제품의 NAME 을 출력하시오.

    SELECT NAME FROM S_PRODUCT WHERE SUBSTR(NAME, 1, 3) = 'Ace' ;

     

    2-5. 문자의 길이를 계산

    문자의 길이를 RETURN 한다.

    u        LENGTH(COLUMN명)


    [예제2-5] S_PRODUCT TABLE 에서 NAME, NAME 의 길이를 출력하시오.

    SELECT NAME, LENGTH(NAME) FROM S_PRODUCT;

     

    2-6. 숫자의 반올림

    지정된 자리수(M) 밑에서 반올림한다.

    COLUMN 값이 1 2 3 4. 5 6 7 일 때 자리수(M)는 다음과 같다. 

    M : -3-2-1 0 1 2 3

    u        ROUND(COLUMN명, M)


    [예제2-6] S_EMP TABLE 에서 LAST_NAME, SALARY/22 의 값을 소수 2째 자리까지 나타내고 소수 3째 자리에서 반올림하시오.

    SELECT LAST_NAME, ROUND(SALARY/22, 2) FROM S_EMP ;

     

    2-7 숫자의 절사

    지정된 자리수(M) 까지 나타내고 그 밑은 잘라버린다.

    COLUMN 값이 1 2 3 4. 5 6 7 일 때 자리수(M)은 다음과 같다.

           M : -3-2-1 0 1 2 3 절사 값은 RETURN 한다.

    u        TRUNC(COLUMN명, M)


    [예제2-7] S_EMP TABLE 에서 LAST_NAME, SALARY / 22 의 값을 십의 자리까지 나타내고 일의 자리는 버림.

    SELECT LAST_NAME, TRUNC(SALARY/22, -1) FROM S_EMP ;

     

    2-8. 나누기의 나머지

    M 을 N 으로 나누고 남은 나머지를 RETURN 한다.

    u        MOD(M, N)


    [예제2-8] 10 을 3 으로 나눈 나머지를 구하시오.

    SELECT MOD(10, 3) FROM SYS.DUAL ;

     

    2-9. 날짜의 연산

    DATABASE 안의 DATE 값은 다음과 같은 숫자로 저장되어 있다.

    CENTURY, YEAR, MONTH, DAY, HOURS, MINUTES, SECONDS 그러므로 산술 연산을 할 수 있다.

    u        DATE + NUMBER : 숫자만큼 일이 더해진 날짜가 RETURN 된다.

    u        DATE - NUMBER : 숫자만큼 일이 빼진 날짜가 RETURN 된다.

    u        DATE1 - DATE2 : 두 날짜 사이의 일수가 계산된다.


    [예제2-9] S_EMP TABLE 에서 LAST_NAME, 입사한지 90 일째 되는 날, 입사한지 며칠 됐는 지 검색하시오.

    SELECT LAST_NAME, START_DATE + 90, SYSDATE - START_DATE

    FROM S_EMP; ( 날짜에는 시간도 포함되어 있으므로 일수 계산의 결과가 소수로 나온다. )

     

    2-10. 날짜 사이의 개월 수

    두 날짜 사이의 개월 수를 RETURN 한다.

    u        MONTHS_BETWEEN(DATE1, DATE2)


    [예제2-10] S_EMP TABLE 에서 LAST_NAME, 입사한지 몇 달이 됐는지 출력하시오.

    SELECT LAST_NAME, MONTHS_BETWEEN(SYSDATE, START_DATE)

    FROM S_EMP ; (일이 포함되어 있어서 소수로 출력된다.)

     

    2-11. 날짜에 달을 더함

    날짜에서 숫자(N) 개월만큼 더해진 날짜를 RETURN 한다.

    u        ADD_MONTHS(DATE, N)


    [예제2-11] S_EMP TABLE 에서 LAST_NAME, START_DATE, 입사한지 3 개월되는 날짜를 출력하시오.

    SELECT LAST_NAME, START_DATE, ADD_MONTHS(START_DATE, 3) ROM S_EMP ;

     

    2-12 지정한 요일 날짜

    날짜에서 지정한 요일(CHAR)이 될 날짜를 RETURN 한다.

    u        NEXT_DAY(DATE, 'CHAR')


    [예제2-12] 오늘을 기준으로 돌아오는 금요일이 언제인지 출력하시오.

    SELECT SYSDATE, NEXT_DAY(SYSDATE, 'FRIDAY') FROM SYS.DUAL ;

     

    2-13 그 달의 마지막 날

    날짜가 포함된 달의 마지막 날을 RETURN 한다.

    u        LAST_DAY(DATE)


    [예제2-13] 이번 달의 마지막 날은 언제인지 출력하시오.

    SELECT SYSDATE, LAST_DAY(SYSDATE) FROM SYS.DUAL ;

     

    2-14. 날짜의 반올림

    형태에 따른 반올림 기준은 다음과 같다.

    YEAR : 6월 이후,  MONTH : 15일 이후, DAY : 12시 이후

    날짜 데이타를 지정된 형태까지 나타내고 그 이하에서 반올림한다.

    u        ROUND(COLUMN명, '형태')


    [예제2-14] S_EMP TABLE 에서 ID, LAST_NAME, 입사 시작 달을 검색하시오. (단, 15일 이후는 다음달로 올리시오.)

    SELECT ID, LAST_NAME, ROUND(START_DATE, 'MONTH') FROM S_EMP ;

     

    2-15. 날짜의 절사

    날짜 데이타를 지정된 형태까지 나타내고 그 밑은 잘라낸다.

    u        TRUNC(COLUMN명, '형태')


    [예제2-15] S_EMP TABLE 에서 ID, LAST_NAME, 입사 시작 달을 검색하시오. (단, 일자는 잘라버리시오.)

    SELECT ID, LAST_NAME, TRUNC(START_DATE, 'MONTH') FROM S_EMP ;

     

    2-16 문자를 날짜로 변환

    CHARACTER TYPE 을 지정된 형태의 DATE TYPE 으로 변환한다.

    u        TO_DATE(character_column명, '형태')


    [예제2-16] S_EMP TABLE 에서 LAST_NAME, START_DATE 를 검색하시오.

    (단, START_DATE 의 값이 92/02/07 인 사원을 검색하시오.)

    SELECT LAST_NAME, START_DATE

    FROM S_EMP WHERE START_DATE = TO_DATE('92/02/07', 'YY/MM/DD') ;

     

    2-17 날짜를 문자로 변환

    DATE 값은 기본적으로 DD-MON-YY 형태로 출력된다.

    이것을 TO_CHAR FUNCTION 을 사용하면 원하는 다른 형태로 변환할 수 있다.

    l         형태를 지정할 때 사용된 대소문자로 출력된다.

    l         DAY 와 MONTH 형태는 공백을 포함한 9 자리로 출력된다.

    l         TO_CHAR 의 결과는 80 자리로 출력된다.

    DATE TYPE 을 지정된 형태의 CHARACTER TYPE 으로 변환한다.

    u        TO_CHAR(date_column, '형태')


    [예제2-17] S_EMP TABLE 에서 LAST_NAME, START_DATE 를 검색하시오.

    (단, START_DATE 의 형태는 1991/06/17 14:20:00 와 같이 출력하시오.)

    SELECT LAST_NAME, TO_CHAR(START_DATE, 'YYYY/MM/DD HH24:MI:SS'),

    START_DATE FROM S_EMP ;

     

    2-18. 숫자를 문자로 변환

    NUMBER TYPE 을 지정된 형태의 CHARACTER TYPE 으로 변환한다.

    u        TO_CHAR(number_column명, '형태')


    [예제2-18] S_EMP TABLE 에서 LAST_NAME, SALARY 를 검색하시오.(단 SALARY 를 $1,450 와 같은 형태로 출력시키시오.)

    SELECT LAST_NAME, TO_CHAR(SALARY, '$999,999') FROM S_EMP ;

     


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

    3. 여러Table로부터 Data검색

    3-1. Equijoin

    SIMPLE JOIN (EQUI-JOIN)

    여러개의 TABLE 들로부터 정보를 검색하려면, SELECT 문장의 FROM 절에 TABLE명들을 적고 WHERE 절에 각 TABLE의 ROW들을 연결시킬 조건식을 기술한다.

    각 TABLE 의 COLUMN명이 중복될 때는 반드시 COLUMN명 앞에 TABLE명을 붙여야 한다. (중복되지 않을 때는 붙이지 않아도 되지만 명확성을 위해서나 ACCESS 를 위해서 붙이는 것이 좋다.)

    N 개의 TABLE 을 JOIN 할 때는 최소한 N-1 개의 조건식이 필요하다.

    복합 COLUMN 으로 JOIN 할 때는 더 많은 조건식이 필요하다.

    2개 이상의 TABLE 에서 = 조건식을 만족시키는 ROW 들을 연결하여 검색한다.

    u        SELECT table명.column명, table명.column명...-FROM table1명, table2명-WHERE table1명.column1명 = table2명.column명 ;


    [예제3-1] S_EMP TABLE 과 S_DEPT TABLE 을 사용하여 사원들의 LAST_NAME, DEPT_ID, NAME 을 검색하시오.

    SELECT S_EMP.LAST_NAME, S_EMP.DEPT_ID, S_DEPT.NAME

    FROM S_EMP, S_DEPT WHERE S_EMP.DEPT_ID = S_DEPT.ID ;

     

    3-2. 특정 row의 join

    JOIN 문장을 기술할 때 JOIN 조건식 이외에 다른 조건식을 AND 로 연결할 수 있다.

    u        SELECT table명.column명, table명.column명...

    FROM table1명, table2명

    WHERE table1명.column1명 = table2명.column2명 AND condition ;


    [예제3-2] S_EMP TABLE과 S_DEPT TABLE 을 사용하여 LAST_NAME 이 Menchu 인 사원의 LAST_NAME, DEPT_ID, NAME 을 검색하시오.

    SELECT S_EMP.LAST_NAME, S_EMP.DEPT_ID, S_DEPT.NAME

    FROM S_EMP, S_DEPT

    WHERE S_EMP.DEPT_ID = S_DEPT.ID AND S_EMP.LAST_NAME = 'Smith' ;

     

    3-3 Table alias

    JOIN 문장에서 TABLE명이 긴 경우 TABLE명.COLUMN명 으로 적는 것이 매우 불편하다.

    그런데 TABLE명 대신 ALIAS 를 사용하면 편하게 사용할 수 있다.

    (SELECT 문장에서 TABLE명 대신 ALIAS 를 지정했다면 그 문장에서는 계속해서 ALIAS 로 사용하여야 한다.)

    TABLE ALIAS를 사용하여 JOIN 문장을 간단하게 기술한다.

    u        SELECT alias명.column명, alias명.column명

    FROM table1명 alias1명, table2명 alias2명

    WHERE alias1명.column1명 = alias2명.column2명 ;


    [예제3-3] S_CUSTOMER TABLE과 S_REGION TABLE 을 사용하여 고객 명,지역번호,지역 명을 검색하시오. (단, COLUMN ALIAS 와 TABLE ALIAS 를 사용하시오.)

    SELECT C.NAME "Customer Name", C.REGION_ID "Region Id", R.NAME "Region Name"

    FROM S_CUSTOMER C, S_REGION R WHERE C.REGION_ID = R.ID ;

     

    3-4 Non-Equijoin

    NON-EQUIJOIN

    JOIN 문장에서 두 TABLE 을 JOIN 하는 조건식에 = OPERATOR 가 사용되지 않고

    다른 OPERATOR 가 사용되는 것을 말한다.

    u        SELECT table명.column명, table명.column명... - FROM table1명, table2명 - WHERE 조인조건식 ;


    [예제3-4] EMP TABLE 과 SALGRADE TABLE 을 사용하여 사원의 ENAME, JOB, SAL,GRADE를 검색하시오.

    SELECT E.ENAME, E.JOB, E.SAL, S.GRADE FROM EMP E, SALGRADE S

    WHERE E.SAL BETWEEN S.LOSAL AND S.HISAL ;

    * (BETWEEN OPERATOR 대신에 <= 와 >= 를 사용해도 되지만 BETWEEN 이 간편하다.)

     

    3-5. Outer Join

    두 TABLE 을 JOIN 할 때 JOIN 조건식을 만족시키지 못하는 ROW 는 검색에서 빠지게 된다. 그런데 이러한 ROW 들이 검색되도록 하는 것이 OUTER JOIN 이다.

    (+) OUTER JOIN OPERATOR 를 데이타가 없는 어느 한쪽의 COLUMN 쪽에 붙인다.

    JOIN 결과, 데이타가 없는 쪽의 COLUMN 값은 NULL로 검색된다. 조건식을 만족시키지 못하는 데이타도 검색한다.

    u        SELECT table명.column명, table명.column명 - FROM table1명, table2명

    WHERE table1명.column1명 = table2명.column2명(+)


    [예제3-5] S_EMP TABLE 과 S_CUSTOMER TABLE 을 사용하여 영업사원의 LAST_NAME, SALES_REP_ID, NAME 을 검색하시오.

    (단, 영업사원이 정해져 있지 않은 고객의 이름도 검색하시오.)

    SELECT E.LAST_NAME, C.SALES_REP_ID, C.NAME

    FROM S_EMP E, S_CUSTOMER C

    WHERE E.ID(+) = C.SALES_REP_ID ;

     


    3-6. Self Join

    TABLE 의 ALIAS 를 사용하여, 마치 2 개의 TABLE 처럼 생각하여 자신의 TABLE 과 자신의 TABLE 을 JOIN 한다.

    u        SELECT alias명.column명, alias명.column명...

    FROM table명 alias1명, table명 alias2명

    WHERE alias1명.column1명 = alias2명.column2명 ;


    [예제3-6] S_EMP TABLE 에서 사원들의 LAST_NAME 과 그들의 상사 LAST_NAME 을 검색하시오.

    SELECT W.LAST_NAME "Woker", M.LAST_NAME "Manager"

    FROM S_EMP W, S_EMP M WHERE W.MANAGER_ID = M.ID ;

     

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

    4. Group Functions

    4-1. Group Function

    각각의 FUNCTION 은 ARGUMENT 를 받는데 기능은 다음과 같다.

    l        DISTINCT : 중복된 값은 제외한다.

    l        ALL : DEFAULT 로써 모든 값을 포함한다.

    l        COLUMN명 : NULL 값은 제외한다.

    l        : NULL 값도 포함한다.

    TABLE 전체를 하나의 GROUP 으로 보고 GROUP FUNCTION 값을 RETURN 한다.

    u         SELECT group_function(column명), group_function(column명)...

    FROM table명 ;


    [예제4-1] S_EMP TABLE 에서 회사 전체의 급여합계, 최고급여, 최소급여, 인원수를 검색하시오.

    SELECT SUM(SALARY), MAX(SALARY), MIN(SALARY), COUNT(SALARY) FROM S_EMP ;

    (COUNT(SALARY) 는 급여를 받는 사원의 총 인원수고 COUNT(*) 는 급여를 받지 않는 사원의 인원수도 포함된다.)

     

    4-2. 소group으로 분리

    기본적인 SELECT 절(그룹화 되지 않은 SELECT절)에는 COLUMN 명과 GROUP FUNCTION 이 같이 기술될 수 없다.

    SELECT 절에 COLUMN 명이 기술되려면 GROUP BY 절이 반드시 기술되어야 한다.

    SELECT 절에 기술된 COLUMN 명들은 전부 GROUP BY 절에 기술되어야 하며

    GROUP BY 절에 기술된 COLUMN 명들은 SELECT 절에 기술되지 않아도 된다.

    하지만 결과를 파악하기 위해서는 SELECT 절에 기술해주는 것이 좋다.

    GROUP BY 절을 기술하면 GROUP BY 절에 기술된 COLUMN 값으로 1 개의 TABLE이 소 GROUP 으로 나눠진다.

    결과는 COLUMN 값으로 SORT 되어서 출력된다. 1개의 TABLE 을 소 GROUP 으로 나누어 GROUP FUNCTION 값을 구한다.

    u         SELECT column1명[, column2명], group_function(column명) - FROM table명 - GROUP BY column1명[, column2명] ;


    [예제4-2] S_EMP TABLE 에서 DEPT_ID, TITLE 별로, 최고급여, 최소급여, 인원수를 검색하시오.

    SELECT DEPT_ID, TITLE, MAX(SALARY), MIN(SALARY), COUNT(SALARY)

    FROM S_EMP GROUP BY DEPT_ID, TITLE;

     

    4-3. 특정 group의 선택

    HAVING 절이 기술됐을 때 처리되는 순서는 다음과 같다.

    ① ROW 들이 GROUPing 된다. ② GROUP 에 대해 GROUP FUNCTION 이 적용된다.

    ③ HAVING 절을 만족하는 GROUP 을 선택한다.

    GROUP BY 절과 HAVING 절의 순서는 바뀌어도 되지만 의미상 GROUP BY 절 다음에 HAVING 절을 기술하는 것이 좋다.

    HAVING 절에서는 GROUP FUNCTION 을 사용하여 GROUP 에 대한 조건식을 기술한다.

    u         SELECT column1명[, column2명], group_function(column명) - FROM table명 - GROUP BY column1명[, column2명] HAVING 그룹조건식;


    [예제4-3] S_EMP TABLE에서 TITLE별로 급여합계를 검색하시오. (단, 급여합계가 5000이상인 GROUP만 출력하시오)

    SELECT TITLE, SUM(SALARY) PAYROLL FROM S_EMP

    GROUP BY TITLE HAVING SUM(SALARY) >= 5000 ;

     

    4-4. Group의 정렬

    기본적으로 GROUP BY 절에 기술된 COLUMN 값으로 SORT 된다.

    이 순서를 바꾸고자 하면 ORDER BY 절을 기술하면 된다. DATA 의 SORT 순서를 정한다.

    u         SELECT column1명[, column2명], group_function(column명) - FROM table명

    GROUP BY column1명[, column2명]

    ORDER BY column명| group_function(column명) ;


    [예제4-4] S_EMP TABLE에서 DEPT_ID 별로 인원수를 검색하시오. (단, 인원수가 많은 부서부터 출력하시오.)

    SELECT DEPT_ID, COUNT(*) FROM S_EMP GROUP BY DEPT_ID ORDER BY COUNT(*) DESC ;

     


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

     

    5. Subquery

    5-1. Single Row Subquery

    SUBQUERY의 결과가 1개의 ROW로 나오는 것을 SINGLE ROW SUBQUERY라 하며 다음과 같은 OPERATOR를 사용할 수 있다.

    =, >, >=, <, <= VALUE 값을 구하기 위해 SELECT 문장을 사용한다.

    u         SELECT column명, column명... - FROM table명

    WHERE column명 operator

    (SELECT column명 FROM table명 WHERE 조건식 );


    [예제5-1] S_EMP TABLE 에서 LAST_NAME 이 Smith 인 사원과 같은 업무(TITLE)를 하고 있는 사원의 LAST_NAME, TITLE 을 검색하시오.

    SELECT LAST_NAME, TITLE FROM S_EMP

    WHERE TITLE = ( SELECT TITLE FROM S_EMP WHERE LAST_NAME = 'Smith') ;

     

    5-2. From절의 Subquery

    FROM 절에 기술된 SUBQUERY 문은 VIEW 처럼 사용된다.

    u         SELECT alias명.column명, alias명,column명... - FROM table1명 alias1명, (SELECT column2명 FROM table2명 - WHERE 조건식) alias2명

    WHERE alias1명.column1명 OPERATOR alias2명.column2명 ;


    [예제5-2] S_EMP TABLE에서 SALARY가 회사평균급여 보다 적은 사원의 LAST_NAME, SALARY, 회사평균급여를 검색하시오.

    SELECT E.LAST_NAME, E.SALARY, S.AVGSAL

    FROM S_EMP E, (SELECT AVG(SALARY) AVGSAL FROM S_EMP) S

    WHERE E.SALARY < S.AVGSAL ;

     

    5-3. Multi Row Subquery

    SUBQUERY 의 결과가 여러 ROW 일 때는 반드시 IN OPERATOR 를 사용하여야 한다.

    u         SELECT column명, column명... - FROM table명

    WHERE column명 IN ( SELECT column명 FROM table명 WHERE 조건식);


    [예제5-3] S_EMP TABLE과 S_DEPT TABLE에서 Operations부서에서 근무하는 사원의 LAST_NAME, TITLE, DEPT_ID 를 검색하시오.

    SELECT LAST_NAME, TITLE, DEPT_ID FROM S_EMP

    WHERE DEPT_ID IN (SELECT ID FROM S_DEPT WHERE NAME = 'Operations') ;

     

    5-4. Multi Column Subquery

    SELECT 문장의 WHERE 절에서 여러개의 COLUMN 값을 비교하려면 LOGICAL OPERATOR 를 사용하여 여러 개의 조건식을 기술하여야 한다. 그런데 MULTI COLUMN SUBQUERY 를 사용하면 이를 해결할 수 있다.

    u         SELECT column명, column명,,, - FROM table명

    WHERE (column명, column명...) IN

    (SELECT column명, column명... FROM table명 WHERE 조건식);


    [예제5-4] S_EMP TABLE에서 LAST_NAME Patel인 사원과 같은 부서, 같은 업무를 맡고 있는 사원의 LAST_NAME, TITLE, DEPT_ID 를 검색하시오.

    SELECT LAST_NAME, TITLE, DEPT_ID FROM S_EMP

    WHERE (DEPT_ID, TITLE) IN(SELECT DEPT_ID, TITLEFROM S_EMPWHERE LAST_NAME = 'Patel') ;

    SELECT LAST_NAME, TITLE, DEPT_ID FROM S_EMP

    WHERE (DEPT_ID) IN (SELECT DEPT_ID FROM S_EMP WHERE LAST_NAME = 'Patel')

    OR (TITLE) IN (SELECT TITLE FROM S_EMP WHERE LAST_NAME = 'Patel') ;

     

     

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

    6. Table 생성

    6-1. 이름 붙이는 법

    이름은 다음의 규칙을 따라서 지정한다.

    l        TABLE 명이나 COLUMN 명은 문자로 시작하고 30 자 이내로 지정한다.

    l        A~Z, a~z, 0~9, _, $, # 을 사용할 수 있다.

    l        한 USER 내에서는 다른 OBJECT 의 이름과 동일하게 지정할 수 없다.

    l        ORACLE7 SERVER 예약어를 사용할 수 없다.

    l        대소문자를 구별하지 않는다.

     

    6-2. Oracle 7 datatype

    COLUMN 의 DATATYPE 은 다음과 같다.

    l        CHAR(size) : 고정된 size 의 문자 값, 최대 255 자까지 지정할 수 있다.

    l        VARCHAR2(size) : size내에서의 가변길이 문자 값,최대 2000자까지 지정할 수 있다.

    l        LONG : 가변길이 문자 값, 최대 2 기가 바이트까지 사용할 수 있다. TABLE 당 한 개의 COLUMN 에만 지정 가능하다.

    l        NUMBER(p,s) : 정수, 소수 자리수의 합이 P, 소수 자리수가 s 인 숫자값, 최대 38 자리수까지 지정할 수 있다.

    l        DATE : 날짜와 시간 값, B.C. 4712년 1월 1일부터 A.D. 4712년 12월 31일까지 입력할 수 있다.

    l        RAW(size) : size 내에서의 가변길이 BINARY DATA       ■ LONGRAW : 가변길이 BINARY DATA

     

    6-3. 다른 table로부터 table생성

    기존하는 TABLE 로 부터 데이타와 구조를 복사하여 TABLE 을 생성한다.

    u         CREATE TABLE table명 [(column명, column명...)] - AS subquery ;


    [예제6-1] S_EMP TABLE 에서 DEPT_ID 가 41 인 사원들의 ID, LAST_NAME, USERID, START_DATE 만을 복사하여 EMP_41 TABLE 을 생성하시오.

    CREATE TABLE EMP_41 AS SELECT ID, LAST_NAME, USERID, START_DATE

    FROM S_EMP WHERE DEPT_ID = 41;

    (S_EMP TABLE 에서 COLUMN명, TYPE, SIZE, NOT NULL CONSTRAINT 가 복사되어 EMP_41 TABLE 이 생성되며, 데이타는 DEPT_ID = 41 인 ROW 만 복사된다.)

     

    6-4. Constraint

    6-4-1. CONSTRAINT 의 종류는 다음과 같다.

    l        NOT NULL : COLUMN에 NULL값이 입력되는 것을 허용하지 않는다. COLUMN-CONSTRAINT 로만 기술해야 한다.


    l       UNIQUE : 한 개의 COLUMN혹은 복합 COLUMN을 UNIQUE KEY로 지정하며 UNIQUE KEY에는 중복된 값을 허용하지 않는다.

    한개의 COLUMN 으로 구성된 UNIQUE KEY 는 NULL 값을 허용한다.

    COLUMN 이나 TABLE-CONSTRAINT 로 기술할 수 있다.

    복합 COLUMN 으로 구성된 UNIQUE KEY 는 TABLE-CONSTRAINT 로만

    기술해야 한다.

    UNIQUE KEY COLUMN 의 UNIQUE INDEX FILE 이 자동 생성된다.


    l        PRIMARY KEY

    ROW 를 UNIQUE 하게 대표할 수 있는 한개의 COLUMN 혹은 복합 COLUMN

    으로 지정한다.

    PRIMARY KEY 에는 중복된 값과 NULL 값을 허용하지 않는다.

    TABLE 당 한 개의 PRIMARY KEY 만 지정할 수 있다. COLUMN 이나 TABLE-CONSTRAINT 로 기술할 수 있다.

    복합 COLUMN 으로 구성된 PRIMARY KEY 는 TABLE-CONSTRAINT 로만

    기술해야 한다.

    PRIMARY KEY COLUMN 의 UNIQUE INDEX FILE 이 자동 생성된다.


    l        FOREIGN KEY

    한개의 COLUMN 혹은 복합 COLUMN 으로 지정한다.

    같은 TABLE 혹은 다른 TABLE의 PRIMARY KEY 나 UNIQUE KEY 를 참조한다.

    FOREIGN KEY 값은 모 TABLE에 존재하는 데이타와 같던가 NULL 값을 허용함.

    COLUMN 이나 TABLE-CONSTRAINT 로 기술할 수 있다.


    ※ CHECK : 각각의 ROW 가 만족해야할 조건을 지정한다.

    조건식은 QUERY 조건식과 동일하게 지정한다. (단, 다음과 같은 것은 사용할 수 없다.)

    CURRVAL, NEXTVAL, LEVEL, ROWNUM, SYSDATE, USER COLUMN이나 TABLE-CONSTRAINT로 기술할 수 있다.


    6-4-2. CONSTRAINT 명은 다음과 같이 지정한다.

    l        CONSTRAINT 는 DICTIONARY 에 저장되므로 참조하기 쉽게 의미있게 붙여준다.

    l        일반적으로 TABLE명_COLUMN명_CONSTRAINT종류와 같은 형태로 지정한다.

    l        사용자가 CONSTRAINT 명을 지정하지 않으면 ORACLE7이 SYS_Cn의 형태로 붙인다.

    l        동일한 USER 내에서 CONSTRAINT명은 UNIQUE해야 한다.

    CONSTRAINT 는 다음과 같이 기술할 수 있다.

    COLUMN-CONSTRAINT : column명 [CONSTRAINT constraint명] constraint종류

    TABLE-CONSTRAINT : [CONSTRAINT constraint명] constraint종류 (column명, column명..)

     

    6-5. Table 생성

    u         CREATE TABLE table명 - (column명 type(size) [DEFAULT VALUE] [column constraint],

    column명 type(size) [DEFAULT VALUE] [column constraint], - .... , - [table constraint], - [table constraint], ....) ;


    [예제6-2] S_EMP TABLE CHART를 보고 TABLE 을 생성하시오.

    (단, TABLE CONSTRAINT 로 기술할 수 있는 것은 TABLE CONSTRAINT 로 정의하시오.)

    CREATE TABLE S_EMP(ID NUMBER(7), LAST_NAME VARCHAR2(25) CONSTRAINT S_EMP_LAST_NAME_NN NOT NULL,

    FIRST_NAME VARCHAR2(25), USERID VARCHAR2(8) CONSTRAINT S_EMP_USERID_NN NOT NULL,

    START_DATE DATE DEFAULT SYSDATE, COMMENTS VARCHAR2(25), MANAGER_ID NUMBER(7),

    TITLE VARCHAR2(25),

    DEPT_ID NUMBER(7),

    SALARY NUMBER(11,2),

    COMMISSION_PCT NUMBER(4,2),

    CONSTRAINT S_EMP_ID_PK PRIMARY KEY(ID),

    CONSTRAINT S_EMP_USERID_UK UNIQUE,

    CONSTRAINT S_EMP_DEPT_ID_FK FOREIGN KEY(DEPT_ID)

    REFERENCES S_DEPT(ID),

    CONSTRAINT S_EMP_COMMISSION_PCT CHECK

    (COMMISSION_PCT IN (10, 12.5, 15, 17.5, 20))) ;

     

     

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

    7. Data DICTIONARY


    7-1. DICTIONARY

    l        DATABASE 가 만들어 졌을때 DICTIONARY TABLE 도 만들어 진다.

    l        DATABASE 가 사용중일때 DICTIONARY TABLE 은 ORACLE7 SERVER 에 의해 UPDATE 된다.

    l        사용자들은 DICTIONARY TABLE 을 SELECT 할 수 있다. ? DICTIONARY TABLE 은 SYS USER 의 소유다.

    l        DICTIONARY TABLE의 값은 대문자로 들어있다. ? DICTIONARY TABLE 의 종류는 다음과 같은 방법으로 알 수 있다.

    SELECT *  FROM DICTIONARY ;

     

    7-2. DICTIONARY TABLE 의 종류는 다음과 같다.

    l        USER : USER 가 소유하고 있는 OBJECT 의 정보를 보여준다.

    l        ALL : USER 가 ACCESS 할 수 있는 OBJECT 의 정보를 보여준다.

    l        DBA : DBA USER 가 ACCESS 할 수 있는 OBJECT 의 정보를 보여준다.

     

    7-3. 활용예 - DICTIONARY TABLE 의 검색예는 다음과 같다.

    [예제7-1] 자신이 갖고 있는 TABLE 의 이름을 검색한다.

    SELECT   OBJECT_NAME - FROM    USER_OBJECTS

    WHERE   OBJECT_TYPE = 'TABLE';


    [예제7-2]  자신이 갖고 있는 OBJECT 의 종류를 검색한다.

    SELECT   DISTINCT OBJECT_TYPE - FROM   USER_OBJECTS;


    [예제7-3]  GRANT 와 관련된 DICTIONARY TABLE 의 이름을 검색한다.

    SELECT   TABLE_NAME - FROM   DICTIONARY

    WHERE   UPPER(COMMENTS) LIKE '%GRANT%';


    [예제7-4]  S_EMP TABLE 의 CONSTRAINT 종류를 검색한다.

    SELECT   CONSTRAINT_NAME, CONSTRAINT_TYPE,

    SEARCH_CONDITION,  R_CONSTRAINT_NAME

    FROM   USER_CONSTRAINTS - WHERE   TABLE_NAME = 'S_EMP';


    [예제7-5]  S_EMP TABLE 의 COLUMN CONSTRAINT 를 검색한다.

    SELECT CONSTRAINT_NAME, COLUMN_NAME

    FROM USER_CONS_COLUMNS

    WHERE TABLE_NAME = 'S_EMP';

     


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

    8. Data 조작


    -1. 데이타 입력

    TABLE 전체 COLUMN 에 값을 입력한다.

    u         INSERT INTO table명 - VALUES (value, value...);


    [예제8-1] S_EMP TABLE에 다음과 같은 데이타를 입력하시오.

    [ID : 26, LAST_NAME : Jung Mi, FIRST_NAME : Hong, USERID : Hjungmi,

    START_DATE : 05-APR-97, COMMENTS : Teacher, MANAGER_ID : 10,

    TITLE : Stock Clerk, DEPT_ID : 45, SALARY : 1200 COMMISSION_PCT : 10]

    INSERT INTO S_EMP

    VALUES (26, 'Jung Mi', 'Hong', 'Hjungmi', '05-APR-97', Teacher', 10, 'Stock Clerk', 45, 1200, 10) ;

    (값을 지정하는 순서는 TABLE 의 COLUMN 순서에 맞춘다. 이 방법보다는 COLUMN명을 기술하여 입력하는 방법이 더 좋다.)

     

    8-2. 특정 column에 데이터입력

    데이타를 입력하고자 하는 COLUMN을 선택하여 입력한다.

    u         INSERT INTO table명(column명, column명....) - VALUES (value, value....);


    [예제8-2] S_EMP TABLE 에 다음과 같은 데이타를 입력하시오.

    [ID : 27, LAST_NAME : Smith, FIRST_NAME : Donna, START_DATE : 05-APR-97]

    INSERT INTO S_EMP(ID, LAST_NAME, FIRST_NAME, START_DATE)

    VALUES (27, 'Smith', 'Donna', '05-APR-97') ;

     

    8-3. Null, 특수 value 입력

    COLUMN 값에 NULL 값을 지정하는 방법은 3 가지가 있다. ? INSERT 문장의 COLUMN LIST 에서 생략한다.

    l        INSERT 문장의 VALUE 절에서 NULL 로 지정한다.

    l        INSERT 문장의 VALUE 절에서 '' 로 지정한다.

    COLUMN 값에 특수한 값을 입력할 수 있다. (SYSDATE : 현재날짜와 시간, USER : 현재 USERID)


    [예제8-3] S_EMP TABLE 에 다음과 같은 데이타를 입력하시오.

    [ID : 29, LAST_NAME : Donna, USERID : USER, SALARY : NULL, START_DATE : SYSDATE]

    INSERT INTO S_EMP(ID, LAST_NAME, USERID, SALARY, START_DATE)

    VALUES (29, 'Donna', USER, NULL, SYSDATE);

     

    8-4. 특수형태의 날짜/시간입력

    DATE 값을 입력할 때는 지정된 DATE 형태로 입력하여야 한다.

    일반적으로 DD-MON-YY 형태를 사용하며, 이 형태로 데이타를 입력하면 세기는 현재의 세기로, 시간은 자정으로 입력된다.

    다른 세기의 날짜나 시간을 입력하고 싶으면 TO_DATE FUNCTION 을 사용한다.

    지정된 형태가 아닌 다른 형태의 날짜 값을 입력한다. ex>TO_DATE('날짜값','날짜형태')


    [예제8-4] S_EMP TABLE 에 다음과 같은 데이타를 입력하시오.

    [ID : 30, LAST_NAME : Donna, USERID : SQL01, START_DATE : 199704051400]

    INSERT INTO S_EMP(ID, LAST_NAME, USERID, START_DATE)

    VALUES (30, 'Donna', 'SQL01', TO_DATE('199704051400','YYYYMMDDHH24MI'));

     

    8-5. 다른table로부터 데이타입력

    INSERT 문장을 사용하여 기존하는 TABLE 의 데이타를 다른 TABLE 로 COPY 할 수 있다.

    u         INSERT INTO table명[(column명, column명...)] - SUBQUERY;


    [예제8-5] S_EMP TABLE 의 ROW들을 HISTORY TABLE 로 COPY 하시오.

    (단, 01-JAN-94 이전에 입사한 사원의 ID,LAST_NAME,SALARY,START_DATE 를 COPY 하시오)

    INSERT INTO HISTORY(ID, LAST_NAME, SALARY, START_DATE)

    SELECT ID, LAST_NAME, SALARY, START_DATE

    FROM S_EMP WHERE START_DATE < '01-JAN-94' ;

    (INSERT 절의 COLUMN 수와 SELECT 절의 COLUMN 수는 같아야 한다.)

     

    8-6. 데이타 수정

    UPDATE 문장을 사용하여 이미 존재하는 COLUMN 값을 수정한다.

    u         UPDATE table명 - SET column명 = value, [column명 = value]

    [WHERE 조건식] ;


    [예제8-6] S_EMP TABLE 에서 ID 가 1 인 사원의 데이타를 다음과 같이 수정하시오. (DEPT_ID : 32, SALARY : 2550)

    UPDATE S_EMP SET DEPT_ID = 32, SALARY = 2550 WHERE ID = 2 ;

     

    8-7. 데이타 삭제

    DELETE 문장을 사용하여 데이타를 삭제한다.

    DELETE FROM table명 - [WHERE 조건식] ;


    [예제8-7] S_EMP TABLE에서 ID 가 20 보다 큰 사원을 삭제하시오.

    DELETE FROM S_EMP WHERE ID > 20 ;

     

    8-8. 저장

    COMMIT 문장(COMMIT;)에 의해 변경된 모든 내용이 DATABASE에 저장되며 변경된 모든 데이타는 DATABASE에 저장된다.

    그 전의 데이타는 완전히 지워지며 모든 사용자가 변경한 내용을 볼 수 있고 변경된 ROW 에 걸려있던 LOCK 이 해제된다.

    그러므로 다른 사용자가 수정할 수 있으며 모든 SAVEPOINT 가 없어진다.

    TRANSACTION 을 종료하고 TRANSACTION 안의 모든 변경된 작업을 저장한다.

     

    8-9. 취소

    ROLLBACK 문장(ROLLBACK)은 모든 변경된 내용을 취소하며 수정하기 전의 데이타가 복구된다.

    변경된 ROW 에 걸려있던 LOCK 이 해제되고 다른 사용자들이 그 ROW 에 대해서 변경을 할 수 있다.

    TRANSACTION 을 종료하고 TRANSACTION 안의 모든 변경된 작업을 취소한다.

     

    8-10. Savepoint지정~취소

    TRANSACTION 안에서 ROLLBACK 할 수 있는 POINT 를 지정한다. 지정된 POINT 까지만 ROLLBACK 한다.

    SAVEPOINT savepoint명 ;     - ROLLBACK TO savepoint명 ;


    [예제8-8] S_EMP TABLE에서 TITLE이 Stock Clerk 인 사원의 SALARY 를 10% 인상하시오. SAVEPOINT 를 지정하시오.

    UPDATE S_EMP SET SALARY = SALARY * 1.1 WHERE TITLE = 'Stock Clerk' ; SAVEPOINT S1;


    [예제8-9] S_REGION TABLE 에 다음과 같은 데이타를 입력하시오.

    ID : 8, NAME : Central

    INSERT INTO S_REGION(ID, NAME) VALUES (8, 'Central') ;


    [예제8-10] SAVEPOINT 까지 ROLLBACK 하시오. UPDATE 결과를 저장하시오.

    ROLLBACK TO S1; COMMIT;

     


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

    9. Table변경/삭제

    9-1. Column 추가

    TABLE 에 새로운 COLUMN 을 추가한다.

    u         ALTER TABLE table명 - ADD (column명 type(size) [DEFAULT value] [column_constraint], - ...........) ;


    [예제9-1] S_REGION TABLE 에 다음과 같은 COLUMN 을 추가하시오. (COMMENTS VARCHAR2(25))

    ALTER TABLE S_REGION ADD (COMMENTS VARCHAR2(25))

    (추가될 COLUMN 의 위치는 지정할 수 없다. 새로운 COLUMN 은 마지막 위치에 생성된다.)


    9-2. Column 변경

    ALTER TABLE 문장의 MODIFY 절을 사용하여 다음과 같은 변경을 할 수 있다. COLUMN 의 크기를 확장할 수 있다. 데이타가 들어있지 않으면 COLUMN 의 크기를 줄일 수 있다. 데이타가 들어있지 않다면 COLUMN 의 타입을 수정할 수 있다.

    COLUMN 에 NULL 값이 없다면 NOT NULL CONSTRAINT 를 지정할 수 있다.

    DEFAULT VALUE 를 변경할 수 있다. 이미 생성되어 있는 COLUMN 을 변경한다.

    u         ALTER TABLE table명 - MODIFY (column명 type(size) [DEFAULT value] [NOT NULL], - .............) ;

     


    9-3. Constraint 추가

    이미 생성되어 있는 TABLE 에 CONSTRAINT 를 추가한다.

    u         ALTER TABLE table명 - ADD (table_constraint) ;


    [예제9-2] S_EMP TABLE 에 다음과 같은 CONSTRAINT 를 추가하시오.

    [ MANAGER_ID COLUMN 이 S_EMP TABLE 의 ID COLUMN 을 REFERENCE 하는 FOREIGN KEY CONSTRAINT 를 추가하시오. ]

    ALTER TABLE S_EMP

    ADD ( CONSTRAINT S_EMP_MANAGER_ID_FK FOREIGN KEY(MANAGER_ID)

                                                 REFERENCES S_EMP(ID) ) ;

     

    9-4. Constraint 삭제

    이미 생성되어 있는 TABLE 의 CONSTRAINT 를 삭제한다.

    u         ALTER TABLE table명 - DROP PRIMARY KEY | - UNIQUE(column명) | - CONSTRAINT constraint명 [CASCADE] ;


    [예제9-3] S_EMP TABLE의 다음과 같은 CONSTRAINT를 삭제하시오. (MANAGER_ID COLUMN의 FOREIGN KEY CONSTRAINT)

    ALTER TABLE S_EMP DROP CONSTRAINT S_EMP_MANAGER_ID_FK ;

     


    9-5. 전체 데이타의 삭제

    TRUNCATE 문장은 DDL 이다. ROLLBACK SEGMENT 를 만들지 않고 모든 데이타를 삭제한다. 데이타가 삭제된 FREE 영역은 환원된다. TABLE 로부터 모든 데이타를 삭제한다.

    u         TRUNCATE TABLE table명 ;


    [예제9-4] S_ITEM TABLE 의 모든 데이타를 삭제하시오.

    TRUNCATE TABLE S_ITEM ;

     

    9-6. Constraint disable/enable

    TABLE 에 있는 모든 데이타가 CONSTRAINT 를 만족시켜야 ENABLE 할 수 있다.

    PRIMARY KEY, UNIQUE CONSTRAINT 를 ENABLE 하면 그에 따른 INDEX FILE 이 자동적으로 생성된다.

    CASCADE OPTION 은 FOREIGN KEY CONSTRAINT 를 DISABLE 할 때 사용한다.

    CONSTRAINT 를 삭제하고 새로 만들지 않고 DISABLE, ENABLE 한다.

    u         ALTER TABLE table명-DISABLE |ENABLE PRIMARY KEY |-UNIQUE(column명) |CONSTRAINT constraint명 [CASCADE] ;


    [예제9-5] S_DEPT TABLE 의 PRIMARY KEY CONSTRAINT 를 DISABLE 시키시오.

    ALTER TABLE S_DEPT DISABLE CONSTRAINT S_DEPT_ID_PK CASCADE;

    (S_EMP TABLE 의 S_EMP_DEPT_ID_FK CONSTRAINT 도 자동적으로 DISABLE 된다.)

     

    9-7. Table 삭제

    TABLE 을 삭제하면 그 TABLE 에 딸린 INDEX FILE 도 삭제된다.

    VIEW, SYNONYM, STORED PROCEDURE, FUNCTION, TRIGGER 등은 삭제되지 않는다.

    CASCADE CONSTRAINTS 는 모 TABLE 을 삭제하고 자 TABLE 의 FOREIGN KEY CONSTRAINT 도 삭제한다.

    u         DROP TABLE table명 [CASCADE CONSTRAINTS] ;


    [예제9-6] S_DEPT TABLE 을 삭제하시오.

    DROP TABLE S_DEPT CASCADE CONSTRAINTS ;

    9-8. 이름의 변경

    TABLE, VIEW, SEQUENCE, SYNONYM 의 이름을 변경한다.

    u         RENAME old명 TO new명 ;


    [예제9-7] S_ORD TABLE 의 이름을 S_ORDER 로 변경하시오.

    RENAME S_ORD TO S_ORDER ;

     


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

    10. Sequence


    10-1. Sequence 생성

    SEQUENCE 는 여러 사용자에게 UNIQUE 한 값을 생성해 주는 OBJECT 이다.

    SEQUENCE 를 사용하여 PRIMARY KEY 값을 자동적으로 생성한다.

    u         CREATE SEQUENCE sequence명 - INCREMENT BY n - START WITH n - MAXVALUE n | NOMAXVALUE MINVALUE n | NOMINVALUE - CYCLE | NOCYCLE - CACHE n | NOCACHE ;


    [예제10-1] S_DEPT TABLE 의 ID COLUMN 값에 사용할 SEQUENCE 를 다음과 같이 생성하시오.

    (START : 51, INCREMENT : 1, MAXVALUE : 9999999, NOCYCLE, NOCACHE)

    CREATE SEQUENCE S_DEPT_ID INCREMENY BY 1 START WITH 51

    MAXVALUE 9999999 NOCACHE NOCYCLE ;

     

    10-2. Sequence 변경

    SEQUENCE 에 정의된 값을 변경한다.

    u         ALTER SEQUENCE sequence명 - INCREMENT BY n - MAXVALUE n | NOMAXVALUE - MINVALUE n | NOMINVALUE  CYCLE | NOCYCLE - CACHE n | NOCACHE ; -


    [예제10-2] S_DEPT_ID SEQUENCE 를 다음과 같이 수정하시오. (CACHE : 10)

    ALTER SEQUENCE S_DEPT_ID CACHE 10 ;

     

    10-3. Sequence 삭제

    SEQUENCE 를 삭제한다.

    u         DROP SEQUENCE sequence명 ;


    [예제10-3] S_DEPT_ID SEQUENCE 를 삭제하시오.

    DROP SEQUENCE S_DEPT_ID ;

     


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

    11. VIEW


    11-1. Simple view

    SUBQUERY 문장이 간단한 경우 VIEW 를 통해 SELECT,INSERT,UPDATE,DELETE 를 할 수 있다.

    l        SELECT : SUBQUERY 의 조건식을 만족하는 데이타만 검색된다.

    l        INSERT : NOT NULL COLUMN 을 다 포함하고 있는 경우 INSERT 를 할 수 있다. SUBQUERY 의 조건식을 만족하지 않는 데이타도 입력이 가능하다.

    l        UPDATE : VIEW 를 통해 SELECT 할 수 있는 데이타만 수정할 수 있다.

    SUBQUERY 의 조건식을 만족하지 않는 데이타도 수정이 가능하다.

    l        DELETE : VIEW 를 통해 SELECT 할 수 있는 데이타만 삭제할 수 있다.

    u         CREATE VIEW view명 [(alias명, alias명....)] - AS SUBQUERY ;


    [예제11-1] S_EMP TABLE에서 DEPT_ID가 45인 사원의 ID, LAST_NAME, DEPT_ID, TITLE을 선택해서 VIEW를 생성하시오.

    CREATE VIEW EMP41 AS SELECT ID, LAST_NAME, DEPT_ID, TITLE

    FROM S_EMP WHERE DEPT_ID = 45 ;

     

    11-2. With check option

    VIEW 를 정의할때 지정한 조건식을 만족하는 데이타만 INSERT, 또는 조건식을 만족하는 데이터로만 UPDATE 가 가능하다.  데이타가 VIEW 의 조건식을 만족하는지 CHECK 한다.

    u         CREATE VIEW view명 [ (alias명, alias명...)] - AS SUBQUERY - WITH CHECK OPTION ;


    [예제11-2] S_EMP TABLE에서 DEPT_ID가 45인 사원의 ID, LAST_NAME, DEPT_ID, TITLE을 선택해서 VIEW를 생성하시오.

    (단, DEPT_ID 가 45 가 아닌 사원은 입력되지 못하게 만드시오.)

    CREATE VIEW EMP45 AS SELECT ID, LAST_NAME, DEPT_ID, TITLE

    FROM S_EMP WHERE DEPT_ID = 45 WITH CHECK OPTION ;

     

    11-3. With read only

    SELECT만 가능한 VIEW 를 생성한다.

    u         CREATE VIEW view명 [(alias명, alias명...)] - AS SUBQUERY - WITH READ ONLY ;


    [예제11-3] S_EMP TABLE 에서 ID, LAST_NAME, DEPT_ID, SALARY 가 SELECT 만 되도록 VIEW 를 생성하시오.

    CREATE VIEW R_EMP AS SELECT ID, LAST_NAME, SALARY

    FROM S_EMP WITH READ ONLY ;

     

    11-4. Force

    기준 TABLE 이 존재하지 않아도 VIEW 를 생성한다.

    u         CREATE FORCE VIEW view명 [(alias명, alias명...)] - AS SUBQUERY ;


    [예제11-4] S_EMP TABLE 이 없어도 S_EMP TABLE 에서 ID, LAST_NAME, SALARY 를 선택해서 VIEW 를 생성하시오.

    CREATE FORCE VIEW T_EMP AS SELECT ID, LAST_NAME, SALARY FROM S_EMP ;

     

    11-5. complex view

    SUBQUERY문장에 JOIN, FUNCTION, DISTINCT/연산이 포함된 경우를 말하며 이 경우 VIEW를 통한 DML은 수행할 수 없다.

    u         COMPLEX VIEW 를 생성한다. CREATE VIEW view명 (alias명, alias명...) - AS SUBQUERY ;


    [예제11-5] S_EMP TABLE과 S_DEPT TABLE에서 ID, LAST_NAME, DEPT_ID, NAME을 선택해서 VIEW를 생성하시오.

    CREATE VIEW EMPDEPT AS SELECT E.ID, E.LAST_NAME, E.DEPT_ID, D.NAME

    FROM S_EMP E, S_DEPT D WHERE E.DEPT_ID = D.ID ;

     

    11-6. View 삭제

    VIEW 를 삭제하면 DATABASE 로부터 VIEW 의 정의가 삭제된다. VIEW 가 기초로 한 TABLE 은 삭제되지 않는다.

    u         DROP VIEW view명 ;


    [예제11-6] EMPDEPT VIEW 를 삭제하시오.

    DROP VIEW EMPDEPT ;

     


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

    12. Index


    12-1. Index 생성

    TABLE 생성시 PRIMARY KEY 나 UNIQUE CONSTRAINT 를 지정하면 UNIQUE INDEX 가 자동적으로 만들어 진다. 이 외의 COLUMN 으로 QUERY 를 할 때 속도를 향상시키기 위해서 INDEX 를 생성한다. INDEX를 생성하면 QUERY 속도는 빨라질 수 있으나 DML속도는 늦어질 수 있다.

    일반적으로 다음과 같은 경우에 INDEX 를 생성한다.

    l        COLUMN 이 WHERE 절이나 JOIN 조건식에 빈번하게 사용될 때

    l        COLUMN 값이 넓게 분포되어 있을 때

    l        COLUMN 값에 NULL 값이 많이 포함되어 있을 때

    l        TABLE 이 크고 QUERY 하는 데이터 양이 10 % 이하일 때

    u         CREATE [UNIQUE] INDEX index명 - ON table명(column명[, column명...]) ;


    [예제12-1] S_EMP TABLE 에서 LAST_NAME 의 QUERY 속도를 향상하기 위하여 INDEX 를 생성하시오.

    CREATE INDEX S_EMP_LAST_NAME_IDX ON S_EMP(LAST_NAME) ;

     

    12-2. Index 삭제

    INDEX 는 수정할 수 없다. 수정하고 싶은 경우 삭제하고 다시 생성한다.

    u         DROP INDEX index명 ;


    [예제12-2] S_EMP_LAST_NAME_IDX INDEX 를 삭제하시오.

    DROP INDEX S_EMP_LAST_NAME_IDX ;

    Posted by SB패밀리

    현재 우리 회사 솔루션의 ASP.NET 웹 애플리케이션에는, 빈번하게 사용되는 개인 정보(혹은 설정값)을 담는 용도로 쿠키를 사용하고 있다. 쿠키는 사실 참 편리하다. 서버의 리소스를 점유하지도 않고, 만료기간만 지정해두면 서버가 다운되건 말건 계속 유지도 되고.. 서버사이드, 클라이언트 사이드 어디서나 쉽게 접속할 수 있기도 하고.

    하지만, 솔루션에 대한 보안 감사 끝에.. 쿠키를 제거하기로 결정이 되었다. 사실 보안 측면에서 보자면 쿠키라는 것은 꽤 위험하다. 문제는 이 쿠키가 클라이언트에 저장되는 Plain Text파일인데다가, 모든 Web Server에 대한 Request/Response시에 전송이 된다는 것이다. 즉, 클라이언트에서 이 파일을 열어 볼 수도 있고, 네트워크 패킷을 스니핑해서 내용을 볼 수도 있다. 거기다가 위/변조하기도 당연히 쉽다. 또 일부 국가 - 어딘지는 잘 모른다 - 에서는 법적으로 쿠키를 금지하기도 하고, Internet Explorer등의 브라우저에서도 쿠키를 허용하지 않는 옵션을 장착하고 있기 때문에 어떤 사용자들의 경우 쿠키를 아예 사용할 수 없을 가능성도 있는 것이다.

    서두가 장황했는데, 암튼 쿠키를 모두 제거하기로 하고 우리가 선택한 대안은 ASP.NET 세션이었다. 사실 빈번하게 사용되는 사용자 개인의 설정값등을 담아둘 수 있는 가장 이상적인 공간이기도 하고, 쿠키와 매우 유사하게 서버사이드에서 사용할 수도 있기 때문이었다. 하지만 이 ASP.NET 세션에는 한 가지 문제가 있다. 그 문제는 바로, 이 ASP.NET 세션이 기본적으로 쿠키를 사용한다는 것이다.

    ASP.NET 세션을 사용하면 생성되는 쿠키는 이렇게 생겼다.

    ASP.NET_SessionId=d1ucyg30qyjw1f554szadoqy;

    즉, ASP.NET 세션에서 각 사용자를 구분하는 것 자체가 이 쿠키를 사용하는 것이다.

    그런데, ASP.NET에는 Cookie-less Session이라고 해서, 쿠키를 사용하지 않고 세션을 사용할 수 있게 해주는 모드 또한 있다. 이것은 별도의 코딩이 필요한 것은 아니고 단지 Web.Config의 SessionState 부분에 Cookieless를 True로 바꿔주기만 하면 된다.

    <sessionState
                mode="InProc"
                stateConnectionString="tcpip=127.0.0.1:42424"
                sqlConnectionString="data source=127.0.0.1;Trusted_Connection=yes"
               
    cookieless="true"
                timeout="20"
        />

    이 Cookie-less Session에 대한 자세한 내용은 Dino Esposito씨의 다음 Article을 보면 알 수 있다.

    위 아티클을 보면 알 수 있겠지만, 이 Cookieless Session은 세션을 쓰면서도 Cookie를 완전히 쓰지 않아도 된다는 점에서 나의 고민을 완벽하게 해주는 것이었다. 그러나 나는 몇 가지 문제를 발견했다..-_-;;

    첫째로 이 Cookieless Session을 쓸 경우 모든 URL이 조금씩 바뀌게 된다는 것이다. 즉, 요청한 URL이 이렇다면..

    http://localhost/CookielessSessionWebSample/Webform1.aspx

    실제로 페이지가 열린 다음에는 이렇게 바뀌게 된다.

    http://localhost/CookielessSessionWebSample/(mkwgif552tavi2vtxhgq1a45)/Webform1.aspx

    위의 URL에 가운데 부분에 이상하게 끼어든 (mkwgif552tavi2vtxhgq1a45)이 바로 쿠키의 SessionID의 역할을 하는 것이다. 즉 쿠키를 쓰는 대신에 URL에 세션ID를 넣어서 사용한다고 생각하면 되겠다.

    두번째로 바로 위 사실 때문에 몇가지 제약 사항이 발생한다. Server.Transfer와 Response.Redirect 등을 사용할 때, Root로부터 시작하는 URL 즉 이런 형태 - /RootDir/Somepage.aspx - 를 사용하지 못하며, Full URL - http://ServerName/RootDir/Somepage.aspx - 를 또한 사용하지 못한다. 이 사실은 EggHeadCafe라는 사이트의 한 게시물에서 알게 되었다.

    첫번째 문제가 Accept된다면, 사실 대부분의 경우 큰 문제는 없을 것이다. 두번째처럼 만약 코딩을 했다는 것은, 사실 코딩 상에 문제가 있는 거라고 봐야 하니까. 그런데 내 경우는 우리 회사의 솔루션에 저런 것이 없다고 장담하기가 힘들었다는 것이다. 그래서, 우리 솔루션의 경우는 쿠키의 세션ID는 허용하는 방향으로 가기로 했다.

    하지만, 쿠키를 완전히 사용할 수 없는 경우가 발생한다면, Cookie-less Session은 매우 좋은 선택이 될 것이다. 그리고 이 Cookie-less Session을 사용한다면 위에서 언급한 코딩상의 주의 사항은 반드시 지켜야 할 것이다.

    출처 : http://lazydeveloper.net/2567069

    Posted by SB패밀리

    USB 오토런 방지 프로그램

    Posted by SB패밀리
    USB 부팅 디스크 포맷 프로그램

    Posted by SB패밀리
    TAG USB

    이 대화 상자를 사용하면 데이터베이스의 테이블 사이에 관계를 만들거나 수정할 수 있습니다. 외래 키 관계에서 외래 키 제약 조건은 기본 키나 UNIQUE 제약 조건과 함께 사용되며 지정된 테이블 사이에 참조 무결성을 적용합니다. 예를 들어, Order_Details 테이블에서 ProductID 열에 외래 키 제약 조건을 두어 이 열에 입력한 값이 Products 테이블의 ProductID 열의 기존 값과 일치하도록 할 수 있습니다.

     

     

    옵션

    선택한 관계

    기존 관계를 나열합니다. 관계를 선택하면 오른쪽 표에 해당 속성이 표시됩니다. 목록이 비어 있는 경우 테이블에 정의된 관계가 없음을 의미합니다.

    추가

    새 관계를 만듭니다. 관계를 유효하게 만들려면 테이블 및 열 사양을 먼저 설정해야 합니다.

    삭제

    선택한 관계 목록에서 선택한 관계를 삭제합니다. 관계 추가를 취소하려면 이 단추를 사용하여 관계를 제거합니다.

    일반 범주

    확장하여 만들거나 다시 활성화할 때 기존 데이터 검사테이블 및 열 사양을 표시합니다.

    만들거나 다시 활성화할 때 기존 데이터 검사

    제약 조건을 만들거나 다시 활성화하기 전부터 테이블에 있던 모든 데이터를 제약 조건에 대해 검사합니다.

    테이블 및 열 사양 범주

    확장하여 어떠한 테이블의 어떠한 열이 관계에서 외래 키와 기본 키(또는 고유 키)로 사용되는지에 대한 정보를 표시합니다. 이러한 값을 편집하거나 정의하려면 속성 필드의 오른쪽에 있는 줄임표(...)를 클릭합니다.

    외래 키 기본 테이블

    선택한 관계에서 외래 키로 사용되는 열이 포함된 테이블을 표시합니다.

    외래 키 열

    선택한 관계에서 외래 키로 사용되는 열을 표시합니다.

    Primary/Unique 키 기본 테이블

    선택한 관계에서 기본 키(또는 고유 키)로 사용되는 열이 포함된 테이블을 표시합니다.

    Primary/Unique 키 열

    선택한 관계에서 기본 키(또는 고유 키)로 사용되는 열을 표시합니다.

    ID 범주

    확장하여 이름설명에 대한 속성 필드를 표시합니다.

    이름

    관계의 이름을 표시합니다. 새 관계를 만들면 테이블 디자이너의 활성 창에 있는 테이블을 기반으로 한 기본 이름이 새 관계에 지정됩니다. 언제든지 이름을 변경할 수 있습니다.

    설명

    관계에 대해 설명합니다. 더 자세한 설명을 기록하려면 설명을 클릭한 다음 속성 필드의 오른쪽에 있는 줄임표(...)를 클릭합니다. 이렇게 하면 텍스트를 쓸 수 있는 더 큰 영역이 제공됩니다.

    테이블 디자이너 범주

    확장하여 만들거나 다시 활성화할 때 기존 데이터 검사복제에 적용에 대한 정보를 표시합니다.

    복제에 적용

    복제 에이전트가 이 테이블에서 삽입, 업데이트 또는 삭제를 수행할 때 제약 조건을 적용할지 여부를 나타냅니다. 자세한 내용은 NOT FOR REPLICATION으로 제약 조건, ID, 및 트리거 제어를 참조하십시오.

    외래 키 제약 조건 적용

    관계를 맺고 있는 열의 데이터를 변경할 때 외래 키 관계의 무결성 제약 조건을 위반하게 되는 경우 이러한 데이터를 변경할 수 있는지 여부를 지정합니다. 이러한 변경을 허용하지 않으려면 를 선택하고, 이를 허용하려면 아니요를 선택합니다.

    INSERT 및 UPDATE 사양 범주

    확장하여 관계의 삭제 규칙업데이트 규칙에 대한 정보를 표시합니다.

    삭제 규칙

    외래 키 관계를 맺고 있는 데이터가 포함된 행을 사용자가 삭제하려 할 때 적용할 결과를 지정합니다.

    • 작업 안 함 삭제가 허용되지 않고 DELETE가 롤백된다는 오류 메시지가 나타납니다.

    • 계단식 배열 외래 키 관계에 관련된 데이터가 포함된 모든 행을 삭제합니다.

    • Null 설정 테이블의 모든 외래 키 열에 null 값을 사용할 수 있으면 값을 null로 설정합니다. SQL Server 2005 에만 적용됩니다.

    • 기본값 설정 테이블의 모든 외래 키 열에 기본값이 정의되어 있으면 열에 정의된 기본값으로 값을 설정합니다. SQL Server 2005 에만 적용됩니다.

    업데이트 규칙

    외래 키 관계를 맺고 있는 데이터가 포함된 행을 사용자가 업데이트하려 할 때 적용할 결과를 지정합니다.

    • 작업 안 함 삭제가 허용되지 않고 DELETE가 롤백된다는 오류 메시지가 나타납니다.

    • 계단식 배열 외래 키 관계에 관련된 데이터가 포함된 모든 행을 삭제합니다.

    • Null 설정 테이블의 모든 외래 키 열에 null 값을 사용할 수 있으면 값을 null로 설정합니다. SQL Server 2005 에만 적용됩니다.

    • 기본값 설정 테이블의 모든 외래 키 열에 기본값이 정의되어 있으면 열에 정의된 기본값으로 값을 설정합니다. SQL Server 2005 에만 적용됩니다.
    Posted by SB패밀리

    alter table 방법

    --------------------테이블 컬럼추가------------------

    ALter Table 테이블Name

    ADD Test_Col nvarchar(100) Default  Null --null을 허용함

    -------------------테이블 컬럼삭제--------------------

    Alter Tble 테이블Name

    DROP COLUMN MOBILE1

    --열 삭제시 제약조건이 걸려있으면 제약조건부터 삭제

    ------------------테이블 제약조건 삭제방법------------

    Alter Table 테이블Name

    DROP CONSTRAINT 제약조건Name

    -----------------테이블 열 형식 변경------------------

    Alter Table 테이블Name

    ALTER COLUMN NAME NVARCHAR(10) NULL

    ------------테이블끼리 릴레이션 정의--------------------

    --With NoCheck 옵션 같은 경우는 기존에 제약조건에 의해 부모 데이터와 자식데이터의 PK,FK가 일치하지않아 충돌날경우를 대비해서 기존데이터는 무시하고 관계를 맺는것이다(외래키 제약조건)

    Alter Table  테이블Name With NoCheck 

    ADD CONSTRANT FK_USERTBL_BUYTBL

    FOREIGN KEY(USERID)

    REFERENCES USERTBL(USERID) --참조하는 부모테이블의 PK. 외래 키 제약 조건 적용

    ON UPDATE CASCADE --부모테이블에서 업데이트시 자식테이블도 업데이트. 업데이트 규칙

    ON DELETE CASCADE --부모테이블에서 삭제시 자식테이블도 자동 삭제. 삭제 규칙

    -- NOT FOR REPLICATION -- 복제에 적용

    Posted by SB패밀리

    출처 : http://support.microsoft.com/kb/316748/ko

    이 문서에서는 다음 Microsoft .NET Framework 클래스 라이브러리의 네임스페이스를 참조합니다.
    • System.Text
    • System.DirectoryServices
    • System.Security.Principal
    • System.Web.Security



    요약

    Visual C# .NET에서 ASP.NET 웹 응용 프로그램 만들기

    Visual C# .NET FormsAuthAd 라는 새 ASP.NET 웹 응용 프로그램을 만들려면 다음과 같이 하십시오.

    1. Microsoft Visual Studio .NET 시작하십시오.
    2. 파일 메뉴에서 새로 만들기를 가리킨 다음 프로젝트 를 클릭하십시오.
    3. 프로젝트 형식Visual C# 프로젝트 클릭한 다음 템플릿 에서 ASP.NET 웹 응용 프로그램 을 누릅니다.
    4. 위치 상자에 WebApplication1을 함께 FormsAuthAd 대체하십시오.
    5. 확인 을 클릭하십시오.
    6. 솔루션 탐색기에서 참조 노드를 마우스 오른쪽 단추로 클릭한 다음 참조 추가 클릭하십시오.
    7. 참조 추가 대화 상자에서 .NET 탭의 System.DirectoryServices.dll, 선택 을 클릭한 다음 확인 을 누릅니다.

    인증 코드 작성

    LdapAuthentication.cs 라는 새 클래스 파일을 만들려면 다음과 같이 하십시오.

    1. 솔루션 탐색기에서 프로젝트 노드를 마우스 오른쪽 단추로, 추가 를 가리킨 다음 새 항목 추가 클릭하십시오.
    2. 클래스템플릿 에서 클릭하십시오.
    3. 이름 상자에 LdapAuthentication.cs 입력하고 열기 를 클릭하십시오.
    4. LdapAuthentication.cs 파일에서 기존 코드를 다음 코드로 바꿉니다.
      using System;
      using System.Text;
      using System.Collections;
      using System.DirectoryServices;
      
      namespace FormsAuth
      {	
        public class LdapAuthentication
        {
          private String _path;
          private String _filterAttribute;
      
          public LdapAuthentication(String path)
          {
            _path = path;
          }
      		
          public bool IsAuthenticated(String domain, String username, String pwd)
          {
            String domainAndUsername = domain + @"\" + username;
            DirectoryEntry entry = new DirectoryEntry(_path, domainAndUsername, pwd);
      			
            try
            {	//Bind to the native AdsObject to force authentication.			
               Object obj = entry.NativeObject;
      
      	DirectorySearcher search = new DirectorySearcher(entry);
      
      	search.Filter = "(SAMAccountName=" + username + ")";
      	search.PropertiesToLoad.Add("cn");
      	SearchResult result = search.FindOne();
      
      	if(null == result)
      	{
        	  return false;
      	}
      
      	//Update the new path to the user in the directory.
      	_path = result.Path;
      	_filterAttribute = (String)result.Properties["cn"][0];
            }
            catch (Exception ex)
            {
              throw new Exception("Error authenticating user. " + ex.Message);
            }
      
      	return true;
           }
      
           public String GetGroups()
           {
             DirectorySearcher search = new DirectorySearcher(_path);
             search.Filter = "(cn=" + _filterAttribute + ")";
             search.PropertiesToLoad.Add("memberOf");
             StringBuilder groupNames = new StringBuilder();
      
             try
             {
               SearchResult result = search.FindOne();
      
      	 int propertyCount = result.Properties["memberOf"].Count;
      
         	 String dn;
      	 int equalsIndex, commaIndex;
      				
      	 for(int propertyCounter = 0; propertyCounter < propertyCount; propertyCounter++)
      	 {
      	   dn = (String)result.Properties["memberOf"][propertyCounter];
      
          	   equalsIndex = dn.IndexOf("=", 1);
      	   commaIndex = dn.IndexOf(",", 1);
      	   if(-1 == equalsIndex)
      	   {
      	     return null;
           	   }
      
                 groupNames.Append(dn.Substring((equalsIndex + 1), (commaIndex - equalsIndex) - 1));
      	   groupNames.Append("|");
      
          	 }
             }
             catch(Exception ex)
             {
               throw new Exception("Error obtaining group names. " + ex.Message);
             }			
             return groupNames.ToString();
           }
         }
      }
      					

    인증 코드 도메인, 사용자 이름, 암호 및 Active Directory의 트리 경로를 입력할 수 있습니다. 이 코드는 LDAP 디렉터리 공급자를 사용합니다.

    Logon.aspx 페이지에 코드 LdapAuthentication.IsAuthenticated 메서드 호출 및 사용자로부터 수집한 자격 증명을 전달합니다. 그런 다음 DirectoryEntry 개체는 디렉터리 트리, 사용자 이름 및 암호를 경로가 만들어집니다. 사용자 이름은 "도메인\사용자 이름" 형식이어야 합니다. DirectoryEntry 개체를 다음 NativeObject 속성을 가져오는 AdsObject 바인딩 강제로 시도합니다. 이 작업이 성공하면 사용자가 CN 특성 DirectorySearcher 개체 만들기 및 SAMAccountName에 대한 필터링을 얻을 수 있습니다. 사용자가 인증된 후에는 IsAuthenticated 메서드는 true 를 반환합니다.

    사용자가 속한 그룹 목록을 얻으려면 이 코드 LdapAuthentication.GetGroups 메서드를 호출합니다. LdapAuthentication.GetGroups 메서드는 DirectorySearcher 개체 만들기 및 memberOf 특성을 따라 필터링을 사용자가 속한 보안 및 메일 그룹 목록을 가져옵니다. 이 메서드는 파이프 (|) 로 구분된 그룹 목록을 반환합니다.

    LdapAuthentication.GetGroups 메서드는 조작하고 문자열을 잘라내는 알 수 있습니다. 인증 쿠키에 저장되는 문자열의 길이를 줄입니다. 문자열이 잘리지 각 그룹의 형식을 다음과 같이 나타납니다.

    CN=...,...,DC=domain,DC=com
    				

    매우 긴 문자열을 만들 수 있습니다. 이 문자열의 길이가 쿠키의 길이보다 큰 경우 브라우저에서 인증 쿠키를 받아들일 수 및 로그온 페이지로 리디렉션됩니다. 그러나 다중 도메인 환경에 있는 경우 다른 도메인의 그룹을 동일한 그룹 이름을 가질 수 있으므로 그룹 이름 사용하여 도메인 이름을 유지해야 할 수 있습니다. 한 그룹에서 다른 구분하기 위해 도메인 이름을 유지해야 합니다.

    대부분의 브라우저에서는 최대 4096바이트의 쿠키를 지원합니다. 이 문자열의 길이가 쿠키의 잠재적으로 초과할 수 있으면 그룹 정보를 ASP.NET 캐시 개체 또는 데이터베이스 저장할 할 수 있습니다. 또는 그룹 정보를 암호화하고 이 정보가 숨겨진된 폼 필드에 저장할 할 수 있습니다.

    Global.asax 코드 작성

    Global.asax 파일에 코드를 Application_AuthenticateRequest 이벤트 처리기를 제공합니다. 이 이벤트 처리기는 Context.Request.Cookies 컬렉션에서 인증 쿠키를 검색하고 해당 쿠키를 해독합니다 FormsAuthenticationTicket.UserData 속성에 저장된 그룹 목록을 검색합니다. 그룹은 Logon.aspx 페이지에 만들어지는 파이프 구분된 목록에 나타납니다.

    코드를 GenericPrincipal 개체를 만들려면 문자열 배열의 문자열을 구문 분석합니다. GenericPrincipal 개체를 만든 후에는 이 개체의 HttpContext.User 속성은 배치됩니다.

    1. 솔루션 탐색기에서 Global.asax, 마우스 오른쪽 단추로 클릭한 다음 코드 보기를 클릭하십시오.
    2. 코드 숨김 Global.asax.cs 파일 맨 위에 다음 코드를 추가하여:
      using System.Web.Security;
      using System.Security.Principal;
      					
    3. 기존 빈 이벤트 처리기에 대한 Application_AuthenticateRequest 다음 코드로 대체합니다.
      void Application_AuthenticateRequest(Object sender, EventArgs e)
      {
        String cookieName = FormsAuthentication.FormsCookieName;
        HttpCookie authCookie = Context.Request.Cookies[cookieName];
      
        if(null == authCookie)
        {//There is no authentication cookie.
          return;
        }	
      		
        FormsAuthenticationTicket authTicket = null;
      	
        try
        {
          authTicket = FormsAuthentication.Decrypt(authCookie.Value);
        }
        catch(Exception ex)
        {
          //Write the exception to the Event Log.
          return;
        }
      	
        if(null == authTicket)
        {//Cookie failed to decrypt.
          return;		
        }		
      	
        //When the ticket was created, the UserData property was assigned a
        //pipe-delimited string of group names.
        String[] groups = authTicket.UserData.Split(new char[]{'|'});
      
        //Create an Identity.
        GenericIdentity id = new GenericIdentity(authTicket.Name, "LdapAuthentication");
      	
        //This principal flows throughout the request.
        GenericPrincipal principal = new GenericPrincipal(id, groups);
      
        Context.User = principal;
      	
      }
      					

    Web.config 파일을 수정하십시오.

    이 섹션에서는 다음 <forms>구성, <authentication>,, 및 해당 <authorization> Web.config 파일에서 요소를. 이러한 변경 내용이 인증된 사용자만 응용 프로그램에 액세스할 수 있으며 인증되지 않은 요청은 Logon.aspx 페이지로 리디렉션됩니다. 특정 사용자와 응용 프로그램이 그룹 액세스를 허용하도록 이 구성을 수정할 수 있습니다.

    Web.config 파일에서 기존 코드를 다음 코드로 바꿉니다.

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>    
      <system.web>
        <authentication mode="Forms">
          <forms loginUrl="logon.aspx" name="adAuthCookie" timeout="10" path="/" >
          </forms>
        </authentication>	
        <authorization>	
          <deny users="?" />
          <allow users="*" />
        </authorization>	
        <identity impersonate="true" />
      </system.web>
    </configuration>
    				

    알 수 있는 <identity impersonate="true"/> 구성 요소. 이로 인해 ASP.NET에서 Microsoft 인터넷 정보 서비스 (IIS) 에서 익명 계정으로 구성할 계정을 가장할 수 있습니다. 이 구성은 이 응용 프로그램에 대한 모든 요청은 구성된 계정의 보안 컨텍스트에서 실행합니다. 사용자가 Active Directory에 [NULL]에 대해 인증 자격 증명을 제공하지만 Active Directory를 액세스하는 계정이 구성된 계정입니다. 자세한 내용은 References 섹션에.

    익명 인증을 사용하도록 IIS를 구성하십시오.

    익명 인증을 사용하도록 IIS를 구성하려면 다음 이 단계를 수행하십시오.

    1. IIS에서 서버의 컴퓨터 노드를 확장하고, 웹 사이트 를 확장한, 기본 웹 사이트 를 확장합니다. 그리고 FormsAuthAd, 마우스 오른쪽 단추로 클릭한 다음 속성 을 클릭하십시오.
    2. 디렉터리 보안 탭 을 클릭한 다음 익명 액세스 및 인증 제어에서편집 을 누릅니다.
    3. 응용 프로그램에 대한 익명 계정을 Active Directory 사용 권한을 가진 계정을 확인하십시오.
    4. 제어 암호 받는 IIS 허용 확인란의 선택을 취소하십시오.
    5. “ 인증된 액세스 ” 섹션에서 “ Windows 통합 인증 ” 확인란의 선택을 취소하십시오.
    6. 확인을 클릭하십시오.
    7. 적용을 클릭합니다.

    기본 IUSR_ computername 계정은 Active Directory 권한이 없습니다.

    Logon.aspx 페이지로 만들기

    새 ASP.NET Web Form Logon.aspx 명명된 만들려면 다음과 같이 하십시오.

    1. 솔루션 탐색기에서 프로젝트 노드를 마우스 오른쪽 단추로, 추가 를 가리킨 다음 Web Form 추가 누릅니다.
    2. Logon.aspx이름 상자에 입력한 다음 열기 를 클릭하십시오.
    3. 솔루션 탐색기에서 Logon.aspx, 마우스 오른쪽 단추로 클릭한 다음 디자이너 보기를 클릭하십시오.
    4. 디자이너에서 HTML 탭을 클릭하십시오.
    5. Replace the existing code with the following code.
      <%@ Page language="c#" AutoEventWireup="true" %>
      <%@ Import Namespace="FormsAuth" %>
      <html>
        <body>	
          <form id="Login" method="post" runat="server">
            <asp:Label ID="Label1" Runat=server >Domain:</asp:Label>
            <asp:TextBox ID="txtDomain" Runat=server ></asp:TextBox><br>    
            <asp:Label ID="Label2" Runat=server >Username:</asp:Label>
            <asp:TextBox ID=txtUsername Runat=server ></asp:TextBox><br>
            <asp:Label ID="Label3" Runat=server >Password:</asp:Label>
            <asp:TextBox ID="txtPassword" Runat=server TextMode=Password></asp:TextBox><br>
            <asp:Button ID="btnLogin" Runat=server Text="Login" OnClick="Login_Click"></asp:Button><br>
            <asp:Label ID="errorLabel" Runat=server ForeColor=#ff3300></asp:Label><br>
            <asp:CheckBox ID=chkPersist Runat=server Text="Persist Cookie" />
          </form>	
        </body>
      </html>
      <script runat=server>
      void Login_Click(Object sender, EventArgs e)
      {
        String adPath = "LDAP://corp.com"; //Fully-qualified Domain Name
        LdapAuthentication adAuth = new LdapAuthentication(adPath);
        try
        {
          if(true == adAuth.IsAuthenticated(txtDomain.Text, txtUsername.Text, txtPassword.Text))
          {
            String groups = adAuth.GetGroups();
      
            //Create the ticket, and add the groups.
            bool isCookiePersistent = chkPersist.Checked;
            FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket(1,  txtUsername.Text,
      	DateTime.Now, DateTime.Now.AddMinutes(60), isCookiePersistent, groups);
      	
            //Encrypt the ticket.
            String encryptedTicket = FormsAuthentication.Encrypt(authTicket);
      		
            //Create a cookie, and then add the encrypted ticket to the cookie as data.
            HttpCookie authCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket);
      
            if(true == isCookiePersistent)
      	authCookie.Expires = authTicket.Expiration;
      				
            //Add the cookie to the outgoing cookies collection.
            Response.Cookies.Add(authCookie);		
      
            //You can redirect now.
            Response.Redirect(FormsAuthentication.GetRedirectUrl(txtUsername.Text, false));
          }
          else
          {
            errorLabel.Text = "Authentication did not succeed. Check user name and password.";
          }
        }
        catch(Exception ex)
        {
          errorLabel.Text = "Error authenticating. " + ex.Message;
        }
      }
      </script>
    6. LDAP 디렉터리 서버를 가리키도록 Logon.aspx 페이지로 경로를 수정하십시오.

    Logon.aspx 페이지로 사용자 및 호출 메서드를 LdapAuthentication 클래스에 대한 정보를 수집하는 페이지입니다. 코드의 사용자를 인증하고 그룹 목록을 가져오는 코드를 FormsAuthenticationTicket 개체를 만듭니다. 그리고 티켓을 암호화합니다. 그리고 암호화된 티켓을 데 쿠키를 추가합니다. 그리고 쿠키가 HttpResponse.Cookies 컬렉션에 추가합니다 후 다음 원래 요청된 URL로 요청을 리디렉션합니다.

    WebForm1.aspx 페이지를 수정합니다

    WebForm1.aspx 페이지를 처음 요청한 페이지입니다. 사용자가 이 페이지를 요청하면 Logon.aspx 위해 요청을 리디렉션할 페이지의. 요청이 인증된 후 요청은 WebForm1.aspx 페이지로 리디렉션됩니다.

    1. 솔루션 탐색기 에서 WebForm1.aspx 를 마우스 오른쪽 단추로 클릭한 다음 디자이너 보기를 클릭하십시오.
    2. 디자이너에서 HTML 탭을 클릭하십시오.
    3. 기존 코드를 다음 code.
      <%@ Page language="c#" AutoEventWireup="true" %>
      <%@ Import Namespace="System.Security.Principal" %>
      <html>
        <body>	
          <form id="Form1" method="post" runat="server">
            <asp:Label ID="lblName" Runat=server /><br>
            <asp:Label ID="lblAuthType" Runat=server />
          </form>	
        </body>
      </html>
      <script runat=server>
      void Page_Load(Object sender, EventArgs e)
      {
        lblName.Text = "Hello " + Context.User.Identity.Name + ".";
        lblAuthType.Text = "You were authenticated using " +   Context.User.Identity.AuthenticationType + ".";
      }
      </script>
      					
    4. 모든 파일을 저장하고 프로젝트를 컴파일하십시오.
    5. WebForm1.aspx 페이지를 요청하십시오. 알 수 Logon.aspx 리디렉션됩니다.
    6. 로그온 자격 증명을 입력한 다음 제출 을 클릭하십시오. WebForm1.aspx 위해 리디렉션할 때 사용자 이름이 나타나는지 확인합니다 및 LdapAuthentication 인증 있는지 Context.User.AuthenticationType 속성을 입력합니다.

    참고 SSL (Secure Sockets Layer) 사용하는 것이 좋습니다 Forms 인증을 사용할 때 암호화. 인증 쿠키를 기반으로 사용자가 식별되기 때문에 이 응용 프로그램에 SSL 암호화를 누구나 인증 쿠키와 전송되는 기타 유용한 정보를 손상시키지 못하도록 방지할 수 있습니다.


    ----====  참조  ====----

    자세한 내용은 Microsoft 기술 자료에 있는 문서를 보려면 다음 문서 번호를 클릭하시기 바랍니다:
    306590  (http://support.microsoft.com/kb/306590/ ) ASP.NET 보안 개요
    317012  (http://support.microsoft.com/kb/317012/ ) ASP.NET 에서 프로세스 및 요청 ID
    311495  (http://support.microsoft.com/kb/311495/ ) Visual C# .NET을 사용하여 ASP.NET 응용 프로그램에서 폼 기반 인증 가진 역할 기반 보안을 구현하는 방법
    313091  (http://support.microsoft.com/kb/313091/ ) Forms 인증 사용하기 위해 Visual Basic .NET을 사용하여 키를 만드는 방법
    313116  (http://support.microsoft.com/kb/313116/ ) 폼 인증 요청은 loginUrl 페이지에 지정됩니다.

    본 문서의 정보는 다음의 제품에 적용됩니다.
    • Microsoft Visual C# .NET 2003 Standard Edition
    • Microsoft Visual C# .NET 2002 Standard Edition
    • Microsoft ASP.NET 1.1


    Posted by SB패밀리