Oracle动态SQL


动态SQL语法

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

INTO和USING子句是可选的

如果SQL语句是一个查询语句的话,我们可以使用INTO子句

INTO语句用于接收SELECT语句选择的记录值,可以是一个变量序列,也可以是一个记录型的变量也就是record型的变量

这个变量序列的顺序对应于查询结果集中的记录的值的顺序

如果有参数需要动态确定,我们可以使用USING子句

动态创建表

示例

  1. --动态SQL语句   
  2. begin   
  3.   execute immediate 'create table bonus (id number,ant number)';  
  4. end;  
  5.     
  6. --动态查询用户的电话   
  7.  declare  
  8.  sql_stmt varchar2(200); --存储查询语句   
  9.  emp_id number(10):='&emp_id';  
  10.  emp_rec employees%rowtype;  
  11.    
  12.  begin  
  13.     sql_stmt:='select * from employees where id=:id'  ;  
  14.     execute immediate sql_stmt into emp_rec using emp_id;  
  15.     dbms_output.put_line(emp_rec.phone);  
  16.    
  17.  end;
  18. ">--动态插入   
  19.  declare   
  20.      sql_stmt varchar(200);  
  21.      emp_id number(10):='&emp_id';  
  22.      emp_rec employees%rowtype;  
  23.  begin  
  24.    sql_stmt:='insert into employees (id) values(:id)';  
  25.    execute immediate sql_stmt using emp_id;  
  26.       
  27.  end;

execute immediate语句只能执行返回一行或者没有返回,如果要编写返回多行的sql语句要使用REF动态游标

示例:

  1. --动态SQL,动态游标   
  2.  declare  
  3.     e_id number(10);  
  4.     e_name varchar2(50);  
  5.     s_salary number(8);  
  6.     type c_type is ref cursor;  
  7.     cur c_type;  
  8.     p_salaty number:='&p_id';  
  9.  begin  
  10.    open cur for   
  11.    'select e.id,e.name,s.salaryvalue from employees e,salary s  
  12.    where e.id=s.employeeid and s.salaryvalue>:sal order by id asc'  
  13.    using p_salry;  
  14.    dbms_output.put_line('薪水大于'||p_salary||'的员工有:');  
  15.    loop   
  16.      fetch cur into e_id, e_name,s_salary;  
  17.      exit when cur%notfound;  
  18.      dbms_output.put_line('编号:'||e_id||'姓名:'||e.name||'薪水'||s_salary);  
  19.      end loop;  
  20.      close cur;  
  21.  end;

相关内容