2012-01-11 33 views
8

Tôi đã chuyển đổi một loạt các truy vấn DML (INSERT/UPDATE/DELETE) từ Oracle sang PostgreSQL và bây giờ tôi cần kiểm tra xem chúng có tạo ra cùng một tập hợp các hàng hay không, tức là xóa bỏ các hàng tương tự, giả sử oracle và postgresql cơ sở dữ liệu chứa cùng một dữ liệu ban đầu, cập nhật cập nhật các hàng cùng vv trên PostgreSQL bên, tôi có thể sử dụng mệnh đề trở về với báo cáo DML, tức làTương đương với Oracle của PostgreSQL INSERT ... RETURNING *;

INSERT INTO test(id, name) VALUES(42, 'foo') RETURNING *; 

gì tốt đẹp về tuyên bố trên là tôi có thể thêm vào trước 'trở lại * 'cho bất kỳ câu lệnh DML nào mà không biết cấu trúc hoặc thậm chí tên của bảng được thực thi và chỉ nhận tất cả các hàng như là một câu lệnh chọn.

Tuy nhiên, có vẻ như không sáng bóng ở phía bên Oracle. Theo tài liệu hướng dẫn, Oracle 8i (cái tôi đang làm việc) hỗ trợ mệnh đề RETURNING, nhưng nó phải lưu kết quả vào các biến và dường như không có cách rõ ràng để lấy tất cả các cột kết quả thay vì chỉ định tên cột theo cách thủ công.

Do đó, câu hỏi là nếu có một câu lệnh oracle (hoặc chuỗi các câu lệnh) để mô phỏng PostgreSQL 'trở về *' mà không có tên bảng hoặc cột mã hóa cứng. Nói cách khác, có cách nào để viết một hàm Oracle như thế này:

fn('INSERT INTO test(id, name) VALUES(42, ''foo'')') 

Nó phải trả về tập hợp các hàng được chèn vào (hoặc sửa đổi trong trường hợp chung) bởi câu lệnh SQL.

Cập nhật: Tôi thực sự tìm thấy a very similar question (để chuyển đổi từ máy chủ SQL, không phải PostgreSQL, thành Oracle). Tuy nhiên, tôi rất muốn nghe một câu trả lời đơn giản hơn cho điều đó nếu có thể.

+0

Bạn đang gọi SQL này từ Java, có lẽ? –

+0

Không, thực ra tôi đang gọi chúng từ một kịch bản python, do đó, viết colname trên mỗi câu lệnh, 1 colname2 yêu cầu phân tích cú pháp câu lệnh gốc và trích xuất các tên cột và bảng, đó không phải là điều tôi muốn làm cho nhiệm vụ phụ. – alexk

+0

Tại sao bạn sử dụng phiên bản Oracle không được hỗ trợ và ngừng hoạt động? –

Trả lời

3

Hiện không thể, đặc biệt trong phiên bản cũ của Oracle, chẳng hạn như 8i. Xem điều này answer cho một câu hỏi tương tự.

4

Tôi có thể tưởng tượng một giải pháp liên quan đến EXECUTE IMMEDIATE, RETURNINGREF CURSOR, nhưng rõ ràng nó sẽ không đơn giản. Trước đây tôi đã tìm thấy các giải pháp như this one, involving XML cho các sự cố khi sử dụng các bản ghi loại tùy ý. Họ khá kỳ quái, nói ít nhất. Tôi đoán bạn sẽ phải nghỉ mát để chạy hai truy vấn riêng biệt ... Cụ thể, với Oracle 8i, tôi e rằng bạn thậm chí sẽ không thể kiếm lời từ hầu hết các tính năng đó.

Tóm lại, tôi không nghĩ có bất kỳ cấu trúc SQL nào mạnh mẽ như mệnh đề Postgres ... RETURNING trong Oracle.

Các vấn đề liên quan