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(デフォルト省略)
:ビューを作成するときは、サブクエリで説明されているテーブルが必要です.
: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;
シーケンス名.NEXTBAL:シーケンス値の増加とシーケンス値の増加
既存シーケンス値の増分BY値と同じ増分値
==シーケンス名.CURRVAL+INCREMENT BY値
=>ただし、シーケンス作成後の最初のNEXTBALはSTRAT WITHで指定された開始値で励起されます.
-->一度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は変更不可!=>本当に変更したい場合は、削除して再生成します.
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)
:内部プログラム言語
PL/SQL構造
:DECLAREで始まる変数または定数を宣言および初期化する部分
=>
: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;/
Reference
この問題について(21.2.16(火)DB/TCL(2)、PL(SQL)(1)), 我々は、より多くの情報をここで見つけました https://velog.io/@alsrnr45/21.2.16화-DBTCL2テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol