2009-08-06 35 views
5

Tôi đang cố chạy nhiều câu lệnh ddl trong một câu lệnh Execute Immediate. tôi nghĩ rằng điều này sẽ được khá thẳng về phía trước nhưng có vẻ như tôi là nhầm lẫn.ORACLE Batching các câu lệnh DDL trong một Execute ngay lập tức

Ý tưởng là thế này:

declare v_cnt number; 

begin 

select count(*) into v_cnt from all_tables where table_name='TABLE1' and owner = 'AMS'; 

if v_cnt = 0 then 

execute immediate 'CREATE TABLE TABLE1(VALUE VARCHAR2(50) NOT NULL) ALTER TABLE TABLE1 ADD (MYVAL2 NVARCHAR2(10))'; 

end if; 

end; 

tuy nhiên kết quả này trong một lỗi

ORA-00.911: nhân vật không hợp lệ ORA-06.512: tại dòng 10

Mỗi các câu lệnh trong hàng loạt chạy tốt nếu tôi thực hiện chúng một mình. và nếu tôi lấy tuyên bố này và thực hiện nó, nó sẽ chạy tốt (với, giữa 2 câu lệnh). Nếu tôi loại bỏ; giữa các câu lệnh tôi nhận được lỗi khác về tùy chọn không hợp lệ

kế hoạch là tôi sẽ có thể tạo bảng, xuất lược đồ bảng cho bảng này bao gồm tất cả các câu lệnh thay đổi và sau đó chạy lô đối với một hệ thống khác một phần của quá trình cài đặt/cập nhật.

Vì vậy, làm cách nào để tôi xử lý các câu lệnh DDL này trong một lần thực thi ngay lập tức? Hay là có cách nào tốt hơn để làm những gì tôi cần?

Tôi là một bit của một newb Oracle, tôi phải thừa nhận. Cảm ơn tất cả các bạn vì sự kiên nhẫn của bạn.

Trả lời

2

Tại sao bạn cần một cuộc gọi EXECUTE IMMEDIATE duy nhất? Chắc chắn chỉ cần làm như 2 cuộc gọi?

Hãy nhớ rằng mỗi câu lệnh DDL chứa một COMMIT tiềm ẩn, vì vậy không có lợi ích đồng thời để thực hiện nó như một cuộc gọi duy nhất.

Ngoài ra, tại sao không chỉ thiết lập bảng chính xác trong cuộc gọi đầu tiên? Bạn có thể làm ...

CREATE TABLE table1 (VALUE VARCHAR2 (50) NOT NULL, MYVAL2 NVARCHAR2 (10))

... thay vì cần 2 cuộc gọi.

Ngoài ra, bạn đã xem DBMS_METADATA ... nó có thể tạo DDL cho các đối tượng như bảng cho bạn hay không.

+0

việc tạo và sửa đổi bảng được xuất dưới dạng một tệp và ngay bây giờ, có đủ các giá trị đó gây khó khăn khi cố gắng thực hiện nó trong 1 IMMEDIATE EXECUTE và nhiều đối tượng db. – Beta033

+0

Trong trường hợp đó, tôi đề nghị chỉ cần tạo DDL chính xác ngay từ đầu. Nhìn vào DBMS_METADATA. :-) – cagcowboy

+0

có vẻ như điều này có thể khắc phục được sự cố của tôi. buồn bã câu trả lời rõ ràng là ngay dưới mũi tôi. Bài học kinh nghiệm: Không sử dụng TOAD để cấu trúc đầu ra mặc dù có một menu gui ưa thích cho nó. – Beta033

4

Dấu chấm phẩy không phải là một phần của cú pháp SQL của Oracle. SQL * Plus và các công cụ phía máy khách khác sử dụng dấu chấm phẩy để báo hiệu sự kết thúc của một câu lệnh SQL, nhưng máy chủ không nhìn thấy nó.

Chúng tôi có thể buộc SQL * Plus để vượt qua các dấu chấm phẩy để DB:

SQL> set sqlterminator off 
SQL> select * from user_tables; 
    2/
select * from user_tables; 
         * 
ERROR at line 1: 
ORA-00911: invalid character 

Nếu tôi lấy tuyên bố này và thực hiện nó, nó sẽ chạy tốt (với; giữa 2 báo cáo) Các công cụ khách hàng bạn đang sử dụng, chia nhỏ nó thành hai cuộc gọi đến DB.

Vì vậy, tôi không nghĩ rằng có thể chuyển nhiều câu lệnh bên trong thực thi ngay lập tức.

Tôi cho rằng người ta có thể gọi ngay lập tức bằng một chuỗi chứa một khối PL/SQL ẩn danh, với các cuộc gọi riêng lẻ để thực hiện ngay bên trong nó ... và tôi không biết điểm đó sẽ làm gì.;)

+0

Trải nghiệm của tôi giống nhau: Chúng tôi không thể chuyển nhiều câu lệnh bên trong 'EXECUTE IMMEDIATE'. – Baodad

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