【PL/SQL】HelloWorldとか

次の現場でPL/SQLが必要そうなので勉強中。

とりあえずいろいろ種類があるっぽい。
・無名ブロック
・ストアドプロシージャ – PROCEDURE
・ストアドファンクション – FUNCTION
・ストアドパッケージ – PACKAGE


テーブルとか

過去に作成した適当なテーブルとデータです。。。。


PL/SQL標準出力

とりあえず標準出力を許可。

-- DBMS_OUTPUT 出力ON
SET SERVEROUTPUT ON;


参考
SET SERVEROUTPUTオラクル・Oracle SQL*Plus リファレンス


無名ブロック その1

BEGIN
  DBMS_OUTPUT.PUT_LINE('Hello World');
END;
/

実行結果

PL/SQLプロシージャが正常に完了しました。

Hello World

無名ブロック その2

DECLARE
  -- 変数設定
  hoge VARCHAR2(10) := 'test';

BEGIN
  DBMS_OUTPUT.PUT_LINE('hello world:' || hoge);

EXCEPTION
  WHEN OTHERS THEN
  DBMS_OUTPUT.PUT_LINE('Error!!');

END;
/

実行結果

PL/SQLプロシージャが正常に完了しました。

Hello World:test

ストアドプロシージャ

get_name.sql

CREATE OR REPLACE PROCEDURE GET_NAME (
  v_id IN NUMBER,
  v_name OUT VARCHAR2
) AS
BEGIN

  SELECT NAME INTO v_name FROM TRANSACTION1 WHERE ID = v_id;

END GET_NAME;
/

無名ブロック から呼び出し

DECLARE

  v_name varchar2(40);

BEGIN

  GET_NAME(v_id => 2, v_name => v_name);
  DBMS_OUTPUT.PUT_LINE(v_name);

END;
/
PL/SQLプロシージャが正常に完了しました。

BBB

ストアドファンクション

get_name2.sql

CREATE OR REPLACE FUNCTION GET_NAME2(v_id IN NUMBER)
  RETURN VARCHAR2 AS
  v_name VARCHAR2(40);

BEGIN

  SELECT NAME INTO v_name FROM TRANSACTION1 WHERE ID = v_id;
  RETURN v_name;

END GET_NAME2;
/

SQL から呼び出し

SELECT GET_NAME2(3) FROM DUAL;
GET_NAME2(3)
--------------------------------------------------------------------------------
CCC

無名ブロック から呼び出し

DECLARE
  v_name VARCHAR2(40);

BEGIN

  v_name := GET_NAME2(v_id => 3);
  DBMS_OUTPUT.PUT_LINE(v_name);

END;
/
PL/SQLプロシージャが正常に完了しました。

CCC

IF文

DECLARE
  v_id NUMBER;

BEGIN

  v_id := 10;
  
  IF v_id BETWEEN 1 AND 5 THEN
    DBMS_OUTPUT.PUT_LINE('1~5');
    
  ELSIF v_id BETWEEN 6 AND 9 THEN
    DBMS_OUTPUT.PUT_LINE('6~9');
    
  ELSE
    DBMS_OUTPUT.PUT_LINE('ELSE:' || TO_CHAR(v_id));
  END IF;

END;
/

実行結果

PL/SQLプロシージャが正常に完了しました。

ELSE:10

%TYPE と %ROWTYPE

DECLARE
  v_name          TRANSACTION1.NAME%TYPE;
  v_transaction1  TRANSACTION1%ROWTYPE;

BEGIN

  SELECT NAME INTO v_name FROM TRANSACTION1 WHERE ID = 1;
  SELECT * INTO v_transaction1 FROM TRANSACTION1 WHERE ID = 2;

  DBMS_OUTPUT.PUT_LINE(v_name);
  DBMS_OUTPUT.PUT_LINE(v_transaction1.KBN);

END;
/

実行結果

PL/SQLプロシージャが正常に完了しました。

AAA
KBN001

LOOP

BEGIN

  FOR v_count IN 1..10 LOOP
    DBMS_OUTPUT.PUT_LINE(v_count);
  END LOOP;

END;
/

実行結果

PL/SQLプロシージャが正常に完了しました。

1
2
3
4
5
6
7
8
9
10

ストアドパッケージ

パッケージはパッケージ仕様とパッケージ本体に分けるのが定石のようです。

PKG_TEST.sql

CREATE OR REPLACE PACKAGE PKG_TEST
AS
  FUNCTION TEST(p_number NUMBER)
  RETURN NUMBER;
	
  FUNCTION TEST(p_char NVARCHAR2)
  RETURN NVARCHAR2;
	
  FUNCTION TEST(p_date DATE)
  RETURN DATE;
END;
/
PKG_TEST_BODY.sql

CREATE OR REPLACE PACKAGE BODY PKG_TEST
AS

  FUNCTION TEST(p_number in NUMBER)
  RETURN NUMBER 
  AS
  BEGIN
    RETURN p_number + 1;  -- 加算
  END;

  FUNCTION TEST(p_char in NVARCHAR2)
  RETURN NVARCHAR2 
  AS
  BEGIN
    RETURN p_char || ' - TEST';  -- 結合
  END;

  FUNCTION TEST(p_date in DATE) 
  RETURN DATE 
  AS
  BEGIN
    RETURN p_date + 1;  -- 加算
  END;
END;
/

実行結果

-- SQLから実行
SELECT PKG_TEST.TEST(100) FROM DUAL;
SELECT PKG_TEST.TEST('oqiita') FROM DUAL;
SELECT PKG_TEST.TEST(SYSDATE) FROM DUAL;
PKG_TEST.TEST(100)
---------------------------------------
101

PKG_TEST.TEST('OQIITA')                                                        
--------------------------------------------------------------------------------
oqiita - TEST                                                                   

PKG_TEST.TEST(SYSDATE)
----------------------
2018-09-06 14:26:32   

まとめ

いろいろ種類があってムズいな!!

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください