PL/SQL语言基础

1、PL/SQL块结构
  • 定义部分:用于定义常量、变量、游标、例外、复杂数据类型等
  • 执行部分:用于实现应用模块功能
  • 例外处理部分:用于处理执行部分可能出现的运行错误
2、PL/SQL块分类:可以分为匿名块、命名块、子程序、触发器等4类
  • 匿名块:没用名称的plsql块
  • 命名块:是指具有特定名称标识的plsql块,与匿名块非常类似,只不过在plsql块前使用<<>>加以标记。
  • 子程序:包括过程、函数和包,既可以开发客户端子程序也可以开发服务器端子程序
    • 过程:用于执行特定操作
    • 函数:函数用于返回特定数据。当建立函数时,在函数头必须包含return子句,而在函数体内必须要包含return语句返回数据。
    • 包:用于逻辑组合相关的过程和函,它由包规范和包体两部分组成。包规范用于定义公用的常量、变量、过程和函数,可以使用create package命令
      • 包规范只包含了过程和函数的说明,而没有过程和函数的实现代码。包体用于实现包规范中的过程和函数,使用create package body命令
      • 当调用包的过程和函数时,在过程和函数名之前必须要带有包名作为前缀(包名.子程序名),而如果要访问其他方案的包,还吸烟加上方案名作为前缀(方案名.包名.子程序名)
  • 触发器:是指隐含执行的存储过程
3、定义并使用变量
在编写plsql程序时,可以使用标量类型,复合类型,参照类型和LOB类型4种;
  • 标量类型:是指只能存放单个数值的变量。当定义标量变量时,必须要指定标量数据类型。标量数据类型包括数字类型,字符类型,日期类型和布尔类型。每种类型又包含有相应的子类型,例如number类型包含有integer,positive等子类型,常用的标量类型如下:
    • varchar2(n):用于定义可变长度的字符串,最大值为32767字节。当使用此类型是,必须要指定长度。需要注意,在plsql块中使用该数据类型操作varchar2表列是,其数值的长度不应该超过4000字节
    • char(n):用于定义固定长度的字符串,最大值为32767字节。当使用此类型是,如果没有指定n,则默认值为1。需要注意,在plsql块中使用该数据类型操作char表列是,其数值的长度不应该超过2000字节
    • number(p,s):用于定义固定长度的整数和浮点数。其中,p指定数字的总位数,s,指定小数点后数字位数。
    • date:用于定义日期和时间数据,其数据长度为固定长度(7字节)
    • timestamp:不仅会显示日期,还会显示时间和上下文标记
    • long 和long raw:long用于定义编程字符串,类似于varchar2数据类型。long raw用于定义变长的二进制数据。
  • 定义标量变量:identifier [constant] datatype [not null] [:= | default expr]:例如
    • v_ename varchar2(10);
    • v_sal number(6,2);
    • v_balance binary_float;
    • c_tax_rate constant number(3,2) :=5.5;
    • c_valid boolean not null default false;
  • 使用%type属性
    • 它会按照数据库列或其他变量来确定新变量的类型和长度
  • 标量类型:binary_double, binary_floart, binary_integer, bec,becimal, double precesion, float, int, integer, natural, naturaln, number, numberic, pls_integer, positive, real, signtype smallint, char, character, long, long raw, nchar, nvarchar2, raw, rowid, string, urowid, varchar, varchar2, boolean, date
