2009-06-17 11 views
76

Tôi có chính xác trong việc hiểu rằng TẠO HOẶC THAY THẾ cơ bản có nghĩa là "nếu đối tượng tồn tại, thả nó, sau đó tạo nó theo một trong hai cách?"Tôi làm cách nào để sử dụng TẠO HOẶC THAY THẾ?

Nếu có, tôi đang làm gì sai? Đây hoạt động:

CREATE TABLE foo (id NUMBER, 
title VARCHAR2(4000) DEFAULT 'Default Title') 

Và điều này không (ORA-00.922: thiếu hoặc tùy chọn không hợp lệ):

CREATE OR REPLACE TABLE foo (id NUMBER, 
title VARCHAR2(4000) DEFAULT 'Default Title') 

Tôi có làm điều gì đó ngu ngốc? Tôi dường như không thể tìm thấy nhiều tài liệu về cú pháp này.

Trả lời

120

Tính năng này hoạt động trên các chức năng, quy trình, gói, loại, từ đồng nghĩa, kích hoạt và chế độ xem.

Cập nhật:

Sau khi cập nhật các bài lần thứ ba, tôi sẽ tái cấu trúc này:

này không hoạt động trên bảng :)

Và vâng, có documentation trên cú pháp này và không có tùy chọn REPLACE cho CREATE TABLE.

+1

Thở, tôi thề là tôi đã đọc nó ở đâu đó. Oh well. :) –

+5

Nó cũng không hoạt động cho các quan điểm vật chất – skaffman

+3

Nó cũng không hoạt động đối với các liên kết cơ sở dữ liệu. –

19

Không có bảng tạo hoặc thay thế trong Oracle.

Bạn phải:

 
DROP TABLE foo; 
CREATE TABLE foo (....); 
3

Không làm việc với bảng, chỉ có chức năng vv

Đây là một trang web với một số examples.

7

CREATE OR REPLACE chỉ có thể được sử dụng trên các chức năng, quy trình, loại, chế độ xem hoặc gói - nó sẽ không hoạt động trên bảng.

+1

'TẠO HOẶC THAY THẾ' cũng hoạt động cho các từ đồng nghĩa và kích hoạt –

-3

Nếu điều này là dành cho MS SQL .. Mã sau sẽ luôn luôn chạy không có vấn đề gì nếu bảng tồn tại đã có hay không.

if object_id('mytablename') is not null //has the table been created already in the db 
Begin 
    drop table mytablename 
End 

Create table mytablename (... 
+0

Xin lỗi, nhưng đây là Oracle. :-) –

+0

là nhận xét "// có dữ liệu trong bảng" chính xác không? –

+0

xin lỗi một chút tốt hơn, kiểm tra object_id để xem nếu bảng tồn tại trong db. nó nên nói // có bảng đã được tạo ra trong db – JuniorFlip

31

Một trong những điều tốt đẹp về cú pháp là bạn có thể chắc chắn rằng một CREATE OR REPLACE sẽ không bao giờ làm bạn mất dữ liệu (tối đa bạn sẽ mất là mã, mà hy vọng bạn sẽ đã được lưu trữ trong kiểm soát nguồn một vài nơi).

Cú pháp tương đương cho bảng là ALTER, có nghĩa là bạn phải liệt kê rõ ràng các thay đổi chính xác được yêu cầu.

EDIT: Bằng cách này, nếu bạn cần phải làm một Drop + CREATE trong một kịch bản, và bạn không chăm sóc cho các giả mạo "đối tượng không tồn tại" lỗi (khi các DROP không tìm thấy bảng), bạn có thể làm điều này:

BEGIN 
    EXECUTE IMMEDIATE 'DROP TABLE owner.mytable'; 
EXCEPTION 
    WHEN OTHERS THEN 
    IF sqlcode != -0942 THEN RAISE; END IF; 
END; 
/
4

Tiếp theo kịch bản nên làm các trick về Oracle:

BEGIN 
    EXECUTE IMMEDIATE 'drop TABLE tablename'; 
EXCEPTION 
    WHEN OTHERS THEN 
    IF sqlcode != -0942 THEN RAISE; 
    END IF; 
END; 
1

Nếu bạn đang làm trong mã thì trước tiên kiểm tra các bảng trong cơ sở dữ liệu bằng cách sử dụng truy vấn 0.123.CHỌN tên_bảng TỪ USER_TABLES ĐÂU table_name = 'XYZ'

nếu kỷ lục tìm thấy sau đó truncate bảng khác tạo Bảng

làm việc như Tạo hoặc thay thế.

1

