Oracle PL/SQL - CREATEファンクションの例

Oracle PL / SQL – CREATE関数の例

この記事は、ユーザー定義関数の作成方法を理解するのに役立ちます。 ストアド関数またはユーザー関数とも呼ばれます。

  1. ユーザー定義関数は手順に似ています。 唯一の違いは、関数が常に値を返すことです。

  2. ユーザー定義関数は、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