在PL/SQL中执行SQL语句.(三)

 oracle 数据库中,语句一般分为这几种:

DML(data manipulation language) : 数据库操纵语句,有

select  、insert、update、delete 能对数据进行操作的语言,严格说来select  不算在其中

DDL(Data Definition Language) :数据库定义语言,有

create、drop、alter、truncate  等,通常是数据库管理系统的一部分,用于定义数据库的所有特性和属性

DCL Data Control Language):数据控制语言,有

Grant、Revoke、Commit、Rollback,其中Commit、Rollback 严格可以归纳为TCLTransaction Control Language(事务控制语言)。

1.表复制,复制dept 表,后面使用

 create table  my_dept as select * from dept;

注意:-- 表复制,不会复制约束条件

2.动态插入

 begin
       insert into  my_dept  values('&no','&name','&location') ;
       commit;
end;   

                      

注意:同理可以进行其他操作

3.上下文区域(context area):游标(cursor)

    SQL%ROWCOUNT是游标属性,表示刚刚执行的sql语句影响的记录条数.

declare
  v_rows number := 0;
begin
  delete from my_dept
  where deptno > 40;
  v_rows := SQL%ROWCOUNT;
  commit;
  dbms_output.put_line
     (v_rows||' deleted');
end;

4.创建临时表 temp_ran

   if 存在,清空数据trucate 或者drop

   if 不存在,创建

declare
    v_count number(2) :=0;
begin
    select count(*) into v_count
    from user_tables
    where table_name = 'TEMP_RAN';
    if v_count = 1 then
        execute immediate
            'drop table temp_ran';
    end if;
    execute immediate
        'create table temp_ran as select * from dept';
end;
-- 其他逻辑,类似

   注意: user_table 是用户下的表,表名默认是大写的,immediate是立即的执行,为了提高效率,具体用

   法去官网看 。

5.分支语句

declare
    v_rate number(3,2);
    v_job emp.job%type;
    v_sal emp.sal%type;
    v_empno emp.empno%type :=&no;
begin
    select job,sal into v_job,v_sal 
    from emp where empno = v_empno;
    if v_job = 'ANALYST' then
        v_rate := 1.2;
    elsif v_job = 'MANAGER' then
        v_rate  := 1.1;
    elsif v_job = 'SALESMAN' then
        v_rate := 1.05;
    else
        v_rate := 1;
    end if;
    update emp_ran set sal = sal*v_rate
    where empno = v_empno;
    commit;
    dbms_output.put_line(v_job || 'old :'||v_sal||', new :'||v_sal*v_rate);
end;

   注意:这里是elsif 不是elseif, 'ANALYST' emp表中复制的数据  

   也可以用case 方式

  

declare
  v_rate number(3,2);
  v_job emp.job%type;
  v_sal emp.sal%type;
  v_empno emp.empno%type := &no;
begin
  SELECT job,sal into v_job,v_sal
  from emp_ran where empno = v_empno;
  case v_job
    when  'ANALYST' then v_rate :=1.2;
    when  'MANAGER' then v_rate :=1.1;
    when  'SALESMAN' then v_rate :=1.05;
    else v_rate :=1;
  end case;
  update emp_ran set sal = sal * v_rate
  where empno = v_empno;
  commit;
  dbms_output.put_line(v_job ||' old:'||v_sal||','||'new:'||v_sal * v_rate);
end;

注意:这里查找不到会出现:no data found 异常,这是系统自带异常,可以自己定义。

6.循环语句

declare
  v_i number :=10;
BEGIN
  loop 
    -- 插入数据
    insert into emp_ran(empno) values(v_i);
    -- 当 v_i =20 ,退出,自增1
    exit when v_i = 20;
    v_i := v_i+1;
   end loop;
   COMMIT ;
END ;

 另外的方式,和JAVA for 循环差不多

declare
  v_i number :=10;
begin
  for v_i in 100..110 
  loop
    insert into emp_ran(empno) values(v_i);
    -- commit;
  end loop;
end;

 while 方式:

declare
  v_i number := 1000;
begin
  while v_i < 1010 loop
    insert into emp_ran(empno)
    values(v_i);
    v_i := v_i + 1;
  end loop;
  commit;
end;

这里介绍的就是常用的 分支 和循环语句,和JAVA 类似

猜你喜欢

转载自greemranqq.iteye.com/blog/1825138