Plsql-records
PL/SQL-レコード
この章では、PL/SQLのレコードについて説明します。 *レコード*は、さまざまな種類のデータ項目を保持できるデータ構造です。 レコードは、データベーステーブルの行に似たさまざまなフィールドで構成されます。
たとえば、図書館で本を追跡したいとします。 タイトル、著者、件名、書籍IDなど、各書籍に関する次の属性を追跡できます。 これらの各項目のフィールドを含むレコードにより、BOOKを論理ユニットとして扱うことができ、より適切な方法でその情報を整理および表現できます。
PL/SQLは、次のタイプのレコードを処理できます-
- テーブルベース
- カーソルベースのレコード
- ユーザー定義のレコード
テーブルベースのレコード
%ROWTYPE属性により、プログラマは table-based および cursorbased レコードを作成できます。
次の例は、 table-based レコードの概念を示しています。 前の章で作成して使用したCUSTOMERSテーブルを使用します-
DECLARE
customer_rec customers%rowtype;
BEGIN
SELECT * into customer_rec
FROM customers
WHERE id = 5;
dbms_output.put_line('Customer ID: ' || customer_rec.id);
dbms_output.put_line('Customer Name: ' || customer_rec.name);
dbms_output.put_line('Customer Address: ' || customer_rec.address);
dbms_output.put_line('Customer Salary: ' || customer_rec.salary);
END;
/
上記のコードがSQLプロンプトで実行されると、次の結果が生成されます-
Customer ID: 5
Customer Name: Hardik
Customer Address: Bhopal
Customer Salary: 9000
PL/SQL procedure successfully completed.
カーソルベースのレコード
次の例は、*カーソルベース*レコードの概念を示しています。 前の章で作成して使用したCUSTOMERSテーブルを使用します-
DECLARE
CURSOR customer_cur is
SELECT id, name, address
FROM customers;
customer_rec customer_cur%rowtype;
BEGIN
OPEN customer_cur;
LOOP
FETCH customer_cur into customer_rec;
EXIT WHEN customer_cur%notfound;
DBMS_OUTPUT.put_line(customer_rec.id || ' ' || customer_rec.name);
END LOOP;
END;
/
上記のコードがSQLプロンプトで実行されると、次の結果が生成されます-
1 Ramesh
2 Khilan
3 kaushik
4 Chaitali
5 Hardik
6 Komal
PL/SQL procedure successfully completed.
ユーザー定義のレコード
PL/SQLには、様々なレコード構造を定義できるユーザー定義のレコード型が用意されています。 これらのレコードは異なるフィールドで構成されています。 図書館で本を追跡したいとします。 あなたは、各本に関する次の属性を追跡することができます-
- タイトル
- 著者
- 件名
- ブックID
レコードを定義する
レコードタイプは次のように定義されています-
TYPE
type_name IS RECORD
( field_name1 datatype1 [NOT NULL] [:= DEFAULT EXPRESSION],
field_name2 datatype2 [NOT NULL] [:= DEFAULT EXPRESSION],
...
field_nameN datatypeN [NOT NULL] [:= DEFAULT EXPRESSION);
record-name type_name;
本の記録は次のように宣言されています-
DECLARE
TYPE books IS RECORD
(title varchar(50),
author varchar(50),
subject varchar(100),
book_id number);
book1 books;
book2 books;
フィールドへのアクセス
レコードの任意のフィールドにアクセスするには、ドット*(。)*演算子を使用します。 メンバーアクセス演算子は、レコード変数名とアクセスするフィールドの間のピリオドとしてコーディングされます。 以下は、レコードの使用法を説明する例です-
DECLARE
type books is record
(title varchar(50),
author varchar(50),
subject varchar(100),
book_id number);
book1 books;
book2 books;
BEGIN
-- Book 1 specification
book1.title := 'C Programming';
book1.author := 'Nuha Ali ';
book1.subject := 'C Programming Tutorial';
book1.book_id := 6495407;
-- Book 2 specification
book2.title := 'Telecom Billing';
book2.author := 'Zara Ali';
book2.subject := 'Telecom Billing Tutorial';
book2.book_id := 6495700;
-- Print book 1 record
dbms_output.put_line('Book 1 title : '|| book1.title);
dbms_output.put_line('Book 1 author : '|| book1.author);
dbms_output.put_line('Book 1 subject : '|| book1.subject);
dbms_output.put_line('Book 1 book_id : ' || book1.book_id);
-- Print book 2 record
dbms_output.put_line('Book 2 title : '|| book2.title);
dbms_output.put_line('Book 2 author : '|| book2.author);
dbms_output.put_line('Book 2 subject : '|| book2.subject);
dbms_output.put_line('Book 2 book_id : '|| book2.book_id);
END;
/
上記のコードがSQLプロンプトで実行されると、次の結果が生成されます-
Book 1 title : C Programming
Book 1 author : Nuha Ali
Book 1 subject : C Programming Tutorial
Book 1 book_id : 6495407
Book 2 title : Telecom Billing
Book 2 author : Zara Ali
Book 2 subject : Telecom Billing Tutorial
Book 2 book_id : 6495700
PL/SQL procedure successfully completed.
サブプログラムパラメータとしてのレコード
他の変数を渡すのと同じように、サブプログラムのパラメーターとしてレコードを渡すことができます。 また、上記の例でアクセスしたのと同じ方法でレコードフィールドにアクセスできます-
DECLARE
type books is record
(title varchar(50),
author varchar(50),
subject varchar(100),
book_id number);
book1 books;
book2 books;
PROCEDURE printbook (book books) IS
BEGIN
dbms_output.put_line ('Book title : ' || book.title);
dbms_output.put_line('Book author : ' || book.author);
dbms_output.put_line( 'Book subject : ' || book.subject);
dbms_output.put_line( 'Book book_id : ' || book.book_id);
END;
BEGIN
-- Book 1 specification
book1.title := 'C Programming';
book1.author := 'Nuha Ali ';
book1.subject := 'C Programming Tutorial';
book1.book_id := 6495407;
-- Book 2 specification
book2.title := 'Telecom Billing';
book2.author := 'Zara Ali';
book2.subject := 'Telecom Billing Tutorial';
book2.book_id := 6495700;
-- Use procedure to print book info
printbook(book1);
printbook(book2);
END;
/
上記のコードがSQLプロンプトで実行されると、次の結果が生成されます-
Book title : C Programming
Book author : Nuha Ali
Book subject : C Programming Tutorial
Book book_id : 6495407
Book title : Telecom Billing
Book author : Zara Ali
Book subject : Telecom Billing Tutorial
Book book_id : 6495700
PL/SQL procedure successfully completed.