2011-10-28 46 views
10

2 Câu hỏi riêng.thả bảng tạm thời toàn cầu

  1. Tôi đang sử dụng kịch bản này để thả một bảng [SOLVED]

    BEGIN 
        EXECUTE IMMEDIATE 'DROP TABLE_NAME'; 
        DBMS_OUTPUT.PUT_LINE ('Global table TABLE_NAME Dropped'); 
        EXCEPTION 
         WHEN OTHERS THEN 
          DBMS_OUTPUT.PUT_LINE ('Global table TABLE_NAME Doesn''t exist.'); 
    END; 
    /
    

Liệu có cách nào tôi có thể phân biệt nếu bảng "không tồn tại" hoặc nó đang được sử dụng trong một số các phiên khác (trong trường hợp đó nó sẽ bị khóa và không thể bị xóa). Tôi không chắc liệu tôi có thể thấy bảng đó tồn tại trong user_tables hay không. Tôi không hoàn toàn nhận thức được các điều khoản.

Tôi đã thêm mã này ngay bây giờ

WHEN OTHERS THEN 
     i_code := SQLCODE; 
     v_errm := SUBSTR(SQLERRM, 1, 64); 
    if i_code = -942 THEN 
    DBMS_OUTPUT.PUT_LINE ('TABLE_NAME doesn''t exist. Script will continue to create it'); 
    ELSE 
    DBMS_OUTPUT.PUT_LINE ('Error dropping temporary table. The error code is ' || i_code || '- ' || v_errm); 
    END IF ; 

2. Tôi thấy . ở phần cuối của mỗi thủ tục như thế này

END PROCEDURE_NAME; 
. 
/
sho err; 

Tôi chỉ không hiểu tại sao . có tại đây. Nó là cú pháp hay cái gì?

+0

Bảng có thực sự là một bảng tạm thời toàn cầu không? ('tạo bảng tạm thời toàn cầu ....') Nếu vậy, tại sao bạn bỏ nó? Đây có phải là một phần của tập lệnh cài đặt không? Nếu không, có thể một bảng tạm thời toàn cầu sẽ đáp ứng nhu cầu của bạn, mà không cần phải thả nó. –

+0

cũng chúng tôi chạy vào "đã tồn tại" vấn đề và bằng cách nào đó, nó không được xác nhận từ môi trường productino trạng thái của bảng là gì. Bảng này không phải là một phần của kịch bản cài đặt một phần của thủ tục riêng biệt. –

+0

Tôi không hiểu, tại sao bạn lại gặp phải vấn đề đã tồn tại với bảng tạm thời toàn cầu. Bảng nên đã tồn tại và mã chỉ sử dụng (chèn, xóa, cập nhật, v.v.). –

Trả lời

12

Bước 1. Hình ra lỗi mà bạn muốn bẫy:

Nếu bảng không tồn tại:

SQL> drop table x; 
drop table x 
      * 
ERROR at line 1: 
ORA-00942: table or view does not exist 

Nếu bảng được sử dụng:

SQL> create global temporary table t (data varchar2(4000)); 

Table created. 

Sử dụng bảng trong phiên khác. (Lưu ý không có cam kết hoặc bất cứ điều gì sau khi chèn.)

SQL> insert into t values ('whatever'); 

1 row created. 

Trở lại trong phiên giao dịch đầu tiên, cố gắng thả:

SQL> drop table t; 
drop table t 
      * 
ERROR at line 1: 
ORA-14452: attempt to create, alter or drop an index on temporary table already in use 

Vì vậy, hai lỗi để bẫy:

  1. ORA- 00942: bảng hoặc chế độ xem không tồn tại
  2. ORA-14452: cố gắng tạo, thay đổi hoặc thả chỉ mục trên bảng tạm thời đã được sử dụng

Xem lỗi có phải là predefined hay không. Họ thì không.Vì vậy, họ cần phải được xác định như sau:

