Có một số vấn đề ở đây.
Bạn không thể chỉ gọi bất kỳ hàm C nào từ SQL
Đầu tiên, bạn không thể chỉ gọi các hàm tùy ý từ SQL, bạn phải sử dụng các API và macro mở rộng C của PostgreSQL; xem các triển khai hiện có của các hàm có thể gọi trong SQL trong các nguồn để biết ví dụ.
Bạn thường không phải sửa đổi mã lõi, các tiện ích mở rộng thường là đủ
Thứ hai, nếu bạn muốn thêm các chức năng vào PostgreSQL cốt lõi, bạn phải thêm chúng vào src/include/catalog/pg_proc.h
vì vậy chúng được xác định trong initdb
.
Tuy nhiên, tốt hơn nhiều là sử dụng các phương tiện tải tiện ích mở rộng thích hợp:
- http://www.postgresql.org/docs/ current / static / xfunc-c.html
- http://www.postgresql.org/docs/ current / static / expand-pgxs.html
Bằng cách này, bạn có thể LOAD
một mô-đun mở rộng, CREATE FUNCTION
C hoạt động theo tài liệu và gọi chúng từ SQL.
Trong trường hợp cụ thể của bạn, có vẻ như bạn làm cần phải sửa đổi cơ sở mã lõi, nhưng điều này khá bất thường, vì vậy tôi bảo lưu lời khuyên này cho những người khác.
Một hàm C trong phần phụ trợ PostgreSQL không thể được gọi "trực tiếp" từ GUI
Bạn có Java Swing GUI và bạn hình dung bằng cách nào đó gọi một hàm C trong một quy trình khác, thậm chí có thể trên một máy chủ khác, từ nó.
Điều này sẽ không hoạt động vì nhiều lý do, bao gồm:
- Java không thể gọi trực tiếp các hàm C mà không có mã keo như
JNI
hoặcJNA
. - Không thể gọi trực tiếp một hàm C trong một quy trình khác; thay vào đó, bạn phải sử dụng giao tiếp giữa các quá trình (bộ nhớ dùng chung, đường ống, ổ cắm, tệp được chia sẻ, v.v.) để trao đổi thông tin
- Mặc dù bạn có thể nhúng một trình thông dịch Java vào phần phụ trợ Pg và gọi hàm C qua kiểu trực tiếp JNI, bạn thực sự là không muốn hiển thị Swing GUI trực tiếp từ bên trong phần phụ trợ Pg.
Những gì bạn cần là một quy trình gồm nhiều giai đoạn:
-
Thu thập dữ liệu bạn muốn nắm bắt trong phần phụ trợ PostgreSQL. Nếu bạn định truy cập nó từ cùng một kết nối mà nó được tạo, bạn có thể sử dụng một
palloc
thông thường đệm. Nếu không, bạn sẽ cần phân bổ bộ đệm ra khỏi bộ nhớ dùng chung hoặc trao đổi dữ liệu bằng hệ thống tệp. -
Truy cập dữ liệu đó từ một hàm C đã được tạo bằng giao diện SQL có thể gọi được theo tài liệu về hàm mở rộng C của PostgreSQL (ở trên)
-
Sử dụng kết nối PostgreSQL để chuyển dữ liệu từ hàm giao diện có thể gọi SQL sang ứng dụng Java của bạn. Giải mã nó trong ứng dụng của bạn và hiển thị nó như mong muốn.
Thay thế:
-
Yêu cầu chương trình Java của bạn hoặc một tác nhân cho nó, chạy trên cùng một hệ thống với máy chủ PostgreSQL và yêu cầu tác nhân ghi tệp ở vị trí có thể ghi vào Pg và chương trình của bạn có thể đọc được.
-
Đọc các tệp bằng chương trình của bạn hoặc tác nhân của chương trình và xử lý chúng để hiển thị
Bạn thậm chí có thể yêu cầu ghi Pg vào một ổ cắm mà chương trình của bạn đang nghe, nhưng tôi không khuyên bạn nên điều này vì một sự cố trong chương trình của bạn sẽ gây ra các vấn đề về hiệu suất trong PostgreSQL.