함수 들어가기 전
PL/SQL에는 (스토어드)프로시저 와 함수라는 두가지 유형의 SUBPROGRAM이 있다.
SELECT구문 뿐만 아니라 기타 DML문등을 이용하거나 혹은 프로그래밍적인 요소등을 사용하여 처리하기 복잡한 여러가지 데이터베이스 작업등을 처리 할 수 있도록 만들어진 데이터베이스 객체이다. 말은 너무 어려워서 내가 처리될 것 같음... 걍 자바에서 메소드 같은 개념이라고 생각하자!!
FUNCTION(함수)
사용자가 PL/SQL구문을 사용하여 직접 오라클 에서 제공하는 내장함수와 같은 기능을 정의 한 것 ! 내가 만드는 메소드 느낌? 함수는 IN 파라미터만 사용할 수 있으며, "반드시 반환" 될 값의 데이터 타입을 RETURN문에 선언해야 하며 "단일값만 반환" 된다. 자바에서 리턴값이 있는 메소드와 같다고 생각하자!
구문이 좀 까다로우니까 잘 익혀두자!
[함수 구문]
CREATE OR REPLACE FUNCTION 함수명 =>ALTER가 없어용 ...
[ (
매개변수1 IN 자료형, --> IN 생략 가능 외부에서 전달받아서 자료에 넣는거...
매개변수2 IN 자료형 --> 자료형 정의시 ** 자리수 지정 안함**
) ]
RETURN 자료형 --> 자리수 지정 안함 ,반환타입만 지정 ; 도 넣으면 안 됨...!!!
IS
[변수 선언] ==> 요 때는 자리수 지정 가능!!
BEGIN
함수 내용
RETURN(값); =>반환값은 무조건 있어 함
END;
/
[FUNCTION 호출]
방법1. 바로 사용
SELECT 함수명(매개변수1,매개변수2) FROM DUAL ;
방법2. 바인드변수를 선언해서 사용하는 방법
VAR HAP 자료형;
EXCUTE :HAP := 함수명(매개변수1,매개변수2) ; => EXCUTE는 함수나 프로시저 실행할 때 쓰는 명령어!
=>바인드변수는 : 를 꼭 붙여준다
PRINT HAP;
직접 해보는게 더 빠름!
[누적합을 구하는 함수 ]
CREATE OR REPLACE FUNCTION getTotal(fnum /*IN*/ NUMBER, snum NUMBER ) -->IN은 생략 가능
--반환타입 정의(자리수 랑 ; 안돼)
RETURN NUMBER
IS
--함수에서 사용할 변수 선언(자리수지정O , ;반드시 넣어야)
hap NUMBER := 0 ;
BEGIN
FOR k IN fnum..snum LOOP
hap := hap + k;
END LOOP;
--값 반환
RETURN hap;
END;
/
SELECT getTotal(1,100) FROM DUAL; --바로출력하거나
VAR hap NUMBER ; ----바인드 변수 선언해서
EXECUTE :hap := getTotal(1,1000);
PRINT hap; -출력
[EMP 에서 이름을 첫글자만 나오게 나머지는 * 로 숨겨서 출력하기]
CREATE OR REPLACE FUNCTION initname (init VARCHAR2 )
RETURN VARCHAR2
IS
/* INIT VARCHAR2 := NULL;*/ --- 변수선언 안하고 바로 넣어도 됨! 아하!!
BEGIN
RETURN RPAD(SUBSTR(INIT,1,1),LENGTH(INIT),'*');
END;
/
SELECT initname('CHOI') FROM DUAL; --잘 되는지 호출해보고
VAR init VARCHAR2(500)
EXECUTE :init := initname('CHOI');
PRINT init ;
----- EMP 에 적용하기!
SELECT initname(ENAME) FROM EMP;
[날자타입을 문자로 반환해서 EMP 입사일에 반영하기]
CREATE OR REPLACE FUNCTION to_string (val DATE)
RETURN VARCHAR2
IS
BEGIN
RETURN TO_CHAR(val,'yyyy-mm-dd');
END;
/
VAR val VARCHAR2(500)
EXECUTE :val := to_string(sysdate);
PRINT val;
SELECT HIREDATE , to_string(HIREDATE) FROM emp;
++ SCOTT에서 만든 함수를 HR계정에서도 사용 할 수 있음!!
우선 함수를 사용할 수 있는 권한을 받아야 하기 때문에 SYSTEM 계정에 가서
GRANT execute ON SCOTT.initname TO HR; 해주고
HR에선 E-MAIL을 출력 해 보자
SELECT EMAIL,SCOTT.initname(EMAIL) FROM employees;
'학원 > DB(오라클),SQL문' 카테고리의 다른 글
10/21 26-2 Procedure (0) | 2022.10.21 |
---|---|
10/21 26-1 함수 안 에서 예외 처리 (0) | 2022.10.21 |
10/20 25-6 CURSOR (2) | 2022.10.20 |
10/20 25-5 오라클 내장 함수 (수학관련) (0) | 2022.10.20 |
10/20 25-4 오라클 내장함수 (날짜관련) (0) | 2022.10.20 |