728x90
반응형
SMALL

분류 전체보기 341

231107 PL/SQL DML TRIGGER, DML ROW TRIGGER

영향을 받은 행이 전혀 없더라도 무조건 한 번 수행되는 트리거 # test table 생성 CREATE TABLE hr.emp AS SELECT employee_id id, last_name name, salary sal, department_id dept_id FROM hr.employees; CREATE OR REPLACE TRIGGER secure_emp BEFORE --타이밍 설정(필수) -- DML 중 하나는 필수적으로 작성 INSERT OR DELETE OR UPDATE ON hr.emp BEGIN IF to_char(sysdate, 'dy') IN ('월', '화') OR to_char(sysdate, 'hh24:mi') BETWEEN '09:30' AND '10:00' THEN -- TRU..

Data Base/PL SQL 2023.11.07

231107 PL/SQL 문제

[문제] 사원들의 신규데이터 또는 급여를 수정할 때 그 사원의 job_id 별 최저 임금에서 최고 임금 사이에 급여값으로만 입력, 수정되어야 합니다. UPDATE hr.employees SET salary = 6000 WHERE employee_id = 115; 에러문구 "ERROE at line 1: ORA-20100 : Invalid salary $6000. Salaries for job PU_CLERK must be between $2500 and $5000" CREATE OR REPLACE TRIGGER hr.sal_trg AFTER INSERT OR UPDATE OF salary ON hr.employees FOR EACH ROW DECLARE v_min NUMBER; v_max NUMBER; ..

문제/SQL 2023.11.07

231106 PL/SQL TRIGGER, FOR EACH ROW(행트리거),조건부술어

■ TRIGGER (트리거) ex) 로그정보, 검색 - 트리거는 데이터베이스에 저장되고 지정된 이벤트에 대한 응답으로 실행되는 PL/SQL 블록이다. - 오라클 데이터베이스는 지정된 조건이 발생할때 트리거를 자동으로 실행한다. - 트리거는 테이블, 뷰, 스키마(소유자), 데이터베이스(모든 유저)에 정의할 수 있다. - CREATE TRIGGER 시스템 권한 필요하다. 익명블록구조이다. # 트리거 유형 ex) 대차대조표 - 특정 테이블, 뷰에 INSERT, UPDATE, DELETE 문 - CREATE, ALTER, DROP 문 - 데이터베이스 시작 또는 종료 - 특정 오류 메시지 또는 임의의 오류 메시지 - 유저 로그인, 로그오프 ; # 트리거 권한 확인 = 'CREATE TRIGGER' SELECT *..

Data Base/PL SQL 2023.11.06

231106 PL/SQL PACKAGE 선언, 지시어, 표준화, PRAGMA

