دروس الوحدة (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، وترجع نصًا مطولًا.\nاستخدم PL/pgSQL. افتح BEGIN.\nاكتب المنطق: إذا كان السعر > 100.00، قم بإرجاع السلسلة "Premium". ELSE يُرجع 'Economico'.\nأغلق النهاية الشرطية؛ والجسم.
إظهار التلميح
إنشاء أو استبدال الدالة get_price_label(price NUMERIC) إرجاع النص كـ $$ ابدأ إذا كان السعر> 100.00 ثم قم بإرجاع "Premium"؛ آخر العودة "Economico"؛ نهاية إذا؛ نهاية؛ $$ اللغة plpgsql;
الحل متاح بعد 3 من المحاولات
يمكنك تعريف المتغيرات المؤقتة قبل البدء باستخدام الكلمة الأساسية DECLARE.\nاكتب دالة 'saluta_utente(userid INTEGER)' -> إرجاع TEXT، منطق PL/pgSQL.\nداخلها قم بتعريف متغير سلسلة 'nome_utente TEXT;'.\nثم، داخل BEGIN، قم بملء هذا المتغير بالاسم الأول عن طريق الاستعلام ديناميكيًا عن 'customers' باستخدام الجملة الخاصة 'SELECT first_name INTO nome_utente FROM... WHERE id = userid'. أخيرًا، تقوم RETURN بربط المتغير بـ 'Ciao'.
إظهار التلميح
أعلن nome_utente TEXT؛ \nابدأ بتحديد الاسم_الأول في nome_utente... \nإرجاع 'Ciao' || nome_utente;
الحل متاح بعد 3 من المحاولات