21.2.16(火)DB/TCL(2)、PL(SQL)(1)


VIEWオプション


[詳細表示]
CREATE(FORCE|"NOFORCE")VIEWビュー名
ASサブクエリ
(WITH CHECK OPTION)
(WITH READ ONLY)
1) OR REPLACE
:ビューが存在しない場合は、新しいビューを作成/存在する場合はオプションを更新します.
2) FORCE/NOFORCE

  • FORCE
    :サブクエリに記述されているテーブルが存在しない場合でも、ビューを作成します.

  • NOFORCE(デフォルト省略)
    :ビューを作成するときは、サブクエリで説明されているテーブルが必要です.
  • 3) WITH CHECK OPTION
    :DMLはサブクエリ条件に記述された値のみです.
    (条件を満たさない値に変更中にエラー)
    4) WITH READ ONLY
    :ビューのみ表示可能(DMLはサポートされていません)

    SEQUENCE


    <シーケンスSEQUENCE>
    自動番号付け機能を持つオブジェクト
    整数値の自動生成
    EX)会員番号、4番、投稿番号などのカラー番号を主に使用します
  • シーケンスオブジェクト生成文[表現]
    CREATE SEQUENCEシーケンス名
    [START WITH開始数]-->最初の励起の開始値を指定
    [INCREMENTBY増分値]-->増加する量を指定
    [MAXVALUE最大]-->最大値の指定
    ループ値を指定するかどうか[CYCLE|NOCYCLE]-->
    [CACHEバイトサイズ|NOCACHE]->キャッシュの有無を指定
  • キャッシュ:事前に励起された値を作成して保存するスペース
    呼び出すたびに番号を再生成するよりも
    事前に生成された値をキャッシュ領域に書き込むと、より高速になります.
    ただし、切断後に再接続すると、以前に生成する値は消失し、
  • となる.
    表名:TB
    ビュー名:VW
    シーケンス名:SEQ
    トリガー名:TRG
    CREATE SEQUENCE SEQ_TEST ;
    SELECT * FROM USER_SEQUENCE; -- この勘定科目が所有するシーケンスを表示する情報
    -- USER_TABLES, USER_VIEWS
    CREATE SEQUENCE SEQ_EMPNO
    START WITH 300
    INCREMENT BY 5
    MAXVALUE 310
    NOCYCLE
    NOCACHE;
  • シーケンスは、構文シーケンス名を使用します.CURRVAL:現在のシーケンスの値
    シーケンス名.NEXTBAL:シーケンス値の増加とシーケンス値の増加
    既存シーケンス値の増分BY値と同じ増分値
    ==シーケンス名.CURRVAL+INCREMENT BY値
    =>ただし、シーケンス作成後の最初のNEXTBALはSTRAT WITHで指定された開始値で励起されます.
  • SELECT SEQ_EMPNO.CURRVAL FROM DUAL;
    -->一度NEXTVALを実行しない限りCURRVALは実行できません!
    -->なぜ?CURRVALは、前回正常に実行されたNEXTBALの値を格納する一時値です.
    SELECT SEQ_EMPNO.NEXTVAL FROM DUAL; --> 300
    SELECT SEQ_EMPNO.CURRVAL FROM DUAL;
    SELECT SEQ_EMPNO.NEXTVAL FROM DUAL; --> 305
    SELECT * FROM USER_SEQUENCES;
    SELECT SEQ_EMPNO.CURRVAL FROM DUAL;
  • シーケンス変更[表現]
    ALTER SEQUENCEシーケンス名
    (増分BY増分)
    (MAXVALUE最大値)
    (MINVALUE最小値)
    (CYCLE } NOCYCLE)
    (CACHEバイトサイズ|NOCACHE)**START WITHは変更不可!=>本当に変更したい場合は、削除して再生成します.
  • ALTER SEQUENCE SEQ_EMPNO
    INCREMENT BY 10
    MAXVALUE 400;
    SELECT * FROM USER_SEQUENCES;
    SELECT SEQ_EMPNO.NEXTVAL FROM DUAL; -- 320
    --SEQUENCEの削除
    DROP SEQUENCE SEQ_EMPNO;
    --新しい4回目のシーケンスを作成
    CREATE SEQUENCE SEQ_EID
    START WITH 300;
    --従業員の追加時に実行するINSERT文
    INSERT INTO EMPLOYEE(EMP_ID, EMP_NAME, EMP_NO, JOB_CODE, HIRE_DATE)
    VALES(SEQ EID.NEXTVAL、「洪吉童」、「910816-1209331」、「J 2」、SYSDATE);
    INSERT INTO EMPLOYEE(EMP_ID, EMP_NAME, EMP_NO, JOB_CODE, HIRE_DATE)
    VALES(SEQ EID.NEXTVAL、「洪吉女」、「910816-220931」、「J 3」、SYSDATE);
    --従業員に要求を追加するときに実行するSQL文
    INSERT
    INTO EMPLOYEE
    (
    EMP_ID
    , EMP_NAME
    , EMP_NO
    , JOB_CODE
    , HIRE_DATE
    )
    VALUES
    (
    SEQ_EID.NEXTVAL
    , ?/ユーザーが入力した値/
    , ?/ユーザーが入力した値/
    , ?/ユーザーが入力した値/
    , SYSDATE
    )

    PL/SQL (PROCUDURE LANGUAGE EXTENSION TO SQL)


    :内部プログラム言語
  • 変数定義、条件処理(IF)、繰返し処理(LOOP、FOR、WHILE)など、SQLの不足を補う
  • 複数のSQL文(BLOCK構造)
  • を同時に実行できます.

    PL/SQL構造

  • 宣言(DECLARE SECTION)
    :DECLAREで始まる変数または定数を宣言および初期化する部分
    =>
  • は省略可能
  • 実行部(EXECUTALBE SECTION)
    :BEGINで始まるSQL文や制御文(条件文、重複文)などの論理を記述する部分
    =>
  • は省略できません
  • 異常処理部
    :EXCEPTIONの先頭に、例外が発生した場合に実行する構文が表示されます.
    =>
  • は省略可能
    -- 간단하게 화면에 HELLO ORACLE 출력
    SET SERVEROUTPUT ON
    BEGIN 
        -- System.out.println("hello oracle")와 같음;
        DBMS_OUTPUT.PUT_LINE('HELLO ORACLE');
    END;
    /

    1)DECLARE宣言


    :変数と定数を宣言するスペース(宣言と同時に初期化可能)
    一般型変数、参照型変数、ROW型変数

    (1)-1通常型変数の宣言と初期化


    [表現]
    変数名(CONSTANT)データ型(:=値);
    DECLARE 
        EID NUMBER;
        ENAME VARCHAR2(20);
        PI CONSTANT NUMBER := 3.14;
    BEGIN 
       --  EID := 800;
       -- ENAME := '배장남';
       
       -- 사용자에게 입력받은 값 출력하기
        EID := &사번;
        ENAME := '&이름';
        DBMS_OUTPUT.PUT_LINE('EID:' || EID );
        DBMS_OUTPUT.PUT_LINE('ENAME:' || ENAME );
        DBMS_OUTPUT.PUT_LINE('PI:' || PI );
    END;
    /

    (1)-2レポートタイプ変数の宣言と初期化(現在存在する特定のカラムのデータ型として指定)


    [表現]
    変数名テーブル名.列名%TYPE;
    
    DECLARE 
        EID EMPLOYEE.EMP_ID%TYPE;
        ENAME EMPLOYEE.EMP_NAME%TYPE;
        SAL EMPLOYEE.SALARY%TYPE;
    BEGIN
        /*
        EID := '200';
        ENAME := '선동일';
        SAL := 8000000;
        */
        -- 사번이 200인 사원의 사번, 이름, 급여
        SELECT EMP_ID , EMP_NAME , SALARY 
        INTO EID, ENAME, SAL -- 셀렉한 결과값을 변수값에 담고싶다면 INTO 붙여서 이렇게 하기! 
        FROM EMPLOYEE
        -- WHERE EMP_ID = '200';
        WHERE EMP_ID = &사번; -- 입력받은 값으로 조회하기
        -- WHERE DEPT_CODE = '&부서코드'; 
        => 오류남 !! 
           왜? SELECT INTO를 이용해서 조회결과를 변수에 담고자 한다면 반드시 한 행으로 조회되어야 함!
        
        DBMS_OUTPUT.PUT_LINE('EID:' || EID );
        DBMS_OUTPUT.PUT_LINE('ENAME:' || ENAME );
        DBMS_OUTPUT.PUT_LINE('SAL:' || SAL );
    END;
    /
    ---実習問題
    /*
    EID、ENAME、JCODE、SAL、DTITLEを参照入力変数として宣言します.
    各データ型は、EMPLOYEのEMP ID、EMP NAME、JOB CODE、SALARY/DEPARTMENTのDEPT TITLE列のデータ型を参照する.
    대체변수로 입력한 사원명과 일치하는 사원을 조회해서 각 변수에 대입 후 출력
    */
    DECLARE
    EID EMPLOYEE.EMP_ID%TYPE;
    ENAME EMPLOYEE.EMP_NAME%TYPE;
    JCODE EMPLOYEE.JOB_CODE%TYPE;
    SAL EMPLOYEE.SALARY%TYPE;
    DTITLE DEPARTMENT.DEPT_TITLE%TYPE;
    BEGIN
    SELECT EMP_ID, EMP_NAME, JOB_CODE, SALARY, DEPT_TITLE
    INTO EID, ENAME, JCODE, SAL, DTITLE
    FROM EMPLOYEE
    JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID)
    WHERE EMP NAME="&社員名";
    DBMS_OUTPUT.PUT_LINE(EID || ', ' || ENAME || ', ' || JCODE || ', ' || SAL || ', ' || DTITLE);
    END;
    /
    /*
    1 3)ROWタイプ変数
    テーブル内のローのすべてのカラム値を含む変数.
         [표현법] 변수명 테이블명%ROWTYPE;
    */
    DECLARE
    E EMPLOYEE%ROWTYPE;
    BEGIN
    SELECT *
    INTO E
    FROM EMPLOYEE
    --WHERE EMP_ID = 201;
    WHERE EMP NAME="&社員名";
    --DBMS_OUTPUT.PUT_LINE(E);
    DBMS_OUTPUT.PUT_LINE('사번 : ' || E.EMP_ID);
    DBMS_OUTPUT.PUT_LINE('사원명 : ' || E.EMP_NAME);
    DBMS_OUTPUT.PUT_LINE('급여 : ' || E.SALARY);
    DBMS_OUTPUT.PUT_LINE('연봉 : ' || E.SALARY * 12);
    DBMS_OUTPUT.PUT_LINE('보너스 포함 연봉 : ' || (E.SALARY + E.SALARY * NVL(E.BONUS, 0)) * 12);
    -- 출력문 안에 산술연산식, 함수식 기술 가능
    END;
    /