User-defined Functions CSED421: Database Systems Labs User-Defined Functions To provide functionality that is not available in SQL or SQL built-in functions PL/SQL (Procedural Language extension to SQL) Procedural language built in Oracle Support conditional (IF) statement, loop (WHILE, FOR) statement Procedure / Function User-Defined Functions (cont.) Can appear in a SQL statement anywhere SQL functions can appear Select list of a SELECT statement Condition of a WHERE clause ORDER BY, and GROUP BY clauses VALUES clause of an INSERT statement SET clause of an UPDATE statement RETURN Clause Every function must return a value Oracle SQL does not support calling of functions with boolean parameters of returns Design functions to return number (0 or 1) or strings (‘TRUE’ or ‘FALSE’) The data type cannot specify a length, precision, or scale Syntax Examples the same type as jobs.job_id Variable declaration PL/SQL Block Examples Convert Celsius to Fahrenheit CREATE OR REPLACE FUNCTION CtoF (Celsius IN NUMBER) RETURN NUMBER IS BEGIN RETURN (Celsius * 1.8) + 32; END; / Examples IF statements IF k=0 THEN result:=-1; ELSIF k=1 OR k=2 result:=1; ELSE result:=0; END IF; WHILE statements WHILE k > 0 LOOP k := k – 1; END LOOP; THEN create or replace function make_zero (k in number) return number is result number; begin result := k; while result > 0 loop result := result - 1; end loop; return result; end make_zero; / Practice 1 “ORA-01476: divisor is equal to zero” 문제를 피해 가기 위한 나누기 함수를 생성하고 확인 함수명은 divide로 생성 함수는 두 개의 숫자(NUMBER) a, b를 입력 받는다 b=0 이면 결과로 0을 RETURN 한다 b!=0 이면 a/b를 RETURN 한다 확인하는 방법: (1) temp variable 선언, (2) execute 명령어를 사용 하여 divide function을 실행, (3) print 명령어를 사용하여 출력 Practice 2 사원번호를 치면 department_name을 출력하고 싶다. 출력하는 함수를 만드시오. 그리고 함수를 확인하기 위해 사원번호, 이름, 부서명을 출력하는 쿼리를 입력하시오. 주의: return 타입으로 varchar2를 사용, varchar2(20)과 같 이 scale을 정의 불가 Practice 3 10진수를 16진수 값으로 CONVERSION하는 함수를 만 들고, 함수를 확인하기 위해 사원번호를 16진수로 출력 하는 쿼리를 입력하시오 EMPLOYEE_ID DECTOHEX(EMPLOYEE_ID) 힌트: 사용 가능한 built-in function 모듈로 연산: 17 mod 16 버림 연산: trunc(2.2) 숫자를 char로 변환: to_char(2) Concatenation: concat(‘abc’, ‘d’) 주의: return 타입으로 varchar2를 사용 varchar2(20)과 같이 scale을 정의 불가 ------------------------------------100 64 101 65 102 66 103 67 104 68 107 6B 124 7C 141 8D 142 8E 143 8F 144 90 149 95 174 AE 176 B0 178 B2 200 C8 201 C9 202 CA 205 CD 206 CE 20 rows selected. References Oracle Database Application Developer’s Guide Fundamentals http://stanford.edu/dept/itss/docs/oracle/10g/appdev.101/b10 795/adfns_pc.htm#ADFNS009 Oracle Database SQL Reference – CREATE FUNCTION http://stanford.edu/dept/itss/docs/oracle/10g/server.101/b107 59/statements_5009.htm#i2153260