SAK 図書館
SQL 基礎実地編 (その十) ストアドファンクション、PL/SQL、動的 SQL
Oracle 固有の部分があるかもしれません。SQL-Server、MDB では注意のこと。
■ストアドファンクション (ストアドプロシジャ)
・SQL の組み込み関数以外にユーザが独自の関数を作ることができる。
構文は Pascal 言語に似ている。
データベースアクセスをしないユーザ関数は簡単である。
次の例は、引数 dt1 と dt2 を与えて、dt2 が NULL でなければ、戻り値と
して dt2 が、dt2 が NULL なら dt1 が返る。
/*
========================================================================
文字項目 Not NULL 時セット関数作成
========================================================================
*/
create or replace function sak.Char2NotNull (dt1 in varchar2, dt2 in varchar2) return varchar2 is
dt varchar2(2000);
begin
dt := dt1;
if dt2 > '''' then
dt := dt2;
end if;
return dt;
end;
/
・ストアドファンクションのテストは次のように行う。
この例では、20 が返る。
select sak.Data2NotNull(10, 20) from dual
;
■PL/SQL
・PL/SQL は、ストアドファンクションの構文とほとんど同じである。
set serveroutput on;
declare
cursor c1 is select * from sak.受注m
where 品番 = 'a001' order by 受注番号;
-- rec c1%rowtype;
begin
dbms_output.put_line ('start...');
for rec in c1 loop
dbms_output.put_line (rec.受注番号 || ' ' || rec.品番);
end loop;
dbms_output.put_line ('end');
exception
when OTHERS then
dbms_output.put_line ('** エラー **');
end;
/
■動的 SQL
・Oracle8 では、オブジェクト機能を用いて、もっと容易に動的な操作ができ
る。この例はオブジェクト機能を使用していない。
・通常の静的 SQL では、テーブル名などが実在していなくてはならない。
ストアドでテーブル名などを動的に扱うには、DBMS_SQL パッケージを使用
する。
declare
tbl in varchar2 default 'sak.test';
cid integer;
begin
cid := DBMS_SQL.OPEN_CURSOR;
DBMS_SQL.PARSE(cid, 'create table ' || tbl || ' (データ number(9))', dbms_sql.v7);
DBMS_SQL.CLOSE_CURSOR(cid);
dbms_output.put_line ('end');
exception
when OTHERS then
dbms_output.put_line ('** エラー **');
end;
/
■ストアドプロシジャ作成
create function ストアド名...
create procedure ストアド名...
■ストアドプロシジャ削除
drop function ストアド名;
drop procedure ストアド名;
■SQL 基礎実地編資料
■SQL 基礎編資料
■SQL チューニング編資料
■Oracle PL/SQL 編資料
■PostgreSQL 編、JAVA Servlet、JSP 編資料
■MySQL 編資料