PL/SQL循序渐进全面学习教程--课程十一 与ORACLE SERVER交互

课程十一 与ORACLE SERVER交互
  
  本课重点:
  1、在PLSQL中成功的写SELECT语句
  2、动态声明PLSQL变量类型与SIZE
  3、在PLSQL中写DML语句
  4、在PLSQL中控制事务
  5、确定DML操作的结果[@more@]课程十一 与ORACLE SERVER交互
  
  本课重点:
  1、在PLSQL中成功的写SELECT语句
  2、动态声明PLSQL变量类型与SIZE
  3、在PLSQL中写DML语句
  4、在PLSQL中控制事务
  5、确定DML操作的结果
  
  注意:以下实例中标点均为英文半角
  
  一、PLSQL中的SQL语句:
  SELECT、DML、COMMIT、ROLLBACK、SAVEPOINT、CURSOR
  特殊强调:PLSQL不支持DCL,不要问为什么。(DBMS_SQL package allows you to issue DDL and DCL

statements.)
  二、SELECT
  SELECT select_list
  INTO variable_name | record_name
  FROM table
  WHERE condition;
  例:
  SQL> r
  1 declare
  2 v_deptno number(2);
  3 v_loc varchar2(15);
  4 begin
  5   select deptno,loc
  6    into v_deptno,v_loc
  7   from dept
  8   where dname='SALES';
  9 DBMS_OUTPUT.PUT_LINE (V_deptno ||' and '||v_loc);
  10* end;
  30 and CHICAGO
  选取字段与变量个数和类型要一致。声明的变量一定要在SIZE上大于返回的赋值,否则提示缓冲区溢出。
  如果SELECT语句没有返回值:ORA-01403: 未找到数据
  ORA-06512: 在line 5
  如果有多个值返回:ORA-01422: 实际返回的行数超出请求的行数
  这些我们到了错误处理时会逐一讲解。
  例:
  上面的例子可以改为:
  declare
  v_deptno dept.deptno%type;
  v_loc dept.loc%type;
  begin
  select deptno,loc
  into v_deptno,v_loc
  from dept
  where dname='SALES';
  DBMS_OUTPUT.PUT_LINE (V_deptno ||' and '||v_loc);
  end;
  /
  这样,可以在未知其他字段大小和类型的时候定义变量,提高兼容性。
  三、DML 操作:
  1、实例:
  declare
  v_empno emp.empno%type;
  begin
  select max(empno)
  into v_empno
  from emp;
  v_empno:=v_empno+1;
  insert into emp(empno,ename,job,deptno)
  values(v_empno,'asdfasdf','ddddd',10);
  end;
  /
  这样也可以实现如SEQUENCE一样的编号唯一递增。
  2、更新和删除:
  这个较为简单:
  DECLARE
  V_DEPTNO EMP.DEPtno%type :=10;
  begin
  delete from emp
  where deptno=v_deptno;
  end;
  /
  大家多多实践即可掌握。
  PLSQL首先检查一个标识符是否是一个数据库的列名,如果不是,再假定它是一个PLSQL的标识符。所以如果一个

PLSQL的变量名为ID,列中也有个ID,如:
  SELECT date_ordered, date_shipped
  INTO date_ordered, date_shipped
  FROM s_ord
  WHERE id = id;
  就会返回TOO MANY ROWS,这是要尽量避免的。
  四、SQL CURSOR
  游标是一个独立SQL工作区,有两种性质的游标:
  隐式游标: 当PARSE 和EXECUTE 时使用隐式游标。
  显式游标: 是由程序员显式声明的。
  游标的属性:
  SQL%ROWCOUNT:一个整数值,最近SQL语句影响的行数。
  SQL%FOUND  BOOLEAN属性,如果为TRUE,说明最近的SQL STATEMENT有返回值。
  SQL%NOTFOUND 与SQL%FOUND相反
  SQL%ISOPEN  在隐式游标中经常是FALSE,因为执行后立即自动关闭了。
  SQL> variable row_de number
  SQL> r
  1 declare
  2  v_deptno number:=10;
  3  begin
  4   delete from emp where
  5    deptno=v_deptno;
  6    :row_de:=sql%rowcount;
  7* end;
  PL/SQL 过程已成功完成。
  SQL> print row_de --这是一个SQL PLUS变量
  ROW_DE
  ----------
  4
  这时其实并没有真正的删除,而是需要 COMMIT或ROLLBACK,来完成事务。

请使用浏览器的分享功能分享到微信等