Oracle PL / SQL – CREATE関数の例
この記事は、ユーザー定義関数の作成方法を理解するのに役立ちます。 ストアド関数またはユーザー関数とも呼ばれます。
-
ユーザー定義関数は手順に似ています。 唯一の違いは、関数が常に値を返すことです。
-
ユーザー定義関数は、SQL式の一部として使用できます。
Note
Oracle SQLは、ブールパラメータまたは戻り値を使用した関数の呼び出しをサポートしていません。
1. 機能-フォーマットされた住所を取得
この例では、人の名前を指定して書式設定された住所を取得する関数を作成します。
1.1 Create tables and function.
-- creating table person_info CREATE TABLE person_info ( PERSON_ID number(5) primary key, FIRST_NAME varchar2(20), LAST_NAME varchar2(20) );
--creating table person_address_details CREATE TABLE person_address_details ( PERSON_ADDRESS_ID number(5) primary key, PERSON_ID number(5) references person_info(person_id), CITY varchar2(15), STATE varchar2(15), COUNTRY varchar2(20), ZIP_CODE varchar2(10) );
--creating function get_complete_address
create or replace FUNCTION get_complete_address(in_person_id IN NUMBER)
RETURN VARCHAR2
IS person_details VARCHAR2(130);
BEGIN
SELECT 'Name-'||person.first_name||' '|| person.last_name||',
City-'|| address.city ||', State-'||address.state||',
Country-'||address.country||', ZIP Code-'||address.zip_code
INTO person_details
FROM person_info person, person_address_details address
WHERE person.person_id = in_person_id
AND address.person_id = person.person_id;
RETURN(person_details);
END get_complete_address;
1.2 Insert data for testing.
INSERT INTO person_info VALUES (10,'Luis','Thomas'); INSERT INTO person_info VALUES (20,'Wang','Moris'); INSERT INTO person_address_details VALUES (101,10,'Vegas','Nevada','US','88901'); INSERT INTO person_address_details VALUES (102,20,'Carson','Nevada','US','90220');
1.3 Display the data.
select * from PERSON_INFO;
| PERSON_ID | ファーストネーム | 苗字 |
|---|---|---|
10 |
Luis |
トーマス |
20 |
Wang |
モリス |
select * from PERSON_ADDRESS_DETAILS;
| PERSON_ADDRESS_ID | PERSON_ID | CITY | 状態 | 国 | 郵便番号 |
|---|---|---|---|---|---|
101 |
10 |
ラスベガス |
ネバダ |
US |
88901 |
102 |
20 |
カーソン |
ネバダ |
US |
90220 |
1.4 Calling the function. 関数はさまざまな方法で呼び出すことができます。 ここではまず、SELECT statementで呼び出します。 そして、それをdbms_output.put_lineから呼び出します
SELECT get_complete_address(10) AS "Person Address" FROM DUAL; -- output -- Name-Luis Thomas, City-Vegas, State-Nevada, Country-US, ZIP Code-88901
SET SERVEROUTPUT ON; EXECUTE dbms_output.put_line(get_complete_address(20)); -- output -- Name-Wang Moris, City-Carson, State-Nevada, Country-US, ZIP Code-90220
2. 機能-パリンドローム文字列の確認
この例では、指定された文字列が回文であるかどうかを確認する関数を作成します。
回文とは、単語、句、数字、またはマダムやレースカーなど、前方と同じ後方を読み取る文字のシーケンスです。
https://en.wikipedia.org/wiki/Palindrome
2.1 Creating the function.
CREATE OR REPLACE FUNCTION checkForPalindrome(inputString VARCHAR2)
RETURN VARCHAR2
IS result VARCHAR2(75);
reversedString VARCHAR2(50);
BEGIN
SELECT REVERSE(inputString) INTO reversedString FROM DUAL;
-- Using UPPER to ignore case sensitivity.
IF UPPER(inputString) = UPPER(reversedString)
THEN
RETURN(inputString||' IS a palindrome.');
END IF;
RETURN (inputString||' IS NOT a palindrome.');
END checkForPalindrome;
/
2.2 Calling the function.
SELECT checkForPalindrome('COMPUTER') FROM DUAL;
-- Output
-- COMPUTER IS NOT a palindrome.
SELECT checkForPalindrome('MAdam') FROM DUAL;
-- Output
-- MAdam IS a palindrome.
SELECT checkForPalindrome('KANAK') FROM DUAL;
-- Output
-- KANAK IS a palindrome.
3. 機能-所得税の計算
この例では、所得税を計算する関数を作成します。想定される税率は、給与からのすべての年間収入の30%です。
3.1 Create tables and function.
--creating table person CREATE TABLE person ( PERSON_ID number(5) primary key, FULLNAME varchar2(20) );
--creating table person_salary_details CREATE TABLE person_salary_details ( SALARY_ID number(5) primary key, PERSON_ID number(5) references person(person_id), SALARY number(8), MONTH varchar2(9), YEAR number(4) );
--creating function
CREATE OR REPLACE FUNCTION calculate_tax(personId NUMBER)
RETURN NUMBER
IS tax NUMBER(10,2);
BEGIN
tax := 0;
SELECT (sum(salary)*30)/100 INTO tax FROM person_salary_details WHERE person_id = personId;
RETURN tax;
END calculate_tax;
3.2 Insert data for testing.
INSERT INTO person VALUES (101,'Mark Phile'); INSERT INTO person_salary_details VALUES (1,101,15000,'JANUARY',2016); INSERT INTO person_salary_details VALUES (2,101,15000,'FEBRUARY',2016); INSERT INTO person_salary_details VALUES (3,101,15000,'MARCH',2016); INSERT INTO person_salary_details VALUES (4,101,18000,'APRIL',2016); INSERT INTO person_salary_details VALUES (5,101,18000,'MAY',2016); INSERT INTO person_salary_details VALUES (6,101,18000,'JUNE',2016); INSERT INTO person_salary_details VALUES (7,101,18000,'JULY',2016); INSERT INTO person_salary_details VALUES (8,101,18000,'AUGUST',2016); INSERT INTO person_salary_details VALUES (9,101,18000,'SEPTEMBER',2016); INSERT INTO person_salary_details VALUES (10,101,18000,'OCTOBER',2016); INSERT INTO person_salary_details VALUES (11,101,18000,'NOVEMBER',2016); INSERT INTO person_salary_details VALUES (12,101,18000,'DECEMBER',2016);
3.3 Display the data.
select * from PERSON;
| PERSON_ID | フルネーム |
|---|---|
101 |
マークフィレ |
select * from PERSON_SALARY_DETAILS;
| SALARY_ID | PERSON_ID | 給料 | 月 | YEAR |
|---|---|---|---|---|
1 |
101 |
15000 |
1月 |
2016 |
2 |
101 |
15000 |
2月 |
2016 |
3 |
101 |
15000 |
行進 |
2016 |
4 |
101 |
18000 |
4月 |
2016 |
5 |
101 |
18000 |
MAY |
2016 |
6 |
101 |
18000 |
JUNE |
2016 |
7 |
101 |
18000 |
JULY |
2016 |
8 |
101 |
18000 |
8月 |
2016 |
9 |
101 |
18000 |
9月 |
2016 |
10 |
101 |
18000 |
10月 |
2016 |
11 |
101 |
18000 |
11月 |
2016 |
12 |
101 |
18000 |
12月 |
2016 |
3.4 Calling the function.
SELECT person.fullname, sum(sal.salary) AS AnnualSalary, sal.year,calculate_tax(101) AS tax FROM person,person_salary_details sal WHERE person.person_id = 101 and sal.year = 2016 GROUP BY person.fullname, sal.year;
出力
| フルネーム | 年俸 | YEAR | TAX |
|---|---|---|---|
マークフィレ |
207000 |
2016 |
62100 |