今天也开始学习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;
数值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;
简单循环是显示结构。他们要求用户管理循环索引和推出条件。简单循环一般与局部定义游标语句和引用游标(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;
下列代码演示了如何将%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/