레이블이 오라클 뷰인 게시물을 표시합니다. 모든 게시물 표시
레이블이 오라클 뷰인 게시물을 표시합니다. 모든 게시물 표시

2013년 10월 23일 수요일

[닷넷4.0, ADO.NET]OleDB Oracle을 이용한 grid select, insert예제 OleDB 공급자를 이용하여 오라클 데이터베이스에 접속했으며 EMP 테이블의 데이터를 읽어 그리드에 채우는 간단한 예제다.

[닷넷4.0, ADO.NET]OleDB Oracle을 이용한 grid select, insert예제
 
OleDB 공급자를 이용하여 오라클 데이터베이스에 접속했으며 EMP 테이블의 데이터를 읽어 그리드에 채우는 간단한 예제다.
 
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.OleDb;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        OleDbConnection conn = null;
        OleDbDataAdapter adapter = null;
        DataSet ds = null;
        
        public Form1()
        {
            InitializeComponent();
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            try
            {
                ds = new DataSet("emp");
//아래 onj는 $ORACLE_HOME/network/admin에 있는 tnsnames.ora 파일에 정의된 이름!
   string conStr = "Provider=MSDAORA;data source=onj;User ID=scott;Password=tiger";
   conn = new OleDbConnection(conStr);
                conn.Open();
                adapter = new OleDbDataAdapter("select * from emp", conn);
                adapter.Fill(ds);
                dataGridView1.DataSource = ds.Tables[0];
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "emp Table Loading Error");
            }
            finally        {
                conn.Close();
            }
        }
    }
}
new라는 클래스 Constructor 키워드를 사용하여, .NET Framework에서 제공하는 클래스 중의 'OleDbConnection'의 인스턴스를 만들면서 string타입의 파라미터(Parameter)를 취다. 그 stirng(접속 문자열)은 바로 윗줄에서 선언 되고 값이 주어졌다. 마지막에는 인스턴스인 Connection의 원래클래스, 즉 OleDbConnection이 멤버로 포함하고 있는 메쏘드 중의 대표적인 Open()을 호출하여 DataBase와 연결을 설정하고 연결을 얻음. 그런다음 어댑터를 하나 만들어 "select" 명령을 실행 시킨 결과 DataSet으로 fill 시키고  DataGrid의 Datasource로 ds.Tables[0]을 지정했다.
 
 
[간단한 입력 예제, 오라클 scott계정의 EMP Table에 한건의 데이터를 간단히 입력]
 
public partial class Form1 : Form
    {
        OleDbConnection conn = null;
        OleDbDataAdapter adapter = null;
        DataSet ds = null;
        
        public Form1()
        {
            InitializeComponent();
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            try
            {
                ds = new DataSet("emp");
                //아래 onj는 $ORACLE_HOME/network/admin에 있는 tnsnames.ora 파일에 정의된 이름!
                string conStr = "Provider=MSDAORA;data source=onj;User ID=scott;Password=tiger";
                conn = new OleDbConnection(conStr);
                conn.Open();
                OleDbCommand command = new OleDbCommand("insert into emp(empno, ename) values(777, '오라클자바')", conn);
                command.ExecuteNonQuery();
                adapter = new OleDbDataAdapter("select * from emp where ename='오라클자바'", conn);
                adapter.Fill(ds);
                dataGridView1.DataSource = ds.Tables[0];
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "emp Table Loading Error");
            }
            finally
            {
                conn.Close();
            }

        }
    }

오라클자바커뮤니티에서 설립한 개발자교육6년차 오엔제이프로그래밍 실무교육센터(오라클SQL,튜닝,힌트,자바프레임워크,안드로이드,아이폰,닷넷 실무개발강의)  



[개강확정강좌]오라클자바커뮤니티에서 운영하는 개발자 전문교육 ,개인80%환급(www.onjprogramming.co.kr)




[해당 카테고리로 이동합니다]

2013년 10월 3일 목요일

오라클 사용자의 비밀번호 변경하기

오라클에서 사용자 비밀번호 변경하기...

사용자의 비밀번호를 변경하는 방법은 alter user를 통해 하는 방법과  SQL*Plus로 로그온 한 상태에서 password 를 입력 함으로서 (Unib/Linux에서 사용자 비밀번호 변경과 비슷하게) 변경이 가능 합니다. 

아래의 실습을 보고 이해 하도록 하죠... 


SQL> connect scott/tiger
연결되었습니다.

SQL> password
SCOTT에 대한 암호를 변경합니다
이전 암호: *****                  <-- tiger
새로운 암호: **                    <-- t1
새 암호 다시 입력: **            <-- t1
암호가 변경되었습니다

SQL> connect scott/tiger
ERROR:
ORA-01017: invalid username/password; logon denied


경고: 이제는 ORACLE에 연결되어 있지 않습니다.
SQL> connect scott/t1
연결되었습니다.
SQL> alter user scott identified by tiger;

