Cấu trúc này không thể thực hiện được:
IF EXECUTE 'EXISTS (SELECT 1 FROM mytable)' THEN ...
Bạn có thể đơn giản hóa thành:
IF EXISTS (SELECT 1 FROM mytable) THEN ...
Nhưng ví dụ của bạn có thể được đơn giản hóa. Đối với SQL động được thực thi bằng EXECUTE
, đọc hướng dẫn sử dụng tại đây. Bạn có thể kiểm tra biến đặc biệt FOUND
ngay sau khi thực hiện bất kỳ lệnh DML nào để xem có hàng nào ở đây bị ảnh hưởng hay không:
IF FOUND THEN ...
Tuy nhiên:
Đặc biệt lưu ý rằng
EXECUTE
thay đổi kết quả đầu ra củaGET DIAGNOSTICS
, nhưng không thay đổiFOUND
.
Tôi nhấn mạnh đậm. Đối với EXECUTE
đơn giản thay vào đó hãy làm điều này:
...
DECLARE
i int;
BEGIN
EXECUTE 'SELECT 1 FROM mytable'; -- something dynamic here
GET DIAGNOSTICS i = ROW_COUNT;
IF i > 0 THEN ...
Hoặc nếu có cơ hội - cụ thể là chỉ có kết quả một hàng - hãy sử dụng INTO
mệnh đề với EXECUTE
để nhận trực tiếp kết quả từ truy vấn động. Tôi trích dẫn sách hướng dẫn ở đây:
Nếu một hàng hoặc danh sách biến được cung cấp, nó phải khớp chính xác với cấu trúc của kết quả của truy vấn (khi một biến bản ghi được sử dụng, nó sẽ tự động cấu hình để khớp với cấu trúc kết quả một cách tự động). Nếu trả về nhiều hàng, thì chỉ hàng đầu tiên sẽ được gán cho
INTO
Biến đổi. Nếu không có hàng nào được trả về, NULL được gán choINTO
(các) biến.
...
DECLARE
_var1 int; -- init value is NULL unless instructed otherwise
BEGIN
EXECUTE format('SELECT var1 FROM %I WHERE x=y LIMIT 1', 'my_Table')
INTO _var1;
IF _var1 IS NOT NULL THEN ...