Bạn có thể sử dụng CORT (www.softcraftltd.co.uk/cort). Công cụ này cho phép CREATE OR REPLACE table trong Oracle. Có vẻ như:

create /*# or replace */ table MyTable(
    ... -- standard table definition 
); 

Nó bảo toàn dữ liệu.

+0

Trang web dường như đã được hi-jacked ... –

+0

Ah. crap ... Cảm ơn đã cho tôi biết ... – Rusty

2

Một quy trình hữu ích cho cơ sở dữ liệu oracle mà không sử dụng exeptions (trong những trường hợp bạn phải thay thế USER_TABLES với DBA_TABLES và/hoặc hạn chế các bảng trong truy vấn):

create or replace procedure NG_DROP_TABLE(tableName varchar2) 
is 
    c int; 
begin 
    select count(*) into c from user_tables where table_name = upper(tableName); 
    if c = 1 then 
     execute immediate 'drop table '||tableName; 
    end if; 
end; 
2
-- To Create or Replace a Table we must first silently Drop a Table that may not exist 
DECLARE 
    table_not_exist EXCEPTION; 
    PRAGMA EXCEPTION_INIT (table_not_exist , -00942); 
BEGIN 
    EXECUTE IMMEDIATE('DROP TABLE <SCHEMA>.<TABLE NAME> CASCADE CONSTRAINTS'); 
    EXCEPTION WHEN table_not_exist THEN NULL; 
END; 
/
+0

Mã nhỏ hơn các ví dụ khác nhưng cũng rõ ràng hơn một chút trong mục đích của nó – grokster

0

Vì vậy, tôi đã sử dụng này và nó đã làm việc rất tốt: - nó hoạt động giống như một giọt IF EXISTS nhưng được công việc làm

DECLARE 
     VE_TABLENOTEXISTS EXCEPTION; 
PRAGMA EXCEPTION_INIT(VE_TABLENOTEXISTS, -942); 


    PROCEDURE DROPTABLE(PIS_TABLENAME IN VARCHAR2) IS 
       VS_DYNAMICDROPTABLESQL VARCHAR2(1024); 
        BEGIN 
         VS_DYNAMICDROPTABLESQL := 'DROP TABLE ' || PIS_TABLENAME; 
        EXECUTE IMMEDIATE VS_DYNAMICDROPTABLESQL; 

        EXCEPTION 
         WHEN VE_TABLENOTEXISTS THEN 
          DBMS_OUTPUT.PUT_LINE(PIS_TABLENAME || ' NOT EXIST, SKIPPING....'); 
         WHEN OTHERS THEN 
          DBMS_OUTPUT.PUT_LINE(SQLERRM); 
        RAISE; 
        END DROPTABLE; 

    BEGIN 
     DROPTABLE('YOUR_TABLE_HERE'); 
END DROPTABLE; 
/ 

Hope this helps cũng tham khảo: PLS-00103 Error in PL/SQL Developer

0

'Tạo hoặc thay thế bảng' là không thể. Như những người khác đã nói, bạn có thể viết một thủ tục và/hoặc sử dụng bắt đầu thực hiện ngay lập tức (...). Bởi vì tôi không thấy câu trả lời với cách tạo lại bảng, tôi đã đặt một kịch bản làm câu trả lời.

PS: theo thứ jeffrey-kemp đã đề cập: đoạn mã bên dưới này sẽ KHÔNG lưu dữ liệu đã có trong bảng bạn sắp thả. Bởi vì nguy cơ mất dữ liệu, tại công ty chúng tôi chỉ được phép thay đổi các bảng hiện có trên môi trường sản xuất và không được phép bỏ bảng. Bằng cách sử dụng bảng kê thả, sớm hay muộn bạn sẽ nhận được cảnh sát công ty đứng ở bàn làm việc của bạn.

--Create the table 'A_TABLE_X', and drop the table in case it already is present 
BEGIN 
EXECUTE IMMEDIATE 
' 
CREATE TABLE A_TABLE_X 
(
COLUMN1 NUMBER(15,0), 
COLUMN2 VARCHAR2(255 CHAR), 
COLUMN3 VARCHAR2(255 CHAR) 
)'; 

EXCEPTION 
WHEN OTHERS THEN 
    IF SQLCODE != -955 THEN -- ORA-00955: object name already used 
    EXECUTE IMMEDIATE 'DROP TABLE A_TABLE_X'; 
    END IF; 
END; 
+0

Bạn có cần nhất quán với A_TABLE_EXAMPLE và A_TABLE_X không? –

+0

có thực sự là jonathan-leffler. Tôi đã thay đổi nó. – cybork

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