사용자가 변경되었습니다.

SQL> connect scott/t1;
ERROR:
ORA-01017: invalid username/password; logon denied


경고: 이제는 ORACLE에 연결되어 있지 않습니다.
SQL> connect scott/tiger
연결되었습니다. 

라클자바커뮤니티에서 설립한 개발자교육6년차 오엔제이프로그래밍 실무교육센터
(오라클SQL,튜닝,힌트,자바프레임워크,안드로이드,아이폰,닷넷 실무개발강의)  





2013년 8월 9일 금요일

[오라클자바, 강좌, 교육, ORACLEJAVA, OnjProgramming]Oracle Number Data Type에 관해

========================
Number Data Type
========================

 
오라클자바커뮤니티에서 설립한 오엔제이프로그래밍 실무교육센터
(오라클SQL, 튜닝, 힌트,자바프레임워크, 안드로이드, 아이폰, 닷넷 실무전문 강의)  



1. 고정숫자와 부동 소수점 숫자를 저장한다.

2. Oracle을 작동하는 서로 다른 시스템간에 38자 까지 정밀도를 유지하며 호환가능

3. 최대 38자리의 유효숫자를 가지는 양수/음수,0 등이 저장된다.

4. Column_name Number;Column_name Number(precision, scale)등의 형식으로 선언한다.
- Scale을 지정하지 않으면 0
- precision에 ‘*’를 표시하면 38
- 숫자필드를 지정할 때 정밀도와 Scale을 지정하는것이 좋음
- 7,456,123.89의 숫자가 있을 때 number로 선언하면 7456123.89로 저장
- 7,456,123.89의 숫자가 있을 때 number(*,1)로 선언하면 7456123.9로 저장
- 7,456,123.89의 숫자가 있을 때 number(9)로 선언하면 7456124로 저장
- 7,456,123.89의 숫자가 있을 때 number(9,2)로 선언하면 7456123.89로 저장
- 7,456,123.89의 숫자가 있을 때 number(6)로 선언하면 오류

5. Number형의 Column길이 계산방법
- Oracle은 numeric data를 가변 길이 포맷으로 저장한다. 각 값은 scientific notation으로
저장된다.(1 byte used to store exponent and up to 20 bytes to store mantissa) Oracle은
앞뒤의 0을 저장하지 않는다.
-  즉 1 Byte는 지수를 저장하며, 최대 20 Byte가 가수를 저장하는데 사용된다.(정밀도는 
  최대 38) 또한 선행하는 0이나,후행하는 0은 저장하지 않는다. 예를들면 숫자 412는
  4.12 * 10^2과 유사한 형식으로 저장된다.

  즉 1 Byte가 지수2를 저장하는데 사용되며, 2 Byte가 가수 (4,1,2)를 저장하는데 사용
  된다.

  이를 이용하여 Number(p)에 대한 Column의 Byte계산이 가능하다.
  1 Byte(지수) + floor(p/2) + 1 Byte(가수) + 1 Byte(음수)

6. 정수부분과 소수부분을 구분하는 소수점문자(.)를 변경할려면
  NLS_NUMERIC_CHARACTERS Parameter를 변경해야 한다.

7.특히 주의할 사항은 소수점 이하는 반올림되어 저장된다는 사실을 감안하여 수치 연산이 많은
경우 이를 고려하여 소숫점이하 크기를 결정하여야 한다.

8.오라클에서는 원래의 데이타를 다른 타입의 데이타로 바꾸기위해 아래와 같은 여러가지 함수를
제공한다. TO_NUMBER(), TO_CHAR(), TO_DATE(), HEXTORAW(), RAWTOHEX(),
  ROWIDTOCHAR(), CHARTOROWID()을 이용하여 명시적으로 데이타 타입을 변경을 할 수 있을 뿐
아니라 값 지정(assignment)시 오라클은 자동적으로 변환 작업을 수행하고, 문장(expression)
내에서도 자동적으로 연산을 수행하기 위해 타입 변환을 수행한다. 

9.숫자 타입과 문자 타입의 값과 비교되면 상대 타입을 숫자 타입으로 바꾸어 비교된다.
예를 들어 NUM1이 NUMBER 타입이고 인덱스가 생성되어 있을때 아래의 쿼리문을 수행하게 되면
    SELECT * FROM TABLE1 WHERE NUM1 = '123';  일 경우
내부적으로 위의 문장은 문자 타입의 변환이 발생함으로 위의 문장은 아래와 같이 변동되어 처리
된다.
  SELECT  * FROM TABLE1 WHERE NUM1 = TO_NUMBER('123');
  로 변동 되어 처리 되므로 인덱스를 사용하게 된다.

10.NUMBER 타입으로 지정된 컬럼을 LIKE 'char%'로 비교하면 인덱스를 사용하지 않으므로 주의
하여야 한다.

    SELECT * FROM TABLE1 WHERE NUM1 LIKE '1%';
 
  을 수행하게 되면 일단 숫자 타입을 기준으로 '1%'을 바꾸려고 하지만 LIKE문으로 인해 숫자
타입으로 변경할 수 가없다. 따라서 NUM1이 문자 타입으로 변경된다.
  즉, 내부적으로

    SELECT * FROM TABLE1 WHERE TO_CHAR(NUM1) LIKE '1%';

  로 변형이 일어나 수행하게 되므로서 수행 속도 향상에 주요한 인자가 되는 인덱스를 사용할
수 없게 된다. 따라서 가능한한 인덱스를 생성할 컬럼은 문자 타입이 효과적이다.

2013년 8월 4일 일요일

Oracle View...(오라클 뷰)

A. . 정의
- View는 하나 이상의 Table또는 다른 View에 포함된 데이터를 원하는대로 나타낸 것
- View는 내장질의또는 가상 Table등으로 표현할수 있다.
- View는 Table에서 파생되므로 둘사이에는 많은 유사성이 있다. 예를들어 Table과 같이 최대
254개의 Column이 있는 View를 정의할수 있고 뷰를 질의하고 몇가지 제한 사항을 사용하여 뷰를
갱신,삽입,삭제를 할수있다.  뷰에대해 수행되는 모든 작업은 뷰의 기본 Table에 있는 Data에
실제 영향을 주며 기본 Table의 무결성 제약조건과 트리거를 따른다.
- 뷰에는 저장영역이 할당되지 않으며 실제로 Data를 포함하지도 않는다.
B. 처리방법
- Oracle은 View를 정의하는 질의 Text를 Data Dictionary(user_views)에 저장한다,
- Oracle은 기존공유 SQL영역에 동일한 멸령이 들어있지 않을때만 새로운 공유 SQL영역에 뷰를
참조하는 명령문을 Parsing합니다. 따라서 뷰를 사용시 공유 SQL영역과 관련하여 메모리 사용이
감소하는 이익이 있다.
- Oracle은 원래 질의를 뷰정의 질의와 병합할 때 원래 뷰를 변형하여 뷰에 대한 질의에 인덱스를
사용할지를 결정한다.

Create view emp_view as
    Select emp_no, ename, sal, loc
    From emp
    Where emp.deptno = dept.deptno
    And dept.deptno = 10;

<사용자 Query>
select ename from emp_view
where empno = 9876;


select ename
from emp, dept
where emp.deptno = dept.deptno
and  dept.deptno = 10
and  emp.empno = 9876;

Oracle은 가능한 모든 경우에 뷰에대한 질의를 뷰정의 질의 및 기본뷰 질의와 병합한다. 또한 뷰를
참조하지않고 질의를 발생하는 것 처럼 병합된 질의를 최적화한다.
따라서 Column이 뷰 정의 또는 뷰에대한 사용자정의에서 참조되는지의 여부에 관계없이 모든 참조된
기본 Table의 Column에 대한 Index를 사용한다.
만약 뷰에대한 정의와 사용자 질의를 병합할수 없다면 Index를 사용하지 않을수 있다.

C. 갱신가능한 Join View
- Join View란 From절에 하나이상의 Table또는 View를 가지며, Distinct, group by, start with,
connect by, rownum, union all, intersect, for update등의 절에서는 사용하지 않는다.

- 갱신가능한 Join View는 둘이상의 기본 Table 및 View를 포함하며 Update/Insert/Delete등의
작업이 가능하다.

- Dictionary View인 all_updatable_columns,윰_updatable_columns, user_updatable_colums
에는 갱신가능한 View의 Column을 나타낸다.

- Join View에 대한 Insert/Update/Delete등의 작업은 한번에 하나의 기본 Table에서만 가능하며,
With Check Option을 사용하여 View를 정의하는 경우에는 반복된 Table의 모든 Join Column과 모
든 Column은 갱신할수 없으며, Insert명령문은 허용되지 않는다.또한 with Check Option을
사용하여 뷰를 정의하고 키예약 Table이 반복되는 경우에는 뷰에서 행을 삭제할수 없다.

D. View생성
 - Create View명령을 사용한다.
예] create view sales_staff as
      select empno, ename, deptno
      from emp
      where deptno =10
      with check option constraint sales_staff_cnst;

    위에서 check option은 뷰가 선택할수 없는 행에 대해서는 Insert와 Update명령문이
    실행되지 않는다는 제약 조건을 갖는다.
    만약 위의 View에 deptno가 30인 행을 Insert하려고 하면 RollBack되고 오류가 발
    생한다.
E. View수정하기
위에서 만든 staff View를 재정의 하는경우
create or replace view sales_staff_view as
      select empno, ename, deptno
      from emp
      where deptno =30
      with check option constraint sales_staff_cnst;
F. View의 삭제
 - drop view sales_staff_view; 

[출처] 오라클자바커뮤니티, 오엔제이프로그래밍