2012-02-16 49 views
10

Tôi muốn tạo bảng tạm thời trong thủ tục lưu trữ và truy cập nó trong cùng nhưng tôi đã nhận lỗi rằng ORA-00942:Table or view does not exists. Tiếp theo là thủ tục mà tôi đã cố gắng,Làm thế nào để tạo và sử dụng bảng tạm thời trong thủ tục lưu trữ oracle?

Create procedure myproc 
    IS 
    stmt varchar2(1000); 
    BEGIN 
    stmt:='CREATE GLOBAL TEMPORARY table temp(list if columns) ON COMMIT DELETE ROWS'; 

    execute immediate stmt; 

    insert into temp values('list of column values'); 

END; 

Đây là cách tôi đã sử dụng để tạo ra bảng tạm thời nhưng Tôi gặp lỗi, có cách nào khác để thực hiện tác vụ này không?

+5

@ câu trả lời của tbone cho thấy bạn nên làm gì, nhưng để giải thích những gì bạn thấy: Bạn không thể làm điều này bởi vì tại thời điểm quy trình được biên soạn 'temp' chưa tồn tại. Trình biên dịch không cố gắng phân tích cú pháp SQL động, ít nhất là vì nó không có ý tưởng nếu nó sẽ hoạt động trong thời gian chạy. Cách duy nhất cách tiếp cận này sẽ làm việc là nếu chèn cũng được biến thành SQL động; nhưng đây không phải là cách các bảng tạm thời hoạt động trong Oracle, do đó, đừng làm như thế này. –

+0

@Alex Poole: Cảm ơn –

+0

bản sao có thể có của [Bảng tạm thời cục bộ trong Oracle 10 (đối với phạm vi thủ tục được lưu trữ)] (http://stackoverflow.com/questions/1192265/local-temporary-table-in-oracle-10 -for-the-scope-of-lưu trữ-thủ tục) – APC

Trả lời

14

Chỉ cần tạo trước tiên (một lần, bên ngoài quy trình của bạn), và sau đó sử dụng nó trong quy trình của bạn. Bạn không muốn (cố gắng) tạo ra nó trên mọi cuộc gọi của thủ tục.

create global temporary table tmp(x clob) 
on commit delete rows; 

create or replace procedure... 
-- use tmp here 
end; 
+0

Nhưng tại sao? Tôi thấy nó lạ. I E. Tôi cần một bảng "ảo". Tôi có thể tự tạo nó bên trong thủ tục không? – Revious

+1

@ Gik25 cho dù bạn sử dụng bảng tạm thời thực tế hay sử dụng các cách tiếp cận khác tùy thuộc vào tình huống cụ thể của bạn. Có thể đăng câu hỏi mới với thông tin cụ thể của bạn, rất có thể bạn sẽ nhận được một số câu trả lời hay. – tbone

+2

Tôi thứ hai @Revious Tôi có nhu cầu tạo, sử dụng và hủy các bảng tạm thời với trong một Proc, Oracle không thích nó, bất kỳ ý tưởng nào? – ZeExplorer

-1

Sử dụng này

Create of replace procedure myprocedure 
is 
    stmt varchar2(1000); 
    stmt2 varchar2(1000); 
begin 
    stmt := 'create global temporary table temp(id number(10))'; 
    execute immediate stmt; 
    stmt2 := 'insert into temp(id) values (10)'; 
    execute immediate stmt2; 
end; 
+3

Đó thực sự là lời khuyên xấu. Tạo tạm thời. các bảng bên ngoài nội dung chèn/cập nhật/xóa từ chúng. – Mat

0

Tôi đã chỉnh sửa câu trả lời này vì nó đã sai. Tôi là một MSSQL chuyển đổi gần đây và vì cách oracle thực hiện các bảng tạm thời toàn cầu, nếu bạn thực sự cần phải sử dụng bảng tạm thời, tạo chúng một lần và để lại chúng có cách để đi. Trừ khi bạn sử dụng sql động trong procs của bạn độc quyền (có gỡ lỗi vui vẻ), bạn sẽ không thể biên dịch thành công gói của bạn trừ khi các bảng được tham chiếu đã tồn tại. Oracle xác thực bất kỳ đối tượng nào được tham chiếu trong các phương thức mà bạn cố biên dịch, đó là lý do tại sao bạn gặp lỗi 942. Tôi thích cách Oracle quản lý phạm vi với các bảng tạm thời toàn cầu này. Điều đó, một mình, đã bán cho tôi ý tưởng đó.

+0

Đây thường là một thực tế tồi tệ trong Oracle. Bàn không chỉ đơn giản biến mất willy-nilly. Tại sao thêm mã phụ (chậm), buộc SQL động ở khắp mọi nơi và mất tất cả hy vọng về quản lý cấu hình? Các bảng tạm thời hầu như không bao giờ hữu ích. Chúng thường có thể được thay thế bằng các bảng thông thường, các khung nhìn nội tuyến hoặc một bộ sưu tập. –

+0

Nevermind câu trả lời của tôi, tôi là một MSSQL chuyển đổi gần đây. Trong tuần trước, tôi đã hiểu rõ hơn về việc thực hiện các bảng tạm thời của Oracles. Tôi càng sử dụng Oracle, tôi càng thích nó. – swimswithbricks

0
Create or replace procedure myprocedure 
is 
    stmt varchar2(1000); 
    stmt2 varchar2(1000); 
begin 
    stmt := 'create global temporary table temp(id number(10))'; 
    execute immediate stmt; 
    stmt2 := 'insert into temp(id) values (10)'; 
    execute immediate stmt2; 
end; 
Các vấn đề liên quan