Bạn không thể sử dụng dấu chấm phẩy trong EXECUTE IMMEDIATE
cho các câu lệnh đơn
Đây là trích dẫn từ tài liệu :
Xóa dấu chấm phẩy khỏi EXECUTE IMMEDIATE
.
execute immediate 'create table smap1(nam varchar2(10));'; -- this is your code
execute immediate 'create table smap1(nam varchar2(10))'; -- correct code, no semicolon at end
Nhưng có một vấn đề khác.
Bạn cần hiểu cách thay thế các biến (&variable
) hoạt động
SQL * Plus sẽ nhắc các biến thay thế chỉ một lần:ngay trước khi biên dịch tập lệnh, trước khi chạy nó. Và sau đó các biến được thay thế nguyên văn trong script, sau đó nó sẽ được biên dịch và thực thi.
Ví dụ:khi bạn chạy tập lệnh của mình, SQL * Plus nhận ra rằng có hai ký tự không xác định (&colname
và &coldata
), và sẽ nhắc bạn. Nếu bạn cung cấp các giá trị 'tuổi' và 'số' cho chúng, SQL * Plus sẽ viết lại tập lệnh như sau:
declare
-- omitted to add clarity
begin
execute immediate 'create table smap1(nam varchar2(10));';
if(no_of_cols>=2) then
for i in 2..no_of_cols loop
colname:=age;
coldata:=number;
execute immediate 'alter table smapl add '||colname||' '||coldata;
end loop;
end if;
end;
Vì vậy, nếu bạn muốn gán một chuỗi ký tự cho một biến và bạn muốn lấy chuỗi đó từ một biến thay thế, bạn cần thực hiện điều này:
colname varchar2(30) := '&colname'; -- notice the single quotes
Giả sử bạn đã cung cấp 'tuổi' cho colname
SQL * Plus sẽ vui vẻ chuyển đổi điều này thành:
colname varchar2(30) := 'age';
Vì vậy, việc đặt một biến thay thế bên trong vòng lặp sẽ không làm cho SQL * Plus liên tục nhắc bạn về giá trị của nó .