Oracle PL/SQL Tips : How to show Oracle procedure usages
Oracle PL/SQL Tips : How to show Oracle procedure usages
สวัสดีครับ ห่างหายกันไปนานวันนี้กลับมาอีกครั้ง พร้อมของฝากติดมือมาพิมพ์เลยครับ ของฝากวันนี้คงจะเหมาะสำหรับคน
ที่ใช้ PL/SQL เป็นนิจครับ โดยปกติเวลาพัฒนา Procedure หรือ Function มักจะต้องมีการรับ/ส่งค่าด้วยเสมอๆ
และเคยหรือไม่ว่า เวลาเราไปเรียกใช้ Procedure/Function ที่เราไม่ได้พัฒนา เราจะรู้ได้ยังไงว่า Procedure เหล่านั้น
เรียกใช้งานอย่างไร ต้องมี Arguments ส่งเข้าไปหรือไม่ หรือต้องรับค่าจาก Procedure ด้วย Datatype อะไร
สำหรับคนที่มีประสบการณ์มาก่อนจะมีวิธีการตรวจสอบการเรียกใช้ Procuder/Function ด้วยการเรียกดูจาก
object ชื่อ “ALL_SOURCE” หรือ “USER_SOURCE” ดังตัวอย่าง สมมติว่าต้องการดูว่า Procedure “SHOW_TEXT” ต้องรับ parameters อะไรบ้าง
select * from all_sourcewhere owner=’TONY’ and name=’SHOW_TEXT’; |
เราจะได้ผลลัพธ์ดังนี้
OWNER | NAME | TYPE | LINE | TEXT |
TONY | SHOW_TEXT | PROCEDURE | 1 | procedure show_text (v_in varchar2) as |
TONY | SHOW_TEXT | PROCEDURE | 2 | begin |
TONY | SHOW_TEXT | PROCEDURE | 3 | dbms_output.put_line(‘ your input is ‘||v_in); |
TONY | SHOW_TEXT | PROCEDURE | 4 | end show_text ; |
จากผลลัพธ์เราจะเห็นตั้งแต่ชื่อ Procedure จนถึง Code Program โดย Argument ที่ต้องส่งเข้าไปเป็นแบบ IN ประเภท Varchar2 และมีเพียงค่าเดียว
ในกรณีที่มีการสร้างเป็น Package เราสารางเรียกดูได้จาก object “ALL_SOURCE” เช่นกัน แต่ว่ามีวิธีที่ง่ายกว่านั่นคือ เรียกใช้คำสั่ง “DESC <Package_name>” เราจะเห็นว่าภายใน Package มี Procedure/Function อะไรบ้าง รับตัวแปรแบบไหน แต่เราจะไม่เห็น Code Program ดังตัวอย่าง เรียกดูรายละเอียดใน “TEST_PACKAGE” Package
SQL> DESC TEST_PACKAGE
PROCEDURE SHOW_INPUT Argument Name Type In/Out Default? —————————— ———————– ———– ——– V_IN VARCHAR2 IN |
จะเห็นว่าภายใน Package มี Procedure “SHOW_INPUT” ที่รับ Argument เดียวคือ V_IN ประเภท VARCHAR2
แต่…ถ้าผู้พัฒนามีการเข้ารหัสโค้ดโปรแกรมไว้ล่ะ (โดยเรียกใช้เครื่องมือชื่อ WRAP ช่วยก็สามารถปิดบังโค้ดได้) ถ้าเป็นกรณีนี้เราจะไม่สามารถเข้าไปดูรายละเอียดได้เลย
ซึ่งมีอีกวิธีการที่จะทำให้สะดวกต่อผู้ใช้บริการ และไม่ทำให้ Procedure Error หากใส่ Argument ไม่ครบ วิธีการที่ว่านี้คือ เราจะใช้ Technique “Overloading” นั่นเอง
การ Overloading คือการสร้าง Procedure ชื่อเดียวกันแต่กำหนด Arguments ที่มีจำนวนแตกต่างกัน เช่น เราสร้าง Procedure SHOW_INPUT ที่รับข้อมูล 1 Argument, 2 Arguments หรือไม่รับ Arguments เลย โดยทั้ง 3 Procedures มีการสร้างโค้ดที่แตกต่างกันด้วย
เมื่อผู้ใช้บริการเรียกใช้ Procedure ชื่อ SHOW_INPUT โดยใส่ Argument เข้ามา 2 ค่า Oracle ก็จะไปเรียก Procedure ที่มี 2 Arguments ไปทำงาน แต่ถ้าไม่ใส่เลยก็จะไปเรียก Procedure ที่ไม่มีการกำหนด Arguments ไว้มาทำงาน ด้วยคุณสมบติแบบนี้เราจึงสามารถประยุกต์ใช้ในการสร้าง Procedure ให้แสดง Usages : ได้ครับ ดังตัวอย่าง
1. การใช้ Technique Overloading จะต้องสร้าง Procedure ภายใน Package โดยมีตัวอย่าง Package “TEST_PACKAGE” ดังนี้
create or replace package test_package is procedure show_input ( v_in varchar2) ; procedure show_input ; end test_package; /
create or replace package body test_package is
procedure show_input ( v_in varchar2) is begin dbms_output.put_line(‘ your input is ‘||v_in); end show_input ; begin dbms_output.put_line(‘Syntax : show_input(v_in varchar2)’); dbms_output.put_line(‘Example : execute show_input(”your input message”);’); end show_input; end test_package; /
|
จากตัวอย่างได้ทำการสร้าง Procedure “SHOW_INPUT” ซึ่งมีทั้งแบบรับ 1 Argument เพื่อมาแสดงผล และแบบไม่รับ Argument เลย เพื่อมาใช้ในการแสดง Usage ได้
2. ตัวอย่างการเรียกใช้ procedure show_input
SQL> exec test_package.show_input ;
Syntax : show_input(v_in varchar2) Example : execute show_input(‘your input message’); PL/SQL procedure successfully completed. |
จากตัวอย่างถ้าเราไม่ระบุ Argument เข้าไป Oracle จะทำการเรียกใช้ Procedure SHOW_INPUT ที่ไม่มีการรับ Argument แทน ซึ่งผลลัพธ์ก็จะแสดง Syntax/ Usages
ดังนั้นเราจะรู้จักการรูปแบบการเรียกใช้ Procedure ที่เราสนใจได้แล้วครับ