转至繁体中文版     | 网站首页 | 图文教程 | 资源下载 | 站长博客 | 图片素材 | 武汉seo | 武汉网站优化 | 
最新公告:     敏韬网|教学资源学习资料永久免费分享站!  [mintao  2008年9月2日]        
您现在的位置: 学习笔记 >> 图文教程 >> 数据库 >> ORACLE >> 正文
PL/Sql循序渐进全面学习教程--Oracle         ★★★★

PL/Sql循序渐进全面学习教程--Oracle

作者:闵涛 文章来源:闵涛的学习笔记 点击数:4219 更新时间:2009/4/22 22:04:46
>dbms_output.put_line (vtotal);
end;
/
   注意:在执行块之前,要在SQL PLUS中执行:SET SERVEROUTPUT ON
   三、以实例来说明函数的参数声明作用域
  declare
   v_weight number(3):=600;
v_message varchar2(255):=''''product10000'''';
begin
declare
   --sub-block
v_weight number(3):=1;
v_message varchar2(255):=''''pro300'''';
begin
v_weight:=v_weight +1;
end;
v_weight:=v_weight +1;
v_message:=v_message || ''''my name'''';
end;
/
  子块中的V_WEIGHT值为 2
   我们可以在子块中加入:dbms_output.put_line(''''subblock value is ''''||v_weight);
    在主体中加入:dbms_output.put_line(''''main value is ''''||v_weight);
    我们发现MAINBLOCK中V_WEIGHT为 601
   改动:
   1、在主块的声明中加  v_date date default sysdate;
   在子块中加入:dbms_output.put_line(''''subblock date value is ''''||v_date);
   执行结果:subblock date value is 22-11月-01
   ****说明:主块中的变量,如果子块中没有同名变量声明,则继承主块中的声明和初始化值;
   2、在子块中加入:v_sub char(9);
      dbms_output.put_line(''''subblock char value is ''''||v_sub);
      此时正常输出。
      在主块中加入:dbms_output.put_line(''''main char value is ''''||v_sub);
      输出:ORA-06550: 第 21 行, 第 45 列:
      PLS-00201: 必须说明标识符 ''''V_SUB''''
      说明:
      子块中声明的变量主块中并不知晓,因此出错。
      了解了此实例,一切情况的变量的值的走向就都明了了。
  

课程 十一 与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,来完成事务。
     

课程 十二 编写控制结构语句
                                  
本课重点:
   1、结构控制的的用途和类型
   2、IF 结构
   3、构造和标识不同的循环
   4、使用逻辑表
   5、控制流和嵌套
   
   注意:以下实例中标点均为英文半角
  
   一、控制执行流
       可以是分支和循环:IF THEN END IF
      IF condition THEN
statements;
[ELSIF condition THEN
statements;]
[ELSE
statements;]
END IF;
        例子:IF V_ENAME=''''OSBORNE'''' THEN
                  V_MGR:=22;
              END IF;
        这里我们可以注意,PLSQL和C语言或JAVA在条件上的不同,=代表关系运算,而:=代表赋值。
      看一个函数:
   create    FUNCTION calc_val
(v_start IN NUMBER)
RETURN NUMBER
IS
BEGIN
IF v_start > 100 THEN
RETURN (2 * v_start);
ELSIF v_start >= 50 THEN
RETURN (.5 * v_start);
ELSE
RETURN (.1 * v_start);
END IF;
END calc_val;
       现在,虽然我们尚未讲解CREATE 函数或过程,但可以看到IF 条件在其中的作用。
     二、注意LOGIC TABLE中的逻辑对应关系
    1、NOT、AND、OR
    2、任何表达式中含有空值结果都为 NULL
    3、连接字符串中含有空值会把NULL作为 EMPTY STRING
        declare
   v_deptno dept.deptno%type;
   v_loc dept.loc%type;
V_FLAG BOOLEAN ;
V_REC BOOLEAN :=FALSE; --此值改为TRUE、NULL、FALSE进行不同的比较
V_AVA BOOLEAN:=NULL;
    begin
V_FLAG:=V_REC AND V_AVA;
IF V_FLAG=TRUE THEN
   DBMS_OUTPUT.PUT_LINE (''''TRUE'''');
ELSIF V_FLAG=FALSE THEN
   DBMS_OUTPUT.PUT_LINE (''''FALSE'''');
ELSE
  DBMS_OUTPUT.PUT_LINE (''''NULL'''');
END IF;
 end;
/
   值得注意的是:NULL AND FALSE ---> FALSE
   这是在实践中总结出来的。
   三、基本循环基础:
   1、LOOP
statement1;
statement2;
. . .
EXIT [WHEN condition];
END LOOP;
   v_ord_id s_item.ord_id%TYPE := 101;
v_counter NUMBER (2) := 1;
BEGIN
. . .
LOOP
INSERT INTO s_item (ord_id, item_id)
VALUES (v_ord_id, v_counter);
v_counter := v_counter + 1;
EXIT WHEN v_counter > 10;
END LOOP;
    2、FOR循环:
  FOR index IN [REVERSE] lower_bound..upper_bound LOOP
statement1;
statement2;
. . .
END LOOP;
        
    实例:DECLARE
  V_LOWER NUMBER:=1;
   V_UPPER NUMBER:=23;
BEGIN
DBMS_OUTPUT.PUT_LINE('''''''');
   FOR I IN V_LOWER..V_UPPER LOOP
DBMS_OUTPUT.PUT_LINE(I);
END LOOP;
END;
/
    3、WHILE 循环:
   WHILE condition LOOP
statement1;
statement2;
. . .
END LOOP;
   4、循环是可以多层嵌套的。可以用<<LABEL>>做循环的标签。
...
BEGIN
<<Outer–loop>>LOOP
v_counter :=v_counter+1;
EXIT WHEN v_counter>10;
<<Inner–loop>>LOOP
...
EXIT Outer_loop WHEN total_done = ’YES’;
–– Leave both loops
EXIT WHEN inner_done = ’YES

上一页  [1] [2] [3] [4] [5] [6] [7] [8]  下一页


[学习帮助]为什么学习那么的令人害怕呢.?  [精彩网文]直面高三
[精彩网文]学习成功=100%的学习意愿+100%的切实行动  [办公软件]学习PowerPoint心得体会
[网络安全]菜鸟学习—认识无线网络安全技术规范  [Web开发]如何学习Asp.net九步曲—菜鸟导读
[Web开发]最简单的AJAX 无刷新学习例子(示例,包含代码和完…  [Web开发]推荐学习的与NET相关的⑩项技术
[平面设计]Flash动画学习心得体会  [平面设计]学习Flash动画制作技巧、帧的理论知识尤为重要
教程录入:mintao    责任编辑:mintao 
  • 上一篇教程:

  • 下一篇教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      注:本站部分文章源于互联网,版权归原作者所有!如有侵权,请原作者与本站联系,本站将立即删除! 本站文章除特别注明外均可转载,但需注明出处! [MinTao学以致用网]
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

    同类栏目
    · Sql Server  · MySql
    · Access  · ORACLE
    · SyBase  · 其他
    更多内容
    热门推荐 更多内容
  • 没有教程
  • 赞助链接
    更多内容
    闵涛博文 更多关于武汉SEO的内容
    500 - 内部服务器错误。

    500 - 内部服务器错误。

    您查找的资源存在问题,因而无法显示。

    | 设为首页 |加入收藏 | 联系站长 | 友情链接 | 版权申明 | 广告服务
    MinTao学以致用网

    Copyright @ 2007-2012 敏韬网(敏而好学,文韬武略--MinTao.Net)(学习笔记) Inc All Rights Reserved.
    闵涛 投放广告、内容合作请Q我! E_mail:admin@mintao.net(欢迎提供学习资源)

    站长:MinTao ICP备案号:鄂ICP备11006601号-18

    闵涛站盟:医药大全-武穴网A打造BCD……
    咸宁网络警察报警平台