oracle PL/SQL(procedure language/SQL)程序设计

PL/SQL(procedure language/SQL)语言是Oracle对SQL语言的过程化扩充,是一个完整的编程语言。
PL/SQL实现了过程化语句(如分支、循环等)与SQL语句的无缝连接,将过程化语言的数据处理能力与SQL语言的访问数据库的能力有机地结合在一起。
PL/SQL语言在Oracle系统中是核心的编程语言,它应用于很多方面,如存储过程、触发器、包、函数和Web应用等。
PL/SQL语言编写的不是客户端程序而是服务器端的程序


PL/SQL字符集

合法字符

    所有大小写字母
  数字0~9。
  符号:( ) +-* /〈〉=!~;:.‘@ % “# $ ^ & _ | { } ? [ ]。
  其中一些字符用于编程,另一些用作算术运算操作符(除法、加法、幂等)及关系运算符(等于和不等于)。
算术运算符

运算符意义
+  加法
- 减法
*  乘法
/  除法
** 幂
|| 连接
关系运算符

下面列出了PL/SQL中常用的关系运算符。
运算符意义
<> 不等于
!= 不等于
^= 不等于
<  小于
>  大于
=  等于
>= 大于等于
<= 小于等于

其他符号(非常重要,不要小瞧)

PL/SQL为支持编程,还使用其他符号。下面列出了常用的符号。
( )  列表分隔('Jones','Roy','Abramson')
;      语句结束Procedure_name(arg1,arg2);
.      项分隔(Select * from account.table_name;)
’   字符串界定符if var1='SANDRA‘
:=  赋值Rec_read:=rec_read+1;
||     并置Full_name:='Nahtan'||''||'Yebba‘
--  注释符—This is a comment
/*与*/ 注释定界符/*This,too,is a comment*/


PL/SQL块结构

例如:

DECLARE
   v_n NUMBER(20);
BEGIN
   v_n:=65/0;
EXCEPTION
   WHEN ZERO_DIVIDE THEN
   dbms_output.put_line('divided by zero');
END;


“匿名”(anonymous)块通常是动态生成,它只能被执行一次。
子程序”(subprogram)是存储在数据库内部的过程、包、触发器和函数,通过显式调用可以执行该子程序。
“函数”(function)除了必须返回一个值外,它与存储过程(procedure)相似。
“触发器”(trigger)是存储在数据库内部的带名块。当触发事件出现时,触发器便被显式地执行。


PL/SQL变量 变量类型
Scalar 标量型
Composite 复合型
Reference 引用型
LOB (large objects)  大对象型
非PL/SQL变量
链接变量

声明PL/SQL变量
identifier [CONSTANT] datatype [NOT NULL]   
        [:= | DEFAULT expr];
Declare
  v_hiredate        DATE;        
  v_deptno            NUMBER(2) NOT NULL := 10;
  v_location        VARCHAR2(13) := 'Atlanta';
  c_    comm            CONSTANT NUMBER := 1400;
在同一PL/SQL块中不能有两个相同的变量名。
在同一PL/SQL块中变量名不能和表的列名相同。
显然赋值操作符:
:= 赋值操作符


基本标量数据类型
 VARCHAR2 (maximum_length)
NUMBER [(precision, scale)]
DATE
CHAR [(maximum_length)]
LONG
LONG RAW
BOOLEAN
BINARY_INTEGER


(1)Varchar2为可变长的字母数字数据类型。在PL/SQL中,varchar2的最大长度为32767字节。如  vc_field varchar2(10):='STARTVALUE';
(2)number类型数据可用来表示所有的数值数据,说明格式为:
 num_field number(precision,scale);
   其中,precision可以有1~38个数字位,而scale(-84~127)表示在precision位数字中小数点后的数字位数,下面的定义:
   num_fieldnumber(12,2);
   表示num_field是一个整数部分最多10位、小数部分最多2位的变量。
(3)DATE 此数据类型用于保存固定长度的日期值,date变量的说明为:
      date_field date;
在缺省时,Oracle以DD-MON-YY格式显示日期。因此,2004年9月9日显示为09-SEP-04。
PL/SQL中编程处理日期必须使用这种格式。是否可以说用户必须用数据库缺省的日期格式,除非用户用TO_CHAR或TO_DATE。
提示:Oracle中还有DD-MON-RR的日期格式,用来表示4位年份以确保Oracle不会省去两位纪元数。
(4)BOOLEAN
Boolean变量只有三种值TRUE、FALSE和NULL。
Boolean变量一般和逻辑操作符AND, OR, 和 NOT一起使用。



Examples

v_job                VARCHAR2(9) DEFAULT ‘CLERK';
v_count            BINARY_INTEGER := 0;
v_total_sal        NUMBER(9,2) := 0;
v_orderdate        DATE := SYSDATE + 7;
c_tax_rate        CONSTANT NUMBER(3,2) := 8.25;定义常量时必须同时为它赋值,否则会出现错误。
v_valid            BOOLEAN NOT NULL := TRUE;



%TYPE属性

声明一个变量根据下述条件来声明:
数据库中定义的列
先前已经声明的变量
使用%TYPE属性的前缀:
数据库的表和列名
先前声明的变量名

用%TYPE属性声明变量

examples:

...
  v_ename                    emp.ename%TYPE;
  v_balance                    NUMBER(7,2);
      v_min_balance            v_balance%TYPE := 10;
...        
这种定义方法有以下好处:
在不清楚EMP表的列定义细节的情况下,也可以保证两者定义一致。
如果改变数据库中EMP表的ename列定义,不需要修改PL/SQL程序中V_ENAME变量定义。
也就是说上述 的v-ename 和 v-min_balance的 PL/SQL的数据类型和 emp.ename,v-balance的数据 一样。


 

%ROWTYPE属性:声明一个与数据库表的行具有相同类型的记录变量


 

原文地址:https://www.cnblogs.com/pacoson/p/3523165.html