در این قسمت رکورد (RECORD) در PL/SQL و روش استفاده از آن را توضیح می دهیم. رکورد یک ساختمان داده است که آیتم های متفاوت را کنار هم نگه می دارد. یعنی بر خلاف آرایه، این آیتم ها نوع داده متفاوت دارند. به همین جهت، هر سطر از جدول را یک رکورد می نامند زیرا معمولا سطرها از ستون های با نوع داده متفاوت تشکیل شده اند.
برای مثال می خواهیم اطلاعات کتاب های یک کتابخانه را بررسی کنیم. برای این کتاب ها مشخصات مختلف از جمله عنوان، نام نویسنده، موضوع کتاب و شماره کتاب وجود دارد. بنابراین برای آن ها یک رکورد با فیلدهای مورد نیاز تعریف می کنیم و اطلاعات مورد نظر را به شیوه بهتر دسته بندی کرده و نمایش می دهیم.
در PL/SQL می توان رکورد را به سه روش زیر تعریف کرد که در ادامه توضیح می دهیم.
1.روش Table-Based
در روش Table-Based از ویژگی ROWTYPE% استفاده می شود و رکورد معادل با ستون ها و نوع داده آنها در یک جدول ساخته می شود. برای دسترسی به محتویات رکورد نیز از علامت نقطه ( . ) استفاده می شود.
مثال:
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;
/
خروجی:
Customer ID: 5
Customer Name: Hardik
Customer Address: Bhopal
Customer Salary: 9000
PL/SQL procedure successfully completed.
2.روش Cursor-Based
همانند روش اول در تعریف یک رکورد از ویژگی ROWTYPE% استفاده می شود ولی ستون ها و نوع داده آنها معادل با یک CURSOR تعریف می شود. با استفاده از CURSOR می توان به رکوردهای مختلف دسترسی داشته باشیم.
مثال:
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;
/
خروجی:
1 Ramesh
2 Khilan
3 kaushik
4 Chaitali
5 Hardik
6 Komal
PL/SQL procedure successfully completed.
3.روش User-Defined
در این روش کاربر می تواند یک رکورد با فیلدها و نوع داده دلخواه تعریف کند. در ادامه سینتکس تعریف رکورد به این روش را می بینید:
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;
مثال 1: تعریف رکورد برای دو کتاب
DECLARE
TYPE books IS RECORD
(title varchar(50),
author varchar(50),
subject varchar(100),
book_id number);
book1 books;
book2 books;
مثال 2: ثبت و نمایش اطلاعات دو کتاب در رکورد
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;
/
خروجی:
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;
/
خروجی:
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.
بسیار عالی