Bài học theo mô-đun (2/4)
Logic nâng cao với PL/pgSQL
Các hàm được viết bằng LANGUAGE sql chỉ có thể chạy lần lượt các truy vấn tiêu chuẩn. Nếu chúng tôi cần thứ gì đó nâng cao hơn như "NẾU tổng số đã nhập lớn hơn 100 THÌ áp dụng giảm giá", thì SQL đơn giản không thể tự làm điều đó. Chúng ta cần sử dụng PL/pgSQL, một ngôn ngữ lập trình thủ tục chính thức được tích hợp trong Postgres.
Trong PL/pgSQL, chúng tôi thêm các phần nội dung cổ điển được tạo thành từ BEGIN .. END, các biến và câu lệnh điều kiện.
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;Sức mạnh này cho phép chúng tôi giảm tải các khối logic lặp đi lặp lại khổng lồ mà chúng tôi thường viết trong JS, đóng gói chúng thành các hàm an toàn, nhanh chóng được thực thi gần với dữ liệu với độ trễ rất thấp!
Hãy tự mình thử
Chúng tôi muốn một hàm phức tạp có thể tự thay thế nếu nó đã tồn tại ('get_price_label'), chấp nhận 'price' là NUMERIC và trả về một TEXT dài dòng.\nSử dụng PL/pgSQL. Mở BEGIN.\nViết logic: nếu giá > 100,00 thì trả về chuỗi 'Premium'. ELSE trả về 'Economico'.\nĐóng END có điều kiện; và cơ thể.
Hiển thị gợi ý
TẠO HOẶC THAY THẾ CHỨC NĂNG get_price_label(price NUMERIC) TRẢ LẠI VĂN BẢN NHƯ $$ BẮT ĐẦU NẾU giá > 100,00 SAU ĐÓ TRẢ LẠI 'Premium'; ELSE TRẢ LẠI 'Kinh tế'; KẾT THÚC NẾU; KẾT THÚC; $$ NGÔN NGỮ plpgsql;
Giải pháp khả dụng sau 3 lần thử
Bạn có thể khai báo các biến tạm thời trước BEGIN bằng từ khóa DECLARE.\nViết hàm 'saluta_utente(userid INTEGER)' -> Trả về logic TEXT, PL/pgSQL.\nBên trong nó KHAI THÁC một biến chuỗi 'nome_utente TEXT;'.\nSau đó, bên trong BEGIN, điền biến đó với first_name bằng cách truy vấn động 'khách hàng' bằng cách sử dụng mệnh đề đặc biệt 'SELECT first_name INTO nome_utente FROM... Ở ĐÂU id = userid'. Cuối cùng, RETURN nối biến thành 'Ciao '.
Hiển thị gợi ý
KHAI THÁC nome_utente TEXT; \nBEGIN CHỌN tên_tên VÀO nome_utente... \nRETURN 'Ciao ' || nome_utente;
Giải pháp khả dụng sau 3 lần thử