复合变量
复合变量是指用于存放多个值的变量。plsql包括PL/SQL记录,PL/SQL表,嵌套表以及varray等4种复合数据类型
  • PL/SQL记录:类似于高级语言中的结构
    • 在定义部分定义记录类型和记录变量,然后在执行部分引用该记录变量
    • 在引用记录成员时,必须要加上记录变量作为前缀
  • PL/SQL表:类似于高级语言中的数组,但是有如下区别:高级语言数组的下标不能为负,plsql表的下标可以为负;
  • 嵌套表(Nested Table)类似于高级语言中的数组。需要注意:高级语言数组和嵌套表的下标都是不能为负值的。高级语言的元素个数是有限制的,嵌套表的元素个数是没有限制的
    • 嵌套表和plsql表的区别:嵌套表可以作为表列的数据类型,而plsql表不能;
    • 当在表列中使用嵌套表时,必须首先使用create type创建嵌套表类型
  • 变长数组(varray):类似于嵌套表,他可以作为表列和对象类型属性的数据类型
    • 嵌套表和变长数组的区别:嵌套表的元素个数没有限制,而varray的元素个数是有限制的;
    • 嵌套表列数据需要存储在专门的存储表中,而varray数据则和其他列数据一起存放在表段中
  • 符合类型:record, table, varray
参照变量
参照变量是指用于存放数值指针的变量。通过使用参照变量,可以使得应用程序共享相同对象,从而降低占用空间,可以通过使用游标变量(ref cursor)和对象类型变量 ref obj_type等两种参照变量类型。
  • 参照类型:ref cursor, ref object_type
  • ref cursor:
    • 当使用显式游标时,需要在定义显式游标是指定相应的select语句,这种显式游标称为静态游标。
    • 当使用游标变量时,在定义游标变量时不需要指定select语句,而是在打开游标是指定select语句,从而实现动态的游标操作
  • ref obj_type:当编写对象类型应用时,为了共享相同对象,可以使用ref引用对象类型。ref实际是指向对象实例的指针。
LOB变量
LOB变量是指用于存储大批量数据的变量。分为两种:内部LOB和外部LOB
内部LOB包括:CLOB,BLOB和NCLOB三种,他们的数据被存储在数据库中,并且支持事务操作(提交、退回、保存点)
外部LOB只有BFILE一种类型,该类型的数据被存储在OS文件中,并且不支持事务操作。
clob/nclob用于存储大批量字符数据,blob用于存储大批量二进制数据,bfile则存储指向os文件的指针
  • lob类型: bfile, blob, clob, nclob
非pl/sql变量
  • 使用sql*plus变量
  • 使用procedure builder变量
  • 使用pro*c/c++变量
编写plsql代码
  • plsql有分隔符(Delimiter)、标识符(Identifier)、文字串(Literal)和注释(Comment)四种词汇单元
  • 分隔符
    • 单符合分隔符: +, % , ', ., /, (, ), : ,, *, ", =, <, >, @, ;, -
    • 组合分隔符::=, ->, ||, **, <<, >>, /* , */, .., <>, !=, ^=, <=, >=, --,
  • 标识符:用于指定plsql程序单元和程序项的名称
  • 文本:是指数组,字符,字符串,日期值或布尔值,而不是标识符。文本包括数字文本,字符文本,字符串文本,布尔文本,日期时间文本
    • Oracle 10g之前包含单引号的字符串文本的定义方式: string_var := 'I''m a string, you''re a string.'; --使用两个单引号
    • Oracle10g中的表示方式: stirng_var := q'[I'm a sting,you're a string.]' --使用带有前缀q的其他分隔符,如[],{} <>等
    • 布尔文本有三种取值: true, false, null
  • 注释:有两种注释形式,单行注释和多行注释
pl/sql代码编写规则
  • 标识符命名规则:
    • 定义变量: v_前缀
    • 定义常量: c_前缀
    • 定义游标: _cursor后缀
    • 定义异常: e_前缀
    • 定义pl/sql表类型: _table_type后缀
    • 定义pl/sql表变量: _table后缀
    • 定义pl/sql记录类型: _record_type后缀
    • 定义pl/sql记录变量: _record后缀
v_sal number(6,2) not null; 这个是错误的,当指定not null时,必须给定数值,如:v_sal number(6,2) not null default 0.55;

你可能感兴趣的:(SQL和PLSQL)