動态SQL
DDL不能直接在PL/SQL中執行,解決方法用動态SQL實作
文法
execute immediate 動态語句字元串
[into 變量清單] -- 動态語句結果存儲在變量中
[using 參數清單]
使用動态sql,查詢記錄并輸出
declare
sql_emp varchar2(400); -- 存儲執行的SQL語句
e_id emp.eid%type:='2018001'; -- 輸入參數
e_row emp%rowtype; -- 儲存傳回的記錄
begin
sql_emp:='select * from emp where eid=:id'; -- :id 隻是一個占位符 ,冒号:必須要
execute immediate sql_emp
into e_row -- 把SQL語句結果指派給 e_row
using e_id; -- 把e_id的值傳遞給 sql_emp中的 :id,有幾個參數就寫幾個,和上面語句中一樣
dbms_output.put_line(e_row.eid||'-'||e_row.ename);
end;
使用動态SQL建立表
declare
sql_create varchar2(400); -- 聲明一個變量存儲執行的SQL語句
begin
sql_create:='create table tablesp (tid number, tname number, tage number)'; -- 建立表SQL語句
execute immediate sql_create; --執行SQL語句,沒有傳回值,沒有輸入參數
dbms_output.put_line('表建立成功');
end;
使用動态SQL插入資料
declare
sql_insert varchar2(400); -- 存儲執行的SQL語句
sql_id number :=('&id');
sql_name number :=('&name');
sql_age number :=('&age');
begin
sql_insert:='insert into tablesp values(:id, :name, :age)';
execute immediate sql_insert using sql_id,sql_name,sql_age; -- 三個輸入參數順序一定要和上面順序一樣
dbms_output.put_line('插入成功');
end;
使用動态SQL修改資料
declare
sql_update varchar2(400); -- 存儲執行的SQL語句
sql_id number :=('&id');
sql_name number :=('&name');
sql_age number :=('&age');
begin
sql_update:='update tablesp set tage=:age,tname=:name where tid=:id';
execute immediate sql_update using sql_age,sql_name,sql_id; --注意!!!!!!輸入參數順序需要和上面對應
dbms_output.put_line('修改成功');
end;
使用動态SQL删除資料
declare
sql_delete varchar2(400);
begin
sql_delete:='delete from tablesp where tid=5';
execute immediate sql_delete;
dbms_output.put_line('删除成功');
end;
過程+動态SQL
----插入
--建立過程
create or replace procedure proc_insert
is
sql_insert varchar(400);
begin
sql_insert:='insert into tablesp values(:id, :name, :age)';
for i in 1..10 loop
execute immediate sql_insert using i,i,i;
end loop;
end;
--執行過程
declare
begin
proc_insert();
end;
----查詢
--建立過程
create or replace procedure proc_select(pid number)
is
sql_select varchar(400);
sql_row tablesp%rowtype;
begin
sql_select:='select * from tablesp where tid=:id';
execute immediate sql_select into sql_row using pid;
dbms_output.put_line(sql_row.tid||'-'||sql_row.tname||'-'||sql_row.tage);
end;
--執行過程
declare
begin
proc_select;
end;