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