Sử dụng Raw SQL, Function & Procedure trong PostgreSQL

PostgreSQL là cơ sở dữ liệu quan hệ mạnh mẽ hỗ trợ hệ thống các hàm tự định nghĩa User Defined Function (UDF)Stored Procedure phong phú. Khi làm việc với PostgreSQL mà không thông qua Entity, bạn sẽ dùng đối tượng DataSource kết hợp với cú pháp SQL đặc trưng của Postgres. Dưới đây là hướng dẫn chi tiết cách viết prompt để Claude Code sinh mã nguồn và thực thi các câu lệnh này trong NestJS thông qua lớp DataSource.

1. Gọi Database Function và Stored Procedure trong PostgreSQL

PostgreSQL phân biệt rõ ràng giữa Function (Hàm - trả về dữ liệu) và Procedure (Thủ tục - không trả về dữ liệu trực tiếp). Cách gọi của hai đối tượng này dưới mã nguồn hoàn toàn khác nhau:
  • Hàm (Database Function - tạo bằng CREATE FUNCTION): Sử dụng lệnh SELECT để kích hoạt (kể cả khi hàm thực hiện logic cập nhật dữ liệu UPDATE bên trong).
  • Thủ tục (Stored Procedure - tạo bằng CREATE PROCEDURE): Sử dụng từ khóa CALL để kích hoạt.
Hãy viết một service 'BillingService' trong file 'src/billing/billing.service.ts':
- Sử dụng 'DataSource' để chạy các câu lệnh SQL thuần túy trực tiếp, không sử dụng Entity.
- Viết hàm 'calculateTax(subtotal, taxRate)': Gọi Database Function 'calculate_tax_amount($1, $2)' bằng lệnh SELECT.
- Viết hàm 'updatePaymentStatus(invoiceId, status)': Gọi Stored Procedure 'update_invoice_status_proc($1, $2)' bằng lệnh CALL.
- Hãy sử dụng ký tự giữ chỗ dạng $1, $2 đặc trưng của PostgreSQL để truyền tham số an toàn.

2. Thực thi ghi dữ liệu thuần túy (INSERT, UPDATE, DELETE)

PostgreSQL sử dụng ký tự giữ chỗ dạng $1, $2, $3 làm tham số truyền tin an toàn. Ngoài ra, PostgreSQL hỗ trợ từ khóa RETURNING giúp bạn lấy về các dữ liệu của dòng vừa ghi một cách nhanh chóng mà không cần chạy thêm lệnh SELECT phụ.
Hãy viết một service 'RawProductsService' trong file 'src/products/raw-products.service.ts':
- Sử dụng 'DataSource' để chạy các câu lệnh SQL thuần túy (INSERT, UPDATE, DELETE) trực tiếp trên PostgreSQL, không dùng Entity.
- Hàm 'insertProduct' nhận vào name, price, description: Chạy lệnh INSERT INTO bảng 'products' và sử dụng RETURNING id, name, price để nhận về thông tin dòng vừa tạo.
- Hàm 'updateProductPrice' nhận vào id và newPrice: Chạy lệnh UPDATE.
- Hàm 'deleteProduct' nhận vào id: Chạy lệnh DELETE FROM.
- Bắt buộc dùng placeholders dạng $1, $2...