Tôi giả sử bạn đang làm điều gì đó giống như sau:
declare
v_temp varchar2(20);
begin
execute immediate 'create table temp(name varchar(20))';
execute immediate 'insert into temp values(''XYZ'')';
select name into v_name from temp;
end;
Tại thời điểm biên dịch bảng, TEMP
, không tồn tại . Nó vẫn chưa được tạo. Vì nó không tồn tại, bạn không thể chọn từ nó; do đó bạn cũng phải thực hiện SELECT động. Thực sự không cần thực hiện CHỌN trong cụ thể này mặc dù bạn có thể sử dụng returning into
cú pháp.
declare
v_temp varchar2(20)
begin
execute immediate 'create table temp(name varchar2(20))';
execute immediate 'insert into temp
values(''XYZ'')
returning name into :1'
returning into v_temp;
end;
Tuy nhiên, việc cần tạo các bảng một cách tự động thường là dấu hiệu của một lược đồ được thiết kế kém. Nó không thực sự cần thiết.
Tôi có thể giới thiệu René Nyffenegger của
post "Tại sao SQL động lại kém?"
để biết lý do tại sao bạn nên tránh SQL động, nếu có thể, từ quan điểm hiệu suất. Cũng xin lưu ý rằng bạn cởi mở hơn nhiều với Chèn SQL
và nên sử dụng các biến liên kết và DBMS_ASSERT
để giúp bảo vệ chống lại nó.