□ 패키지 안에 생성된 명시적 커서 지속상태 -- 필수: 패키지 선언 CREATE OR REPLACE PACKAGE pack_cursor IS PROCEDURE open; PROCEDURE next(p_num IN NUMBER); PROCEDURE close; END pack_cursor; / SPEC 먼저 선언 SELECT * FROM user_source WHERE name = 'PACK_CURSOR'; SELECT * FROM user_objects WHERE object_name = 'PACK_CURSOR'; PACKAGE BODY : 옵션 CREATE OR REPLACE PACKAGE BODY pack_cursor IS /* 패키지 body 변수 private cursor : pack body ..

Data Base/PL SQL 2023.11.06

231106 PL/SQL 복습 겸 문제

[문제] 사원번호를 입력값으로 받아서 사원의 last_name 을 출력해주세요. hit) 패키지: 호출방식, 오버로드화(타입), exception(예외처리), 암시적커서 # 호출방식 execute emp_find.find(100) execute dbms_output.put_line(emp_find.find(100)); select employee_id, emp_find.find(employee_id) from employee_id; 내가 쓴 코드) create or replace package emp_find is type num_tab_type is table of number index by PLS_INTEGER; type var_tab_type is table of varchar2(30) index..

문제/SQL 2023.11.06

231103 PL/SQL PACKAGE, package overloading

■ PACKAGE : 관련성있는 서브프로그램(프로시저, 함수), 변수, DATA TYPE(레코드타입, 데이터타입 등)을 모아놓은 프로그램 - 권한 : CREATE PROCEDURE 1. 글로벌 변수를 선언(표현)해야 할때 2. exception 표준화해야 할때 3. 오버로딩 해야 할때 : 형변화( ex) to_char ) 4. 연관있는프로그램 + 유지관리 # SPEC(필수, 상수:글로벌변수, exception 선언) + BODY(옵션) 1) SPEC(PUBLIC) --OPEN된 소스 + cmd에서도 적용, 선언만(header 부분만) -- BEGIN 절 필수가 아니다. CREATE OR REPLACE PACKAGE comm_pkg --생성자 IS g_comm NUMBER := 0.1; --글로벌 변수 선..

Data Base/PL SQL 2023.11.06

231103 PL/SQL 함수의 부작용, LOCAL SUBPROGRAM

■ 함수의 부작용 - 동일한 TABLE 에 대해서 SELECT, DML 을 수행할 수 없다. CREATE OR REPLACE FUNCTION query_call ( --단일행함수 p_id IN NUMBER ) RETURN NUMBER IS v_sal NUMBER; v_year NUMBER; BEGIN SELECT salary, trunc(months_between(sysdate, hire_date)/12) INTO v_sal, v_year FROM hr.employees WHERE employee_id = p_id ; IF v_year >= 20 THEN RETURN v_sal*1.2; ELSIF v_year =17 THEN RETURN v_sal*1.1; ELSE RETU..

Data Base/PL SQL 2023.11.06

231103 PL/SQL 복습 겸 문제

[문제] 사원번호를 입력값으로 받아서 사번, 이름, 부서 이름을 출력하는 프로시저를 생성하세요. execute id_proc(p_id => 100); CREATE OR REPLACE PROCEDURE id_proc ( p_id IN NUMBER ) IS v_id number; v_name varchar2; v_dept_name varchar2; BEGIN SELECT e.employee_id, e.last_name, d.department_id INTO v_id, v_name, v_dept_name FROM hr.employees e, hr.departments WHERE e.department_id = d.department_id AND employee_id = p_id; dbms_output.put_..

문제/SQL 2023.11.06

231102 PL/SQL 함수(FUNCTION)

■ 함수(function) - 함수는 값을 반환할 수 있는 이름이 있는 PL/SQL 블록이다. - 함수는 값을 계산 할 때 많이 사용하는 서브 프로그램이다. # 프로시저 생성 CREATE OR REPLACE PROCEDURE get_sal ( p_id IN NUMBER, p_sal OUT NUMBER ) IS BEGIN SELECT salary INTO p_sal FROM hr.employees WHERE employee_id = p_id; EXCEPTION WHEN NO_DATA_FOUND THEN NULL; END get_sal; / # 프로시저 호출 DECLARE v_sal NUMBER; BEGIN get_sal(100, v_sal); --프로시저 호출 dbms_output.put_line(v_sa..

Data Base/PL SQL 2023.11.02

231102 PL/SQL 문제

[문제] 사원번호를 입력값으로 받아서 그 사원의 근무 연수를 출력하고 근무 연수가 20년 이상이면 급여를 20% 인상한 급여로 수정, 20년 보다 작고 17년 보다 크거나 같으면 10%인상한 급여로 수정, 17년 미만인 근무자는 아무 작업을 수행하지 않는 프로그램을 작성하세요. (테스트가 끝나면 rollback 합니다.) BEGIN sal_update_proc(100); rollback; END; / 100 사원은 근무 연수가 20년 입니다. 이전 급여는 26400 수정된 급여는 31680 입니다. BEGIN sal_update_proc(103); rollback; END; / 103 사원은 근무 연수가 17년 입니다. 이전 급여는 9000 수정된 급여는 9900 입니다. BEGIN sal_update_..

문제/SQL 2023.11.02
728x90
반응형
LIST