天天看點

Oracle-動态SQL

動态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;