2012-10-08 17 views
13

Tôi đã cố gắng sử dụng SQL động để chạy một số truy vấn trong postgres.truy vấn sql động trong postgres

Ví dụ:

EXECUTE format('SELECT * from result_%s_table', quote_ident((select id from ids where condition = some_condition))) 

tôi phải truy vấn một bảng, trong đó có dạng result_% s_table trong đó, tôi cần phải thay thế các tên bảng đúng (id) từ một bảng khác.

tôi nhận được lỗi ERROR: prepared statement "format" does not exist

Link: string substitution with query result postgresql

Trả lời

21

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.

+1

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

+1

@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. –

+1

@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

1

EXECUTE sẽ chỉ hoạt động trên môi trường pl/pqsql.

thay vì EXECUTE thử với SELECT

SELECT format('SELECT * from result_%s_table', quote_ident((select id from ids where condition = some_condition)) 

đầu ra sẽ là truy vấn năng động.

+0

Văn bản của truy vấn động, chắc chắn, nhưng nó sẽ không * thực hiện * truy vấn. Xem bài đăng được liên kết trước đó. –

+0

vâng tôi đã trải qua việc thực thi qry động chi tiết của ur, ở đây chỉ là những gì tôi đã đề cập là EXECUTE sẽ chỉ hoạt động trong môi trường pl/pqsql, và khi tôi đăng câu trả lời của mình, tôi thực sự không nhận thấy phản hồi của ur. – solaimuruganv

+0

Không phải lo lắng. Nó chỉ không trả lời câu hỏi, đó là làm thế nào để * thực thi * SQL động. –

3

Hãy thử sử dụng

RETURN QUERY EXECUTE '<SQL Command>' 

này sẽ trả lại dữ liệu vào dạng bảng. Bạn phải sử dụng nó vào chức năng được lưu trữ của PostgreSQL.

Tôi đã tạo một bản trình diễn đầy đủ về bộ lọc tùy chỉnh và sắp xếp tùy chỉnh bằng truy vấn động của PostgreSQL. Vui lòng truy cập url này: http://www.dbrnd.com/2015/05/postgresql-dynamic-sql/

0
CREATE OR REPLACE FUNCTION public.exec(
text) 
RETURNS SETOF RECORD 
LANGUAGE 'plpgsql' 
AS $BODY$ 
BEGIN 
    RETURN QUERY EXECUTE $1 ; 
END 
$BODY$; 

sử dụng:

select * from exec('select now()') as t(dt timestamptz)