PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Gọi một thủ tục được lưu trữ trong một thủ tục được lưu trữ

COPY hơi kỳ cục vì nó xử lý query đối số dưới dạng một chuỗi mặc dù nó không được viết dưới dạng chuỗi. Kết quả là query :

SELECT * FROM retrieve_info($1, $2)

không được thực thi trong ngữ cảnh của hàm, nó được thực thi trong ngữ cảnh của chính COPY. Mặc dù bạn nói:

copy (select * from t) ...

nó được đối xử nhiều hơn như thể bạn đã viết:

copy 'select * from t' ...

vì vậy vào thời điểm truy vấn được thực thi, các tham số hàm không còn ý nghĩa nữa, query đối số đối với COPY có thể trông giống như nó sẽ hoạt động giống như một bao đóng trong các ngôn ngữ khác nhưng không, nó hoạt động giống như một chuỗi được chuyển tới eval .

Bạn có thể khắc phục sự kỳ lạ này bằng cách sử dụng K bùn thông thường của Last Resort:dynamic SQL. Bạn sẽ nhận được kết quả tốt hơn nếu bạn viết hàm của mình để sử dụng chuỗi bao bọc và THỰC HIỆN:

create or replace function print_out(text, text) returns void as $$
begin
    execute 'copy ('
         || 'select * from retrieve_info'
         ||     '(' || quote_literal($1) || ',' || quote_literal($2) || ')'
         || ') to ''myfilepath/test.csv'' with csv header;';
end;
$$ language plpgsql;


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Duy trì UUID trong PostgreSQL bằng JPA

  2. Oracle đến PostgreSQL:Cú pháp nối ngoài ANSI trong PostgreSQL

  3. Sắp xếp các phần tử mảng

  4. TypeError:Đối tượng 'int' không hỗ trợ lập chỉ mục

  5. Có gì mới trong PostgreSQL 11