PL / SQL - แพ็คเกจ
ในบทนี้เราจะพูดถึงแพ็คเกจใน PL / SQL แพ็กเกจคือวัตถุสคีมาที่จัดกลุ่มประเภท PL / SQL ตัวแปรและโปรแกรมย่อยที่เกี่ยวข้องกันทางตรรกะ
แพ็คเกจจะมีสองส่วนบังคับ -
- ข้อกำหนดแพ็คเกจ
- เนื้อหาแพคเกจหรือคำจำกัดความ
ข้อกำหนดแพ็คเกจ
ข้อกำหนดคือส่วนต่อประสานกับแพ็คเกจ ก็แค่DECLARESประเภทตัวแปรค่าคงที่ข้อยกเว้นเคอร์เซอร์และโปรแกรมย่อยที่สามารถอ้างอิงได้จากภายนอกแพ็คเกจ กล่าวอีกนัยหนึ่งคือมีข้อมูลทั้งหมดเกี่ยวกับเนื้อหาของแพ็กเกจ แต่ไม่รวมโค้ดสำหรับโปรแกรมย่อย
เรียกวัตถุทั้งหมดที่อยู่ในข้อกำหนด publicวัตถุ โปรแกรมย่อยใด ๆ ที่ไม่อยู่ในข้อกำหนดของแพ็คเกจ แต่มีรหัสอยู่ในเนื้อหาของแพ็คเกจเรียกว่าไฟล์private วัตถุ.
ข้อมูลโค้ดต่อไปนี้แสดงข้อกำหนดของแพ็คเกจที่มีโพรซีเดอร์เดียว คุณสามารถกำหนดตัวแปรส่วนกลางจำนวนมากและมีขั้นตอนหรือฟังก์ชันหลายอย่างภายในแพ็คเกจ
CREATE PACKAGE cust_sal AS
PROCEDURE find_sal(c_id customers.id%type);
END cust_sal;
/
เมื่อรหัสด้านบนถูกเรียกใช้ที่พรอมต์ SQL จะให้ผลลัพธ์ดังต่อไปนี้ -
Package created.
ตัวแพ็คเกจ
เนื้อหาแพคเกจมีรหัสสำหรับวิธีการต่างๆที่ประกาศไว้ในข้อกำหนดแพ็คเกจและการประกาศส่วนตัวอื่น ๆ ซึ่งซ่อนจากรหัสภายนอกแพ็คเกจ
CREATE PACKAGE BODYคำสั่งใช้สำหรับการสร้างเนื้อหาแพคเกจ ข้อมูลโค้ดต่อไปนี้แสดงการประกาศเนื้อหาแพคเกจสำหรับไฟล์cust_salแพ็คเกจที่สร้างขึ้นด้านบน ผมคิดว่าเรามีอยู่แล้วลูกค้าสร้างตารางในฐานข้อมูลของเราเป็นที่กล่าวถึงในPL / SQL - ตัวแปรบท
CREATE OR REPLACE PACKAGE BODY cust_sal AS
PROCEDURE find_sal(c_id customers.id%TYPE) IS
c_sal customers.salary%TYPE;
BEGIN
SELECT salary INTO c_sal
FROM customers
WHERE id = c_id;
dbms_output.put_line('Salary: '|| c_sal);
END find_sal;
END cust_sal;
/
เมื่อรหัสด้านบนถูกเรียกใช้ที่พรอมต์ SQL จะให้ผลลัพธ์ดังต่อไปนี้ -
Package body created.
การใช้องค์ประกอบแพ็คเกจ
องค์ประกอบแพ็คเกจ (ตัวแปรโพรซีเดอร์หรือฟังก์ชัน) เข้าถึงได้ด้วยไวยากรณ์ต่อไปนี้ -
package_name.element_name;
พิจารณาว่าเราได้สร้างแพ็คเกจข้างต้นในสคีมาฐานข้อมูลของเราแล้วโปรแกรมต่อไปนี้ใช้ไฟล์ find_sal วิธีการของ cust_sal แพ็คเกจ -
DECLARE
code customers.id%type := &cc_id;
BEGIN
cust_sal.find_sal(code);
END;
/
เมื่อรหัสด้านบนถูกเรียกใช้ที่พรอมต์ SQL ระบบจะแจ้งให้ป้อน ID ลูกค้าและเมื่อคุณป้อน ID จะแสดงเงินเดือนที่เกี่ยวข้องดังนี้ -
Enter value for cc_id: 1
Salary: 3000
PL/SQL procedure successfully completed.
ตัวอย่าง
โปรแกรมต่อไปนี้มีแพ็คเกจที่สมบูรณ์มากขึ้น เราจะใช้ตารางลูกค้าที่เก็บไว้ในฐานข้อมูลของเราโดยมีบันทึกต่อไปนี้ -
Select * from customers;
+----+----------+-----+-----------+----------+
| ID | NAME | AGE | ADDRESS | SALARY |
+----+----------+-----+-----------+----------+
| 1 | Ramesh | 32 | Ahmedabad | 3000.00 |
| 2 | Khilan | 25 | Delhi | 3000.00 |
| 3 | kaushik | 23 | Kota | 3000.00 |
| 4 | Chaitali | 25 | Mumbai | 7500.00 |
| 5 | Hardik | 27 | Bhopal | 9500.00 |
| 6 | Komal | 22 | MP | 5500.00 |
+----+----------+-----+-----------+----------+
ข้อกำหนดแพ็คเกจ
CREATE OR REPLACE PACKAGE c_package AS
-- Adds a customer
PROCEDURE addCustomer(c_id customers.id%type,
c_name customerS.No.ame%type,
c_age customers.age%type,
c_addr customers.address%type,
c_sal customers.salary%type);
-- Removes a customer
PROCEDURE delCustomer(c_id customers.id%TYPE);
--Lists all customers
PROCEDURE listCustomer;
END c_package;
/
เมื่อรหัสด้านบนถูกเรียกใช้ที่พรอมต์ SQL จะสร้างแพ็คเกจด้านบนและแสดงผลลัพธ์ต่อไปนี้ -
Package created.
การสร้างเนื้อหาแพ็คเกจ
CREATE OR REPLACE PACKAGE BODY c_package AS
PROCEDURE addCustomer(c_id customers.id%type,
c_name customerS.No.ame%type,
c_age customers.age%type,
c_addr customers.address%type,
c_sal customers.salary%type)
IS
BEGIN
INSERT INTO customers (id,name,age,address,salary)
VALUES(c_id, c_name, c_age, c_addr, c_sal);
END addCustomer;
PROCEDURE delCustomer(c_id customers.id%type) IS
BEGIN
DELETE FROM customers
WHERE id = c_id;
END delCustomer;
PROCEDURE listCustomer IS
CURSOR c_customers is
SELECT name FROM customers;
TYPE c_list is TABLE OF customers.Name%type;
name_list c_list := c_list();
counter integer :=0;
BEGIN
FOR n IN c_customers LOOP
counter := counter +1;
name_list.extend;
name_list(counter) := n.name;
dbms_output.put_line('Customer(' ||counter|| ')'||name_list(counter));
END LOOP;
END listCustomer;
END c_package;
/
ตัวอย่างข้างต้นใช้ประโยชน์จากไฟล์ nested table. เราจะกล่าวถึงแนวคิดของตารางที่ซ้อนกันในบทถัดไป
เมื่อรหัสด้านบนถูกเรียกใช้ที่พรอมต์ SQL จะให้ผลลัพธ์ดังต่อไปนี้ -
Package body created.
การใช้แพ็คเกจ
โปรแกรมต่อไปนี้ใช้วิธีการประกาศและกำหนดไว้ในแพคเกจc_package
DECLARE
code customers.id%type:= 8;
BEGIN
c_package.addcustomer(7, 'Rajnish', 25, 'Chennai', 3500);
c_package.addcustomer(8, 'Subham', 32, 'Delhi', 7500);
c_package.listcustomer;
c_package.delcustomer(code);
c_package.listcustomer;
END;
/
เมื่อรหัสด้านบนถูกเรียกใช้ที่พรอมต์ SQL จะให้ผลลัพธ์ดังต่อไปนี้ -
Customer(1): Ramesh
Customer(2): Khilan
Customer(3): kaushik
Customer(4): Chaitali
Customer(5): Hardik
Customer(6): Komal
Customer(7): Rajnish
Customer(8): Subham
Customer(1): Ramesh
Customer(2): Khilan
Customer(3): kaushik
Customer(4): Chaitali
Customer(5): Hardik
Customer(6): Komal
Customer(7): Rajnish
PL/SQL procedure successfully completed