现在的位置: 首页 > 综合 > 正文

Oracle动态SQL

2013年02月14日 ⁄ 综合 ⁄ 共 1203字 ⁄ 字号 评论关闭


动态SQL语法


只有在运行时候Oracle才能够检测它的格式是否正确

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;


抱歉!评论已关闭.