Chuyển đến nội dung chính
Mô-đun 12 · Bài học 2 trong tổng số 446/57 trong khóa học~15 min
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.

SQL
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ử

tập thể dục#sql.m12.l2.e1
Nỗ lực: 0Đang tải…

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ể.

Đang tải trình chỉnh sửa…
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ử

tập thể dục#sql.m12.l2.e2
Nỗ lực: 0Đang tải…

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 '.

Đang tải trình chỉnh sửa…
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ử