EXECUTE ... USING
chỉ hoạt động trong PL/PgSQL - tức là trong phạm vi chức năng hoặc DO
blocks viết bằng ngôn ngữ PL/pgSQL. Nó không hoạt động trong SQL đơn giản; các EXECUTE
trong SQL đơn giản là hoàn toàn khác nhau, để thực hiện các câu lệnh chuẩn bị. Bạn không thể sử dụng SQL động trực tiếp trong phương ngữ SQL của PostgreSQL.
Hãy so sánh:
Xem mệnh cuối cùng 2 trong my prior answer.
Ngoài việc không chạy ngoại trừ PL/PgSQL câu lệnh SQL của bạn sai, nó sẽ không làm những gì bạn mong đợi. Nếu (select id from ids where condition = some_condition)
trả về nói 42
, tuyên bố sẽ thất bại nếu id
là một số nguyên. Nếu được truyền tới văn bản bạn sẽ nhận được:
EXECUTE format('SELECT * from result_%s_table', quote_ident('42'));
EXECUTE format('SELECT * from result_%s_table', '"42"');
EXECUTE 'SELECT * from result_"42"_table';
Không hợp lệ. Bạn thực sự muốn result_42_table
hoặc "result_42_table"
. Bạn sẽ phải viết một cái gì đó giống như:
EXECUTE format('SELECT * from %s', quote_ident('result_'||(select id from ids where condition = some_condition)||'_table'))
... nếu bạn phải sử dụng quote_ident
.
Nguồn
2012-10-08 10:59:01
Chỉ cần để bổ sung, một 'khối DO' luôn trả về void và chấp nhận không có tham số vì vậy tôi nghĩ rằng OP được giới hạn một hàm. –
@Clodoaldo Điểm tốt - chúng có thể thực thi 'SELECT' nhưng nó sẽ không làm chúng tốt trừ khi chúng làm một cái gì đó thực sự xoay vòng như' SELECT ... INTO' một bảng tạm thời. –
@CraigRinger Xin chào, tôi biết tôi đã đến muộn một chút, nhưng bạn có thể đề xuất bất kỳ hướng dẫn tốt nào cho sql động trong postgreSQL không? Tôi không thể tìm thấy. Tôi muốn tạo một truy vấn động tất cả-trong-một. Kiểm tra câu hỏi [this] (https://stackoverflow.com/questions/48216935/pl-pgsql-for-all-in-one-dynamic-query) nếu bạn muốn. Cảm ơn bạn – slevin