목록DB/oracle (29)
nickjoIT
--기본 LOOPDECLARE l_cnt NUMBER := 1;BEGIN LOOP EXIT WHEN l_cnt >= 100; DBMS_OUTPUT.PUT_LINE('cnt: ' || l_cnt); l_cnt := l_cnt + 1; END LOOP;END;/----------------------------------------------------------------------중첩 LOOPDECLARE --subtype을 이용한 새로운 변수 타입 설정 SUBTYPE count_type IS NUMBER(3); l_cnt count_type NOT NULL := 0;BEGIN --goto 활용을 위한 outer 레이블 설정 LOOP DBMS_OUTPUT.PUT_LINE('outer loop1'); --..
--IF문DECLARE l_sales NUMBER := 2500; l_bouns NUMBER := 0;BEGIN IF l_sales >= 3000 THEN l_bouns := 300; ELSIF l_sales >= 2000 THEN l_bouns := 200; ELSE l_bouns := 100; END IF; DBMS_OUTPUT.PUT_LINE('BOUNS: ' || l_bouns);END;/---------------------------------------------------------------------------------------------------------------------------CASE문DECLARE salary NUMBER := 1000; l_out VARCHAR2(2..
CREATE OR REPLACE FUNCTION get_avg_func(p_deptno NUMBER)RETURN NUMBERIS l_result NUMBER := 0;BEGIN SELECT AVG(sal) INTO l_result FROM emp WHERE deptno=p_deptno; RETURN l_result; END;/ ----------------------------------------------------------------------------------------------------------------함수실행SELECT ROUND(get_avg_func(10),2) FROM DUAL;
DROP PROCEDURE procedure_name;
--프로시저 선언CREATE OR REPLACE PROCEDURE emp_count(p_deptno IN NUMBER default 20, --프로시저 입력변수o_emp_count OUT NUMBER) --프로시저 출력변수IS--커서 선언CURSOR get_emp_data IS SELECT COUNT(*) FROM emp WHERE deptno=p_deptno; l_count NUMBER;BEGIN --커서 오픈 OPEN get_emp_data; --커서 FETCH FETCH get_emp_data INTO l_count; --출력 변수에 값 입력 o_emp_count := l_count; --커서 CLOSE CLOSE get_emp_data;END emp_count;/ ------------------..
--NVL(expr,expr1)--expr의 값이 NULL일 경우 expr1의 값을 반환SELECT NVL(NULL,5) FROM DUAL; --NVL2(expr,expr1,expr2)--expr의 값이 NULL이 아닐 경우에는 expr1의 값을 반환하고--NULL일 경우에는 expr2의 값을 반환SELECT NVL2(NULL, 'TRUE', 'FALSE') FROM DUAL; --NULLIF(expr1,expr2)--expr1값과 expr2값이 동일하면 NULL을 반환하고, 그렇지 않으면 expr1을 반환SELECT NULLIF('2','2') FROM DUAL; --COALESCE(expr1,expr2,expr3)--expr1이 NULL이 아니면 expr1 값을, 그렇지 않으면 COALESCE(exp..
DECLARE x NUMBER := 5; y NUMBER := NULL;BEGIN --y가 NULL이므로 비교 연산이 불가하므로 FALSE IF x != y THEN DBMS_OUTPUT.PUT_LINE('x != y'); --not executed --y가 NULL이므로 비교 연산이 불가하므로 FALSE ELSIF x = y THEN DBMS_OUTPUT.PUT_LINE('x=y'); --not executed --비교 연산이 불가하므로 ELSE 부분만 수행이 됨 ELSE DBMS_OUTPUT.PUT_LINE('Can''t tell if x and y are equal or not.'); END IF; --NULL 여부는 IS NULL 함수를 이용하여 비교해야함 IF y IS NULL THEN DBMS..
%TYPE- 테이블 칼럼 또는 사용자 정의 칼럼 타입과 동일한 타입을 설정할 때 사용 %ROWTYPE- 테이블의 행 단위 칼럼 또는 커서에서 추출된 행 단위 칼럼과 동일한 레코드 타입으로 설정하는데 사용 ex) DECLARE --DEPT 테이블의 DNAME과 같은 타입의 변수 선언 l_dname dept.dname%TYPE; --DEPT 테이블의 행과 같은 레코드 변수 선언 dept_rec1 dept%ROWTYPE; --DEPT테이블에서 일부 칼럼들만 추출하는 커서 선언 CURSOR c1 IS SELECT deptno, dname, loc FROM dept; --C1 커서의 칼럼과 같은 레코드 변수 선언 dept_rec2 c1%ROWTYPE;BEGIN --DEPT테이블의 한 행의 칼럼을 %ROWTYPE의..
DECLARE --새로운 레코드 타입 생성 TYPE emp_record IS RECORD(empno NUMBER, ename VARCHAR2(20)); emp_rec emp_record;BEGIN --레코드 타입 변수에 모든 칼럼의 값을 한번에 입력 SELECT empno, ename INTO emp_rec FROM emp WHERE rownum=1; DBMS_OUTPUT.PUT_LINE('empno: ' || emp_rec.empno); DBMS_OUTPUT.PUT_LINE('ename: ' || emp_rec.ename);END;/
DECLARE l_bonus NUMBER(8,2); l_ename VARCHAR2(20); l_empno NUMBER(6) := 7369;BEGIN --SELECT INTO 방식으로 변수에 값 할당 SELECT ename, sal*0.10 INTO l_ename, l_bonus FROM EMP WHERE EMPNO = l_empno; DBMS_OUTPUT.PUT_LINE('ename: ' || l_ename || ', bonus: ' || l_bonus);END;/