PL/SQL

PL/SQL (באנגלית: Procedural Language/Structured Query Language) היא שפת תכנות פרוצדורלית קניינית של חברת אורקל ונעשה בה שימוש בעיקר בבסיס הנתונים אורקל. שפת התכנות משלבת את שפת SQL בצורה טבעית ומאפשרת עיבוד נתונים על שרת בסיס הנתונים וללא תחלופה של מידע בינו ובין תחנת לקוח.

כללי 
מכיוון ששפת SQL היא שפה דקלרטיבית, היא אינה מאפשרת עיבוד מידע בצורה נוחה - לדוגמה, לא ניתן לבצע בה לולאות. כדי לענות על הצורך בשפה פרוצדורלית, הוציאה חברת אורקל בשנת 1989 תמיכה ראשונה בשפה שכזו כחלק מבסיס הנתונים (גרסה 6). שפת PL/SQL תומכת במשתנים, תנאים, מערכים וניהול שגיאות. החל מגרסה 9, תומכת השפה גם ביצור והפעלה קוד דינמי בזמן הריצה כל ידי הפקודה "Execute immediate". אפשרות זו מאפשרת שימוש חדש ב-PL/SQL: ביצוע של פקודות DDL אשר לא התאפשרו עד אז ללא שימוש במארזים מובנים.

שפת PL/SQL משמשת לשם כתיבת פרוצדורות, פונקציות, מארזים וטריגרים המאוכסנים בתוך בסיס-הנתונים. מארזים הם תוכניות המקבצות בתוכן פרוצדורות, פונקציות, וכן משתנים גלובליים פרטיים או פומביים. טריגרים (Triggers) הם קטעי קוד המופעלים באופן אוטומטי בעקבות אירועים מסוגים שונים שיכולים להתרחש בבסיס-הנתונים, כגון: פקודות DML, כניסה ויציאה (Logon/Logoff) או שגיאות בשרת בסיס-הנתונים.

שימוש נוסף ב-PL/SQL הוא לשם כתיבת בלוקים אנונימיים (Anonymous Blocks) שהם קטעי קוד שנשלחים לשם הרצה מידית ולא נשמרים בבסיס-הנתונים לשם הרצה חוזרת. בנוסף, משמשת השפה לכתיבת קוד מבוסס אירועים בכלי פיתוח השייכים לחבילת Oracle Developer Suite.

תחביר

מבנה הקוד 
קוד PL/SQL מזכיר במבנהו את שפת עדה (Ada). הוא מתחיל במילה DECLARE (עבור בלוק אנונימי) או בשורת הגדרה של תוכנית לא אנונימית (כגון פרוצדורה). לאחר מכן, ניתן להגדיר משתנים ופונקציות ופרוצדורות פנימיות. (בבלוק אנונימי ללא משתנים אין לכתוב DECLARE). התחלת הקוד הביצועי מסומנת במילה BEGIN. מתחת לשורה זו ניתן לכתוב פקודות PL/SQL שונות כמו גם יצירה של בלוקים נוספים שבהם יוגדרו משתנים נוספים וכן הלאה. כל פקודה בPL/SQL צריכה להסתיים בסימן ;. כדי לטפל בשגיאות העלולות להתעורר בתוכנה, ניתן להוסיף בלוק של טיפול בחריגות: EXCEPTION ובו התניה לאילו שגיאות על הבלוק הזה לתפוס. כל קטע קוד של PL/SQL מסתיים בשורה ;END.

דוגמה לתוכנית PL/SQL בסיסית, השולחת את המחרוזת Hello world לחוצץ (buffer) אשר משמש בדרך כלל להדפסה לפלט הסטנדרטי:

DECLARE
 v VARCHAR2(100); /* הגדרת משתנה מסוג VARCHAR2) */
BEGIN
 SELECT 'Hello world' -- שליפת ערך לתוך המשתנה
 INTO v
 FROM dual;

 dbms_output.put_line ( v ); -- הדפסת המשתנה
EXCEPTION
 when OTHERS then /* טיפול בשגיאות */
 dbms_output.put_line ( 'error: ' || sqlerrm );
END;

התוכנית מדגימה בלוק אנונימי שבו יש הגדרת משתנה, השמת ערך למשתנה באמצעות משפט SQL, שליחת טקסט באמצעות המארז dbms_output, וכן טיפול בסיסי בשגיאות.

משתנים וטיפוסים 
לPL/SQL ישנם סוגים רבים של משתנים, שנחלקים לקטגוריות שונות:
 משתנים מספרים: BINARY_DOUBLE, BINARY_FLOAT, BINARY_INTEGER, DEC, DECIMAL, DOUBLE PRECISION, FLOAT, INT, INTEGER, NATURAL, NATURALN, NUMBER, NUMERIC, PLS_INTEGER, POSITIVE, POSITIVEN, REAL, SIGNTYPE, SMALLINT.
 משתנים טקסטואליים: CHAR, CHARACTER, LONG, NCHAR, NVARCHAR2, STRING, VARCHAR, VARCHAR2
 משתנים בינאריים: RAW, LONG RAW
 משתנים של מצביעי-רשומה: ROWID, UROWID
 משתנה בוליאני: BOOLEAN
 משתנים תאריכיים: DATE, TIMESTAMP, TIMESTAMP WITH TIMEZONE, TIMESTAMP WITH LOCAL TIMEZONE, INTERVAL YEAR TO MONTH, INTERVAL DAY TO SECOND
 משתנה צמוד-טבלה: ניתן להגדיר משתנה יחיד אשר יקבל תמיד את הסוג של עמודה בטבלה על ידי השימוש במילת הבקרה TYPE%.
 מבנה נתונים צמוד-טבלה: ניתן להגדיר משתנה יחיד אשר יתנהג כמבנה ובו רשימת העמודות של הטבלה על ידי שימוש במילה המקרה ROWTYPE%.
 משתנה בגודל בלתי מוגבל: LOB - משתנים היכולים להכיל כמות בתים בלתי מוגבלת, בכפוף למגבלות בסיס-הנתונים. משמשים לטיפול במידע בינארי (BLOB) או טקסטואלי (CLOB, NCLOB).
 משתנה מסוג אובייקט בסיס-נתונים: ניתן להשתמש ביכולות מונחות עצמים של אורקל לשם הגדרת משתנים של אובייקטים, שהגדרתם נשמרת במילון הנתונים. דוגמה נפוצה לכך היא XMLTYPE שמיועד לטיפול במידע XML.
 משתנים מסוג Cursor יכולים לשמור בתוכם שאילתות ובאמצעות לולאות ניתן לעבור על המידע שמחזירה השאילתא.

מעבר לסוגים בסיסים אלה, ניתן להגדיר בשפה מערכים (המכונים Collection).

תנאים 

IF- תנאי לביצוע פעולה על הרשומה הנוכחית או הצגת הודעת שגיאה מתאימה.
ELSIF
CASE WHEN

לדוגמה:
IF :NEW.FieldName is null
THEN
NEW.FieldName :=Value:
END IF;

לולאות 

 LOOP
 FOR LOOP
 WHILE LOOP
 CURSOR FOR LOOP

קישורים חיצוניים 
 

שפות תכנות
אורקל