作者:我是来工作的程_586 | 来源:互联网 | 2014-07-11 17:33
动态SQL语法只有在运行时候Oracle才能够检测它的格式是否正确INTO和USING子句是可选的如果SQL语句是一个查询语句的话,我们可以使用INTO子句INTO语句用于接收SELECT语句选择的记录值,可以是一个变量序列,也可以...SyntaxHighlighter.all
动态SQL语法
INTO和USING子句是可选的
如果SQL语句是一个查询语句的话,我们可以使用INTO子句
INTO语句用于接收SELECT语句选择的记录值,可以是一个变量序列,也可以是一个记录型的变量也就是record型的变量
这个变量序列的顺序对应于查询结果集中的记录的值的顺序
如果有参数需要动态确定,我们可以使用USING子句
动态创建表
示例
-
--动态SQL语句
-
begin
-
execute immediate 'create table bonus (id number,ant number)';
-
end;
-
-
--动态查询用户的电话
-
declare
-
sql_stmt varchar2(200); --存储查询语句
-
emp_id number(10):='&emp_id';
-
emp_rec employees%rowtype;
-
-
begin
-
sql_stmt:='select * from employees where id=:id' ;
-
execute immediate sql_stmt into emp_rec using emp_id;
-
dbms_output.put_line(emp_rec.phone);
-
-
end;
-
--动态插入
-
declare
-
sql_stmt varchar(200);
-
emp_id number(10):='&emp_id';
-
emp_rec employees%rowtype;
-
begin
-
sql_stmt:='insert into employees (id) values(:id)';
-
execute immediate sql_stmt using emp_id;
-
-
end;
execute immediate语句只能执行返回一行或者没有返回,如果要编写返回多行的sql语句要使用REF动态游标
示例:
-
--动态SQL,动态游标
-
declare
-
e_id number(10);
-
e_name varchar2(50);
-
s_salary number(8);
-
type c_type is ref cursor;
-
cur c_type;
-
p_salaty number:='&p_id';
-
begin
-
open cur for
-
'select e.id,e.name,s.salaryvalue from employees e,salary s
-
where e.id=s.employeeid and s.salaryvalue>:sal order by id asc'
-
using p_salry;
-
dbms_output.put_line('薪水大于'||p_salary||'的员工有:');
-
loop
-
fetch cur into e_id, e_name,s_salary;
-
exit when cur%notfound;
-
dbms_output.put_line('编号:'||e_id||'姓名:'||e.name||'薪水'||s_salary);
-
end loop;
-
close cur;
-
end;
-