PL/SQL程序设计(1)

今天也开始学习PL/SQL
 
PL/SQL块结构:
PL/SQL支持两者类型的程序:一种是匿名块程序,另一种是命名块程序。
这两种程序都有声明,执行和异常处理部分或块。匿名块支持批脚本,而命名块能提供存储编程单元。
OL/SQL匿名块程序的基本原理如下:
[DECLARE]
        declaration_statements
BEGIN
         execution_statements
[EXCEPTION]
          exception_handing_statements
END;
/
PL/SQL对于匿名块只要求必须有执行部分。
 
必须启用SQL*PLUS  SERVEROUTPUT变量将内容显示到控制台。
 
 
set serveroutput on size 10000;
begin
dbms_output.putline('hello word!');
end;
/
 
注意:
每个PL/SQL块必须包含一些内容,至少要有一个NULL;语句,否则会使运行时编译(也称为分析)失败。
 
SQL*PLUS支持在交互式控制台中使用替换变量(以&符号开头)。替换变量是变长字符串或数字。永远不要在声明块中赋动态值,如使用替换变量。
 
PL/SQL中的赋值运算符是冒号后紧跟等号。PL/SQL字符串字面值用单引号分割。
ORACLE SQL*PLUS中的@符号加载和执行一个脚本文件。
也可以
a)在一个匿名块的执行部分有嵌套的匿名块程序;
b)在声明部分包含命名块程序,然后依次又包含同类型的嵌套程序;
c)调用存储命名块程序;
 
 
变量,赋值和运算符
变量名以字母开头,可以包含字母,数字,$及#符号。变量只有局部作用域。
这意味这他们只在给定PL/SQL块的作用域中可用。列外的是嵌套的匿名块。嵌套的匿名块在定义块中起作用。因此,他们可从包含快访问变量,除非在嵌套的匿名块中声明了相同的变量。
没有现实赋值的数字变量的声明使得其初值为null。
 
可使用赋值运算符或DEFAULT保留字交替地赋初值。下面显示了一个原型:
DECLARE
      variable_name  NUMBER  [:=  |  DEFAULT]  1;
BEGIN
      variable_name  := 1;
END;
/
 
注意:
只有返回SQL数据类型的函数可在SQL语句中调用。返回PL/SQL数据类型的函数只能用于PL/SQL块中。
 
控制结构
条件结构:PL/SQL中有两种类型的条件结构。一种是IF语句,另一种是CASE语句。
IF语句有两种子类型,即if-then-else和if-then-elseif-then-else.
 
IF语句:
下列所示为if-then-else PL/SQL块的基本原理:
IF  [NOT]  lift_operand1  =  right_operanf1   [[AND|OR]
     [NOT]  lift_operand2  =  right_operanf12  [[AND|OR]
      [NOT]  boolean_operand ]] THEN
     NULL;
ELSE
      NULL;
END IF;
 
提示:
可以使用比较运算符和常量(如 some_boolean = TRUE)检查BOOLRAN值是否为true,但通常不这样用。
 
NVL()函数有两个参数:第一个是变量,第二个是字面值,这个字面值可以是数值型,字符串或常量值。这两个参数必需共享相同的数据类型
 
下列所示就是if-then-elseif-then-else PL/SQL块的基本原理:
IF  [NOT]  lift_operand1  =  right_operanf1   [[AND|OR]  
              NULL;
 
ELSEIF      NOT]  lift_operand1  =  right_operanf1      [[AND|OR]
                    [NOT]  lift_operand2  =  right_operanf12  [[AND|OR]
                    [NOT]  boolean_operand ]]  THEN
                     NULL;
ELSE
      NULL;
END IF;
 
2.。CASE语句
有两种CASE语句:一种是简单CASE语句,另一种是CASE搜索语句。
下列所示为CASE语句的通用原型:
CASE [TRUE | [selector_variable]]
      WHEN [criterion1  |  expression1]  THEN
                 criterion1_statements;
      WHEN [criterion2  |  expression2]  THEN
                 criterion2_statements;
      WHEN [criterion(n+1)  |  expression(n+1)]  THEN
                 criterion(n+1)_statements;
      ELSE
                 block_statments;
  ENS CASE;
 
下列程序演示了CASE搜索语句:

BEGIN
 
 CASE  TRUE
   WHEN (1>3) THEN
    dbms_output.put_line('one is greater than three');
   WHEN (3<5) THEN
    dbms_output.put_line('three is less than five');
   WHEN (1=2) THEN
    dbms_output.put_line('one enquals two');
   ELSE
    dbms_output.put_line('NOTHING WORKED');
 END CASE;
END;
 
提示:
可以省去TRUE(因为他是默认选择符),但最好不要这样做,这样做可使代码更清楚。
 
 
PL/SQL支持数值FOR循环和游标FOR循环。数值FOR循环在定义的范围内迭代,而游标FOR循环实在SELECT语句游标返回的杭中迭代。
数值FOR循环具有下列原型:
FOR I IN starting_number..ending_number LOOP
 Statement;
END LOOP;
starting_number 和ending_number必需为整形。
下列实例程序显示1――10的索引值:
BEGIN
 
 FOR i IN 1..10 LOOP
  dbms_output.put_line('the index value is ['|| i ||']');
 END LOOP;
 
END;
游标FOR循环需要一个局部定义的CURSOR。不能使用游标FOR循环迭代引用游标(REF CURSOR)。因为要迭代引用游标,只能使用显示循环结构,如简单循环和WHILE循环。
他具有下列原型:
FOR i IN {cursor_name[(parameter1, parameter(n+1))] | (sql_statement)} LOOP
 Statemengt;
END LOOP;
下面演示了如何在FOR循环中编写显示游标,并使用可下载脚本播种的数据:
DECLARE
 CURSOR c IS SELECT OBJECT_NAME FROM lianxi l;
BEGIN
  FOR i IN c LOOP
   dbms_output.put_line('the title is [' || i.OBJECT_NAME || ']' );
  END LOOP;
  
END;
下面演示了如何在FOR循环中编写隐式游标,并使用可下载脚本播种的数据:
BEGIN
 FOR i IN (SELECT OBJECT_NAME FROM lianxi l) LOOP
  dbms_output.put_line('the title is [' || i.OBJECT_NAME || ']' );
 END LOOP;
END;
简单循环:
简单循环是显示结构。他们要求用户管理循环索引和推出条件。简单循环一般与局部定义游标语句和引用游标(REF CURSOR)一起使用。
Oracle提供 6个游标特性来帮助管理循环中的活动。其中4个游标特性是%FOUND,%NOTFOUND,%ISOPEN和%ROWCOUNT.
下列所示为简单循环的原型,使用了显示CURSOR:
OPEN cursor_name[(paramenter1, paramenter(n+1))];
LOOP
FETCH cursor_name
 INTO row_structure_variable  | column_variable1 [,column_variable(n+1)];
  EXIT WHEN CURSOR%NOTFOUND;
  STATEMENT;
END LOOP;
CLOSE CURSOR_NAME;
下列程序模拟了对lianxi表执行游标FOR循环:
DECLARE
 CURSOR c IS SELECT l.object_name FROM lianxi l;
 title lianxi.object_name%TYPE;
BEGIN
 
 OPEN c;
 LOOP
  FETCH c INTO title;
  EXIT WHEN c%NOTFOUND;
  dbms_output.put_line('the title is [' || title || ']' );
 END LOOP;
 CLOSE c;
 
END;
WHILE循环
WHILE循环不同于简单循环,因为它检查进入循环的条件而不是推出。它设置进入控制条件(entry  guard)为前置条件表达式。只有在控制条件满足时,才能进入循环。
基本语法如下:
OPEN  cursor_name [(paramenter1, paramenter(n+1))];
WHILE condition LOOP
 FETCH  cursor_name
 INTO row_structure_variable | column_variable1[,column_variable(n+1)];
  EXIT WHEN cursor_name%NOTFOUND;
  Statement;
END LOOP;
CLOSE cursor_name;
如果检查一个打开的CURSOR,哪WHILE条件将是cursor_name%ISOPEN.
下列代码演示了如何将%ISOPEN游标特性用于控制进入条件:
DECLARE
 CURSOR c IS SELECT l.object_name FROM lianxi l;
 titel lianxi.object_name%TYPE;
BEGIN
 OPEN c;
 WHILE c%ISOPEN LOOP
  FETCH c INTO titel;
  IF c%NOTFOUND THEN
   CLOSE c;
  END IF;
  dbms_output.put_line('the title is [' || titel || ']' );
 END LOOP;
 
END;
 
 
 
 
 
 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/8183550/viewspace-660035/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/8183550/viewspace-660035/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值