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