Day29
25558 ワード
Day29
1.変換を理解し実現する.
2.lockの概念が理解できる.
3.Oracleのプロセスを設計および説明できます.
4.PL/SQL文法を理解し、基本文法と設計を学ぶ.
質問する
Q1.≪トランザクション|Transaction|emdw≫:データの一貫性を維持するための論理的関連タスクのセット.
1)COMMIT/ROLLBACKコマンド実行時のタイプ
2)DDL構文実行時終了->AUTO COMMIT
3)SQL*PLUS OR DBSERVER異常終了時->AUTO ROLLBACK(バックアップなし)
COMMIT(保存):変更されたデータ(挿入、削除、更新)を保存し、トランザクションを終了するコマンド
ROLLBACK(キャンセル):トランザクションの変更をキャンセルして終了するコマンド
デフォルトでは、データ・ステータスはトランザクションの開始点に復元されます.
SAVEPOINT savepoint name:トランザクションの特定の時点を記録するコマンド
ROLLBACK TO savepoint name:指定された時点でデータ状態を回復できる
変更をデータベース(ファイル)に保存して反映
すべてのユーザーに同じ結果が表示されます.
同じ行に対して異なる変更を行うことができます.
これまでに設定したすべてのsavepointが消えます
rollback :
データ移行ステータスに復元します.
同じ行に対して他の変更を加えることができます
これまでに設定したsavepointはすべて消えます.
トランザクションデータ
1)他のユーザは、動作中のDMLの結果を表示できない.
2)処理中のローに対して他の変更はできません
Q2.トランザクションとデータのステータスを確認します.
ALTER TABLE EMPLOYEE
DISABLE CONSTRAINTS FK_MGRID;
SAVEPOINT S0;
ALTER TABLE DEPARTMENT
DROP COLUMN MGR_ID;
ALTER TABLE DEPARTMENT
DROP COLUMN MGR_ID02;
INSERT INTO DEPARTMENT VALUES('40','기획전략팀','A1');
SAVEPOINT S1;
UPDATE EMPLOYEE SET DEPT_ID ='40'
WHERE DEPT_ID IS NULL;
SAVEPOINT S2;
DELETE FROM EMPLOYEE;
ROLLBACK TO S2; -- SAVEPONT S2 를 롤백시킨다.
SELECT COUNT(*) FROM EMPLOYEE; --22개
SELECT COUNT(*) FROM EMPLOYEE
WHERE DEPT_ID = '40';
ROLLBACK TO S1;
SELECT COUNT(*) FROM DEPARTMENT
WHERE DEPT_ID ='40'; --1
40번 사원 테이블도 확인
ROLLBACK TO S0;
1,2번 확인
ROLLBACK
Q3.同期LOCK:複数のユーザが同じデータに同時にアクセスして変更を試みることを許可する整合性を確保するために同期を制御する必要があります
データ同期制御技術の特徴
1)異なるユーザー(異なるトランザクション)が同時に同じローを変更しないようにする
2)他のユーザー(他の取引)がCOMMITを経ていない変更を書き換えることを防止する
3)取引実行中の自動実行/メンテナンス/管理
セッション1
SELECT EMP_NAME,
MARRIAGE
FROM EMPLOYEE
WHERE EMP_ID = '143';
UPDATE EMPLOYEE
SET MARRIAGE = 'N'
WHERE EMP_ID ='143';
MARRIAGEをNに変更
セッション2
SELECT EMP_NAME,
MARRIAGE
FROM EMPLOYEE
WHERE EMP_ID = '143';
UPDATE EMPLOYEE
SET MARRIAGE ='N'
WHERE EMP_ID='143';
セッション1はMARRIAGEをNに変更しますが、COMMIT OR ROLLBACKはありません.LOCKが必要で、COMMIT ORROLLBACKはLOCKを解放してUPDATEを実行することができます.
✨
データ型/変数と定数/演算子/標準I/O/制御文の繰り返し、選択、分岐文/関数、プロシージャ(Xを返す)メソッド(OOP)ファイルI/O
IF条件THENコマンド
ELSIF THEN
ELSE
END IF;
Q3.点数の単位をA~FでIF文と表す.
DECLARE
score01 int := 85;
grade01 varchar2(2);
BEGIN
IF score01 >= 90 THEN grade01 :='A';
ELSIF score01 >=80 THEN grade01 :='B';
ELSIF score01 >=70 THEN grade01 :='C';
ELSIF score01 >=60 THEN grade01 :='D';
ELSE grade01 :='F';
END IF;
DBMS_OUTPUT.PUT_LINE('SCORE '||score01||',GRADE ='||grade01);
END;
Q4.'洪吉童1'3回出力DECLARE
NAME VARCHAR2(10) :='홍길동';
I INT :=0;
BEGIN
FOR I IN 1..3 LOOP
DBMS_OUTPUT.PUT_LINE(NAME||I);
END LOOP;
END;
Q5.テーブルを作成し、クエリーを繰り返し、資料を入れます.CREATE TABLE TEST01(
NO NUMBER(3),
IRUM VARCHAR2(10));
DECLARE
BEGIN
FOR I IN 1..10 LOOP
INSERT INTO TEST01 VALUES(I,SYSDATE);
END LOOP;
END;
Q6.ググダンは嫌いだけどやってみよう奇数段だけ出力しよう
DECLARE
TOTAL NUMBER := 0;
BEGIN
FOR I IN 2..9 LOOP
IF MOD(1,2) != 0 THEN DBMS_OUTPUT.PUT_LINE(I || '단');
FOR J IN 1..9 LOOP
TOTAL := I*J;
DBMS_OUTPUT.PUT_LINE(I||'*'||J||'='||TOTAL);
END LOOP;
END IF;
END LOOP;
END;
Q7.EMPテーブルでは、匿名のブロックを作成し、10番の従業員の平均賃金を出力します.EX)OOO部門の平均賃金は00元です.
DECLARE
MY_AVG NUMBER(7,2) :=0;
MY_DEPTNO NUMBER(7) :=10; --MY_DEPTNO EMP.DEPTNO%TYPE :=10;
BEGIN
SELECT AVG(SAL) INTO MY_AVG
FROM EMP
WHERE DEPTNO = MY_DEPTNO
GROUP BY DEPTNO;
DBMS_OUTPUT.PUT_LINE(MY_DEPTNO ||'부서의 평균 급여는['||MY_AVG||']원 입니다');
END;
Q8.EMP表では、20番部門の個数、平均賃金を見つけます.EX)OOO部門の平均賃金はOOで、従業員数はOOです.
DECLARE
MY_AVG NUMBER(7,2) :=0;
MY_DEPTNO NUMBER(7) :=20;
MY_CNT NUMBER(7) :=0;
BEGIN
SELECT COUNT(*),AVG(SAL) INTO MY_CNT,MY_AVG
FROM EMP
WHERE DEPTNO = MY_DEPTNO
GROUP BY DEPTNO;
DBMS_OUTPUT.PUT_LINE(MY_DEPTNO ||'부서의 평균 급여는['||MY_AVG||']원이고,사원의 수는 '||MY_CNT||'명 입니다');
END;
Q9.ACCEPT:ユーザ入力値を読み出して変数に格納するためのキーワード4番の従業員の名前を印刷します.
ACCEPT inputVal prompt'사번입력:'
DECLARE
NAME1 EMP.ENAME%TYPE;
BEGIN
SELECT ENAME INTO NAME1 FROM EMP
WHERE EMPNO=&inputVal;
DBMS_OUTPUT.PUT_LINE('현재의 결과 : '||NAME1)
END;
Q10.4回入力して100パーセントの給料を増やすCREATE OR REPLACE PROCEDURE UPDATE_SAL(V_empno IN NUMBER)
AS
BEGIN
UPDATE EMP
SET SAL = SAL+100
WHERE EMPNO = V_EMPNO;
COMMIT;
END UPDATE_SAL;
Q11.従業員番号を入力し、従業員番号、従業員名、従業員給与を印刷します.CREATE OR REPLACE PROCEDURE EXAM01 (RES_EMPNO IN EMP.EMPNO%TYPE)
AS
V_EMPNO EMP.EMPNO%TYPE;
V_ENAME EMP.ENAME%TYPE;
V_SAL EMP.SAL%TYPE;
BEGIN
DBMS_OUTPUT.ENABLE;
SELECT EMPNO,ENAME,SAL INTO V_EMPNO,V_ENAME,V_SAL
FROM EMP
WHERE EMPNO = RES_EMPNO;
DBMS_OUTPUT.PUT_LINE('사원의 번호 : '||V_EMPNO);
DBMS_OUTPUT.PUT_LINE('사원의 이름 : '||V_ENAME);
DBMS_OUTPUT.PUT_LINE('사원의 봉급 : '||V_SAL);
END EXAM01;
Q12.関数をバインドします.CREATE FUNCTION GET_MYAVG(V_ID IN EMP.EMPNO%TYPE)
RETURN NUMBER
AS
V_SAL EMP.SAL%TYPE :=0;
V_TOT NUMBER :=0;
V_COMM EMP.COMM%TYPE;
BEGIN
SELECT SAL,COMM INTO V_SAL,V_COMM
FROM EMP
WHERE EMPNO = V_ID;
V_TOT := V_SAL*12 +NVL(V_COMM,0);
RETURN V_TOT;
END;
/
SELECT EMPNO,GET_MYAVG(7934)
FROM EMP;
Reference
この問題について(Day29), 我々は、より多くの情報をここで見つけました https://velog.io/@jahommer/Day29テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol