hyeonga_code
Database_88_함수 본문
-- 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이(가) 삭제되었습니다.
*/
'Oracle Database' 카테고리의 다른 글
Database_90_Trigger_트리거_Timing_BEFORE, AFTER, INSTEAD OF, EVENT, 수식자_OLD, NEW, ALTER 트리 (0) | 2023.09.02 |
---|---|
Database_89_패키지_spec, body, 패키지 서브 프로그램 호출, 데이터 딕셔너리 패키지 정보 보기, SQL 코드 암호화, 패키지 삭제 (0) | 2023.09.02 |
Database_87_서브 프로그램 (0) | 2023.09.01 |
Database_86_PL/SQL_제어 구조_예외 처리 (0) | 2023.08.31 |
Database_85_PL/SQL_제어 구조_CURSOR (0) | 2023.08.31 |