שיעורי מודול (2/4)
לוגיקה מתקדמת עם PL/pgSQL
פונקציות שנכתבו ב-LANGUAGE sql יכולות להריץ שאילתות סטנדרטיות בזו אחר זו. אם היינו צריכים משהו יותר מתקדם כמו "אם הסכום שהוזן גדול מ-100 אז תחיל הנחה", SQL חשוף לא יכול לעשות זאת בעצמו. עלינו להשתמש ב-PL/pgSQL, שפת תכנות פרוצדורלית מלאה המובנית ב-Postgres.
ב-PL/pgSQL נוסיף את הגופים הקלאסיים העשויים מ-BEGIN .. END, משתנים והצהרות מותנות.
CREATE OR REPLACE FUNCTION valuta_cliente(ordini INTEGER)
RETURNS TEXT AS $$
BEGIN
IF ordini > 10 THEN
RETURN 'VIP';
ELSE
RETURN 'Standard';
END IF;
END;
$$ LANGUAGE plpgsql;הכוח הזה מאפשר לנו להוריד בלוקים מאסיביים של לוגיקה חוזרת שהיינו כותבים אחרת ב-JS, לארוז אותם לתוך פונקציות בטוחות ומהירות המבוצעות קרוב לנתונים עם חביון נמוך מאוד!
נסה זאת בעצמך
אנו רוצים פונקציה מורכבת שתחליף את עצמה אם היא כבר קיימת ('get_price_label'), מקבלת 'price' בתור NUMERIC ומחזירה TEXT מילולי.\nהשתמש ב-PL/pgSQL. פתח את BEGIN.\nכתוב את ההיגיון: אם המחיר הוא > 100.00 החזר את המחרוזת 'Premium'. ELSE החזירו 'Economico'.\nסגור את ה-END המותנה; ואת הגוף.
הצג רמז
CREATE OR REPLACE FUNCTION get_price_label(price NUMERIC) מחזיר טקסט כ$$ BEGIN IF price > 100.00 ואז החזר 'Premium'; ELSE RETURN 'Economico'; END IF; סוֹף; $$ LANGUAGE plpgsql;
הפתרון זמין לאחר 3 ניסיונות
אתה יכול להכריז על משתנים זמניים לפני BEGIN עם מילת המפתח DECLARE.\nכתוב פונקציה 'saluta_utente(userid INTEGER)' -> מחזירה TEXT, PL/pgSQL logic.\nבתוכה הכרזה על משתנה מחרוזת 'nome_utente TEXT;'.\nלאחר מכן, בתוך BEGIN, אכלס את המשתנה המיוחד עם 'שם_המיוחד' באמצעות 'שם_קודם'. סעיף 'SELECT first_name INTO nome_utente FROM... WHERE id = userid'. לבסוף, RETURN משרשרת את המשתנה ל'Ciao '.
הצג רמז
DECLARE nome_utente TEXT; \nBEGIN SELECT first_name INTO nome_utente... \nהחזר 'Ciao ' || nome_utente;
הפתרון זמין לאחר 3 ניסיונות