2010-10-11 12 views
6

Truy vấn theo sau sẽ giảm một bảng nếu bảng tồn tại nhưng dường như nó không hoạt động đối với IBM Db2.Cú pháp nếu tồn tại trong IBM Db2

Begin nguyên tử

if (tồn tại (

SELECT 1 TỪ SYSIBM.SYSTABLES WHERE name = 'EMAIL' VÀ LOẠI = 'T' VÀ tác giả = 'schema1' )) sau đó thả bảng EMAIL; kết thúc nếu; Kết thúc

Ngược lại nếu cú ​​pháp exisits hoạt động nếu tôi có câu lệnh DML thay vì câu lệnh thả bảng. Bất kỳ trợ giúp nào về vấn đề này được đánh giá cao

Cập nhật 1: Tôi đọc rằng bạn không thể chạy câu lệnh DDL trong khối bắt đầu nguyên tử do đó câu lệnh đầu tiên của tôi không thành công.

+0

Bạn có nhận được thông báo lỗi không? Nếu có, bạn có thể đăng bài đó không? –

Trả lời

7

Cách tôi đã làm nó như sau

Begin atomic 

    if(exists(SELECT 1 
       FROM SYSIBM.SYSTABLES 
       WHERE NAME='EMAIL' AND TYPE='T' AND creator = 'schema1' 
      ) 
    ) 
    then customStoredproc('drop table EMAIL'); 

    end if; 

End 

customStoredProc tôi chỉ có một stmt thực hiện @dynsql ngay lập tức;

1

Bạn đúng là DB2 cấm DDL trong một khối SQL nguyên tử. IBM đã phát hành một thủ tục bổ sung miễn phí có tên db2perf_quiet_drop hoạt động theo cách bạn muốn.