hyeonga_code

Database_88_함수 본문

Oracle Database

Database_88_함수

hyeonga 2023. 9. 1. 06:59
반응형

-- Function_함수
    -- 프로시저와 함수의 비교
        -- 프로시저
            -- PL/SQL 문으로 실행합니다.
            -- 헤더에 RETURN 절이 없습니다.
            -- 출력 파라미터를 사용하여 값을 전달할 수 있습니다.
            -- 값이 없이 RETURN 문을 포함할 수 있습니다.
        -- 함수
            -- 표현식의 일부로 호출합니다.
            -- 헤더에 RETURN 절을 포함해야 합니다.
            -- 단일 값을 반환해야 합니다.
            -- 적어도 하나의 RETURN 문을 포함해야 합니다.
    -- 내장 함수
        -- 값을 반환하는 명명된 PL/SQL 블록입니다.
        -- 반복 실행을 위해 데이터베이스에 스키마 객체로 저장할 수 있습니다.
        -- 표현식의 일부로 호출되거나 다른 서브 프로그램에 대한 파라미터 값을 제공하는 데에 사용합니다.
        -- PL/SQL 패키지로 그룹화할 수 있습니다.
        -- 함수 실행
            -- 하나 이상의 파라미터를 사용할 수 있지만 값은 하나만 반환해야 합니다.
            -- 반환된 값을 저장할 변수를 사용하여 PL/SQL 표현식의 일부로 함수를 호출합니다.
            -- 반환된 값을 보유할 변수를 생성합니다.
            -- 함수를 실행하면 RETURN 문을 통해 반환된 값이 변수에 채워집니다.
        -- 생성
            /*
            CREATE [ OR REPLACE ] FUNCTION function_name
                [ ( parameter1 [model] datatype1, ... ) ]
                RETURN datatype
            IS | AS
                [ local_variable_declarations; ... ]
            BEGIN
                -- actions;
                RETURN expression;
            END [function_name];
            */

    -- 함수 생성
-- 지정 사원의 커미션을 적용한 급여를 정수로 반환하는 함수
CREATE OR REPLACE FUNCTION get_sal(
                p_id employees.employee_id%TYPE) 
    RETURN NUMBER IS v_sal employees.salary%TYPE := 0;
BEGIN
    SELECT ROUND(salary+salary*NVL(commission_pct,0))
    INTO v_sal
    FROM employees
    WHERE employee_id = p_id;
    RETURN v_sal;
END get_sal; 
/
    /*
    Function GET_SAL이(가) 컴파일되었습니다.
    */

    -- 함수 실행
-- Invoke the function as an expression or as a parameter value.
EXECUTE dbms_output.put_line(get_sal(100));
    /*
    27720

    PL/SQL 프로시저가 성공적으로 완료되었습니다.
    */

SET SERVEROUTPUT ON
DECLARE
    sal employees.salary%type;
BEGIN
    sal := get_sal(178);
    DBMS_OUTPUT.PUT_LINE('The Real salary is: '|| sal);
END;
/
    /*
    The Real salary is: 8855

    PL/SQL 프로시저가 성공적으로 완료되었습니다.
    */

-- NUMBER 파라미터를 받아서 해당 파라미터 값에 0.08을 곱하여 세금을 반환합니다.
CREATE OR REPLACE FUNCTION tax(p_value IN NUMBER)
    RETURN NUMBER IS
BEGIN
    RETURN (p_value * 0.08);
END tax;
/
    /*
    Function TAX이(가) 컴파일되었습니다.
    */

-- 사원 ID, 이름, 급여 및 세금을 표시하는 질의에 TAX 함수를 포함시켜 호출합니다.
SELECT employee_id, last_name, salary, ROUND(tax(salary))
FROM employees;



    -- 사용자 정의 함수
        -- 장점
            -- 작업이 복잡하고 다루기 힘들거나 SQL로 처리할 수 없는 경우 확장이 가능합니다.
            -- 응용 프로그램에서의 데이터 필터링과는 반대로 WHERE 절에서 사용자가 정의한 함수로 데이터를 필터링하면 효과적입니다.
            -- 문자열에 대해 작동하는 함수를 사용함으로써 새로운 데이터 유형을 조작할 수 있습니다.
        -- 호출 위치
            -- 쿼리의 SELECT 리스트, 절
            -- WHERE, HAVING 절의 조건식
            -- 쿼리의 CONNECT BY, START WITH, ORDER BY, GROUP BY
            -- INSERT 문의 VALUES 절
            -- UPDATE 문의 SET 절
        -- 제한 사항
            -- SQL 표현식에서 호출 가능한 경우
                -- 데이터베이스에 저장해야 합니다.
                -- 적합한 SQL 데이터 유형, PL/SQL 고유 데이터 유형을 가진 IN 파라미터만 사용이 가능합니다.
                -- 적합한 SQL 데이터 유형, PL/SQL 고유 유형을 반환해야 합니다.
            -- SQL 문에서 함수를 호출하는 경우
                -- 함수를 소유하거나 EXECUTE 권한을 가지고 있어야 합니다.
            
SELECT employee_id, ROUND(tax(salary)) 
FROM employees
WHERE tax(salary)>(SELECT MAX(tax(salary))
                    FROM employees 
                    WHERE department_id = 80)
ORDER BY tax(salary) DESC; 





    -- 함수 정보 보기
        -- USER_OBJECTS
SELECT object_name, object_type, status
FROM user_objects
WHERE object_type='FUNCTION';


        
        -- USER_SOURCE
SELECT name, text, type
FROM user_source
WHERE type='FUNCTION'
ORDER BY name, line;



    -- 함수 삭제
        /*
        DROP FUNCTION function_name;
        */
DROP FUNCTION tax;
    /*
    Function TAX이(가) 삭제되었습니다.
    */

반응형