create or replace procedure p as 
    table_or_view_not_exist exception; 
    pragma exception_init(table_or_view_not_exist, -942); 
    attempted_ddl_on_in_use_GTT exception; 
    pragma exception_init(attempted_ddl_on_in_use_GTT, -14452); 
begin 
    execute immediate 'drop table t'; 

    exception 
     when table_or_view_not_exist then 
      dbms_output.put_line('Table t did not exist at time of drop. Continuing....'); 

     when attempted_ddl_on_in_use_GTT then 
      dbms_output.put_line('Help!!!! Someone is keeping from doing my job!'); 
      dbms_output.put_line('Please rescue me'); 
      raise; 
end p; 

Và kết quả, đầu tiên mà không t:

SQL> drop table t; 

Table dropped. 

SQL> exec p; 
Table t did not exist at time of drop. Continuing.... 

PL/SQL procedure successfully completed. 

Và bây giờ, với t sử dụng:

SQL> create global temporary table t (data varchar2(4000)); 

Table created. 

Trong phiên khác:

SQL> insert into t values (null); 

1 row created. 

Và sau đó trong phiên đầu tiên:

SQL> exec p; 
Help!!!! Someone is keeping from doing my job! 
Please rescue me 
BEGIN p; END; 

* 
ERROR at line 1: 
ORA-14452: attempt to create, alter or drop an index on temporary table already in use 
ORA-06512: at "SCHEMA_NAME.P", line 16 
ORA-06512: at line 1 
-1

có - động cơ sẽ ném các ngoại lệ khác nhau cho các điều kiện khác nhau.

bạn sẽ thay đổi phần này để bắt ngoại lệ và làm điều gì đó khác nhau

EXCEPTION 
     WHEN OTHERS THEN 

đây là một tài liệu tham khảo

http://download.oracle.com/docs/cd/B10501_01/appdev.920/a96624/07_errs.htm

+0

Thats câu hỏi. Điều gì sẽ là ngoại lệ khác cho điều này ở đây (http://download.oracle.com/docs/cd/B10501_01/appdev.920/a96624/07_errs.htm) –

-1

Tuyên bố TEMPORARY TẠM NGỪNG TỪ CHỐI định nghĩa bảng tạm thời cho kết nối hiện tại.

Những bảng này không nằm trong danh mục hệ thống và không liên tục.

Bảng tạm thời chỉ tồn tại trong khi kết nối khai báo chúng và không thể được tham chiếu bên ngoài kết nối đó.

Khi kết nối đóng, các hàng của bảng sẽ bị xóa và mô tả trong bộ nhớ của bảng tạm thời bị xóa.

Đối với các bạn tham khảo http://docs.oracle.com/javadb/10.6.2.1/ref/rrefdeclaretemptable.html

+0

Bạn đang nói về một sản phẩm cơ sở dữ liệu khác với OP. Đối với Cơ sở dữ liệu Oracle http://docs.oracle.com/database/121/CNCPT/tablecls.htm#CNCPT1138. & "Trong bảng tạm thời toàn cầu của Oracle là các đối tượng cố định lưu trữ dữ liệu cụ thể về phiên tạm thời (hoặc giao dịch cụ thể)." http://stackoverflow.com/questions/3682360/sql-server-oracle-private-temporary-tables –

15
 
-- First Truncate temporary table 
SQL> TRUNCATE TABLE test_temp1; 

-- Then Drop temporary table 
SQL> DROP TABLE test_temp1; 
+2

Giải pháp này không hoạt động. – zygimantus

+0

Nó hoạt động trong trường hợp của tôi sau khi kết nối lại (thay đổi phiên). –

0
  1. Xuống máy chủ apache bằng cách chạy dưới đây trong putty cd $ADMIN_SCRIPTS_HOME ./adstpall.sh
  2. Thả các bảng tạm thời toàn cầu drop table t;

Điều này sẽ tập luyện. .

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