2010-08-11 42 views
6

Tôi đang làm việc với cơ sở dữ liệu Oracle 10g và tôi muốn trích xuất một nhóm bản ghi từ một bảng, sau đó sử dụng nó để kéo các bản ghi ra khỏi một loạt các bảng có liên quan.Tạo bảng tạm thời trong PL/SQL

Nếu đây là T-SQL, tôi muốn làm điều đó một cái gì đó như thế này:

CREATE TABLE #PatientIDs (
    pId int 
) 

INSERT INTO #PatientIDs 
    select distinct pId from appointments 

SELECT * from Person WHERE Person.pId IN (select pId from #PatientIDs) 

SELECT * from Allergies WHERE Allergies.pId IN (select pId from #PatientIDs) 

DROP TABLE #PatientIDs 

Tuy nhiên, tất cả các trang hữu ích tôi nhìn vào làm này giống như làm việc nhiều hơn nó có thể có thể được, vì vậy tôi nghĩ rằng tôi phải thiếu một cái gì đó hiển nhiên.

(BTW, thay vì chạy điều này dưới dạng một tập lệnh, có thể tôi sẽ mở phiên trong Oracle SQL Developer, tạo bảng tạm thời, sau đó chạy từng truy vấn, xuất chúng sang CSV khi tôi đi theo. công việc đó?)

Cảm ơn!

+0

Tại sao bạn cần bước bảng tạm thời? Bạn chỉ thay thế một lựa chọn với một lựa chọn khác. Là lựa chọn ban đầu rất tốn kém - Hoặc là nó trong trường hợp một giao dịch đồng thời thay đổi mọi thứ? –

+4

Oracle không phải là SQL Server và các tình huống mà chúng ta cần sử dụng các bảng tạm thời thực sự không phổ biến. Vui lòng đọc câu trả lời của tôi cho câu hỏi tương tự này: http://stackoverflow.com/questions/1192265/local-temporary-table-in-oracle-10-for-the-scope-of-stored-procedure/1193443#1193443 – APC

+0

Tôi đơn giản hóa - những gì tôi thực sự cố gắng làm là lấy 100 bệnh nhân cuối cùng (trừ một chút trùng lặp). Nhưng nói chuyện dưới đây khiến tôi nhớ rằng tôi có thể lấy 100 bệnh nhân bắt đầu lúc nửa đêm sáng nay, và không phải lo lắng về việc SYSDATE thay đổi khi tôi đi cùng. :-) – SarekOfVulcan

Trả lời

12

Oracle có bảng tạm thời, nhưng họ đòi hỏi sự sáng tạo rõ ràng:

create global temporary table... 

Các dữ liệu trong một bảng tạm thời là tư nhân cho phiên đã tạo ra nó và có thể là phiên cụ thể hoặc giao dịch cụ thể. Nếu dữ liệu là không phải sẽ bị xóa cho đến khi phiên kết thúc, bạn cần sử dụng ON COMMIT PRESERVE ROWS ở cuối câu lệnh tạo. Ngoài ra cũng không có rollback hoặc cam kết hỗ trợ cho họ ...

Tôi thấy không cần cho bảng tạm thời trong ví dụ bạn đưa ra - nó có nguy cơ cập nhật được thực hiện cho bảng APPOINTMENTS kể từ khi bảng temp được điền sẽ không được phản ánh. Sử dụng IN/EXISTS/THAM GIA:

SELECT p.* 
    FROM PERSON p 
WHERE EXISTS (SELECT NULL 
       FROM APPOINTMENTS a 
       WHERE a.personid = a.id) 

SELECT p.* 
    FROM PERSON p 
WHERE p.personid IN (SELECT a.id 
         FROM APPOINTMENTS a) 

SELECT DISTINCT p.* 
    FROM PERSON p 
    JOIN APPOINTMENTS a ON a.id = p.personid 

tham gia rủi ro bản sao nếu có nhiều hơn một hồ sơ liên quan đến HẸN lên mức kỷ lục NGƯỜI duy nhất, đó là lý do tôi đã thêm các DISTINCT.

+0

Đó là cách tôi đang cân nhắc thực hiện nó lúc đầu, nhưng tôi lọc nó cho apptDate SarekOfVulcan

+0

ngày hôm qua là 'apptdDate> = trunc (sysdate) -1 và apptdDate ThinkJet

5

Khi vấn đề chính xác đã được giải quyết, nếu bạn muốn xây dựng một số kỹ năng hữu ích trong lĩnh vực này, tôi sẽ xem xét các bộ sưu tập PL/SQL và đặc biệt là các hoạt động SQL số ​​lượng lớn bằng cách sử dụng các bộ sưu tập pl/sql (BULK COLLECT/Bulk Binds), mệnh đề RETURNING và xác định các bộ sưu tập bằng cách sử dụng% ROWTYPE.

Bạn có thể giảm đáng kể số lượng mã pl/sql mà bạn viết thông qua việc hiểu tất cả những điều trên - mặc dù luôn nhớ rằng một giải pháp tất cả-SQL sẽ hầu như luôn đánh bại một PL/SQL.

6

Oracle không có cơ sở để tạo ngẫu nhiên các bảng tạm thời giống như SQL Server. Bạn phải tạo bảng một cách rõ ràng trong lược đồ cơ sở dữ liệu (create global tempory table). Điều này cũng có nghĩa là bạn cần quyền cho phép bạn tạo bảng và kịch bản lệnh phải được triển khai rõ ràng dưới dạng thay đổi cơ sở dữ liệu. Bảng này cũng hiển thị trong không gian tên chung.

Đây là sự khác biệt đáng kể giữa thành phần lập trình Oracle và SQL Server. T-SQL thành ngữ có thể sử dụng rộng rãi các bảng tạm thời và các yêu cầu chính hãng để viết mã T-SQL thủ tục là khá hiếm, đáng kể là do cơ sở này.

PL/SQL thành ngữ nhanh hơn rất nhiều để thoát ra khỏi mã thủ tục, và có lẽ bạn nên làm điều này hơn là cố gắng giả mạo các bảng tạm thời. Lưu ý rằng PL/SQL có các cấu trúc định hướng hiệu suất như kiểm soát dòng chảy để xử lý song song rõ ràng trên con trỏ và tập kết quả lồng nhau (biểu thức con trỏ); các phiên bản gần đây có trình biên dịch JIT.

Bạn có quyền truy cập vào một loạt các công cụ để làm cho mã PL/SQL thủ tục chạy nhanh chóng, và đây được cho là lập trình PL/SQL thành ngữ. Mô hình cơ bản có phần khác với T-SQL, và cách tiếp cận với các bảng tạm thời là một trong những điểm chính mà kiến ​​trúc hệ thống và thành ngữ lập trình khác nhau.

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