添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
课程十一 与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,来完成事务。