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) אשר משמש בדרך כלל להדפסה לפלט הסטנדרטי:


```plsql
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

לדוגמה:

```plsql
IF :NEW.FieldName is null
THEN
NEW.FieldName :=Value:
END IF;
```


### לולאות

# LOOP
# FOR LOOP
# WHILE LOOP
# CURSOR FOR LOOP

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

קטגוריה:שפות תכנות
קטגוריה:אורקל