PLSQL语法

  • 格式:pdf
  • 大小:422.13 KB
  • 文档页数:6

PLSQL语法

Procedural Language和SQL的结合体。通过增加变量、控制语句,使我们可以写些逻辑更加复杂的数据库操作

语句框架组成

declare – 可选

声明各种变量或游标的地⽅。begin – 必要

开始执⾏语句。--单⾏注释语句⽤两个连在⼀起的‘-’表⽰。

/*多⾏注释语句,

可以换⾏*/exception – 可选

出错后的处理。end; – 必要(请注意end后⾯的分号)

简单helloworld程序

1 declare

2 v_temp number(6):=123; /* := 是⼀个赋值符号 */

3 begin

4 dbms_output.put_line('middle');

5 dbms_output.put_line(v_temp);

6 end;

注意

要想显⽰程序的东西需要设置环境

set serveroutput off -->关闭输出(默认关闭)

set serveroutput on -->打开输出基本数据类型

Number 数字型

Int 整数型

Pls_integer 整数型,产⽣溢出时出现错误

Binary_integer 整数型,表⽰带符号的整数

Char 定长字符型,最⼤255个字符

Varchar2 变长字符型,最⼤2000个字符

Long 变长字符型,最长2GB

Date ⽇期型

Boolean 布尔型(TRUE、FALSE、NULL三者取⼀)

%type 表⽰不需要知道具体的⼀个字段类型,与指定的字段类型⼀致即可。例如:v_empno emp.empno%type;

%rowtype 与表结构完全⼀致 %rowtype 举例:

1 declare

2 v_tt emp%rowtype;

3 begin

4 select * into v_tt from emp where empno=7521;

5 dbms_output.put_line(v_tt.job);

6 dbms_output.put_line(v_tt.sal);

7 end;

8

9 输出:SALESMAN

10 1250

varray

定义语法

TYPE VARRAYNAMEIS VARRAY(SIZE) OF ELEMENTTYPE [NOT NULL];

其中,varrayname是VARRAY数据类型的名称,size是正整数,表⽰可以容纳的成员的最⼤数量,每个成员的数据类型是

elementtypeo默认时,成员可以取空值,否则需要使⽤NOT NULL加以限制。

数组是具有相同数据类型的⼀组成员的集合。每个成员都有⼀个唯⼀的下标,它取决于成员在数组中的位置。在PL/SQL中,数

组数据类型是VARRAY(variable array,即可变数组)。

1 declare

2 type my_varray is varray(2) of varchar2(12) not null;

3 varray_my my_varray;

4 begin5 varray_my:=my_varray('dsa','sdafds');

6 dbms_output.put_line(varray_my(1));

7 end;

如果初始化数量⼤于设定的⼤⼩,会报下标超出限制异常

如果初始化数量⼩于设定的⼤⼩,会按照初始化数量进⾏设定⼤⼩,访问不存在数据的下标(即使在设定范围内).也会报异常

1 DECLARE

2 --定义⼀个最多保存5个VARCHAR(25)数据类型成员的VARRAY数据类型

3 TYPE reg_varray_type IS VARRAY(5) OF VARCHAR(25);

4 --声明⼀个该VARRAY数据类型的变量

5 v_reg_varray REG_VARRAY_TYPE;

6 BEGIN

7 --⽤构造函数语法赋予初值

8 v_reg_varray := reg_varray_type

9 ('中国', '美国', '英国', '⽇本', '法国');

10 DBMS_OUTPUT.PUT_LINE('地区名称:'||v_reg_varray(1)||'、'

11 ||v_reg_varray(2)||'、'

12 ||v_reg_varray(3)||'、'

13 ||v_reg_varray(4));

14 DBMS_OUTPUT.PUT_LINE('赋予初值NULL的第5个成员的值:'||v_reg_varray(5));

15 --⽤构造函数语法赋予初值后就可以这样对成员赋值

16 v_reg_varray(5) := '法国';

17 DBMS_OUTPUT.PUT_LINE('第5个成员的值:'||v_reg_varray(5));

18 END;table

定义记录表(或索引表)数据类型。它与记录类型相似,但它是对记录类型的扩展。它可以处理多⾏记录,类似于C语⾔中的⼆

维数组,使得可以在PL/SQL中模仿数据库中的表。

定义记录表类型的语法如下:

TYPE TABLE NAME IS TABLE OF ELEMENT_TYPE [NOT NULL] INDEX BY [BINARYINTEGER|LSINTEGER|VARRAY2];

关键字INDEX BY表⽰创建⼀个主键索引,以便引⽤记录表变量中的特定⾏。 BINARY_INTEGER的说明

如语句:TYPE NUMBERS IS TABLE OF NUMBER INDEX BY BINARYINTEGER;其作⽤是,加”INDEX BYBINARYINTEGER

”后,NUMBERS类型的下标就是⾃增长,NUMBERS类型在插⼊元素时,不需要初始化,不需要每次EXTEND增加⼀个空间。

⽽如果没有这句话“INDEXBY BINARY_INTEGER”,那就得要显⽰对初始化,且每插⼊⼀个元素到NUMBERS类型的TABLE中

时,都需要先EXTEND。

1 --table 不能像varray⼀样初始化数据,只能⼀个⼀个赋值

2 declare

3 type table_my is table of number not null index by binary_integer;-- by binary_integer表⽰创建⼀个主键索引,以便引⽤记录表变量中的特定⾏。

4 my_table table_my;

5 begin

6 my_table(1):=23;

7 my_table(2):=24;

8 my_table(3):=24;

9 dbms_output.put_line(my_table(1));

10 end;

11

12 结果: 23

13

14

15 ---table结合rowtype的使⽤

16 declare

17 type table_my is table of emp%rowtype index by binary_integer;

18

19 my_table table_my;

20 begin

21 select * BULK COLLECT into my_table from emp ;

22 for i in my_table.first..my_table.last loop

23 dbms_output.put_line(my_table(i).empno||'=='||my_table(i).ename||'=='||my_table(i).job);

24 end loop;

25 end;

26

27 结果:1357==oracle==

28 7369==SMITH==CLERK

29 7499==ALLEN==SALESMAN

30 ...

table常见⽅法record

定义记录数据类型。它类似于C语⾔中的结构数据类型(STRUCTURE),PL/SQL提供了将⼏个相关的、分离的、基本数据类型的

变量组成⼀个整体的⽅法,即RECORD复合数据类型。在使⽤记录数据类型变量时,需要在声明部分先定义记录的组成、记录

的变量,然后在执⾏部分引⽤该记录变量本⾝或其中的成员。

定义记录数据类型的语法如下:

TYPE RECORDNAME IS RECORD(

V1 DATATYPE1 [NOT NULL][:=DEFAULTVALUE],

V2 DATATYPE2 [NOT NULL][:=DEFAULTVALUE],

VN DATATYPEN [NOT NULL][:=DEFAULT_VALUE]

);

1 ---record实现多列多⾏查询

2 declare

3 type my_record is record(

4 v_empno emp.empno%type,

5 v_ename emp.ename%type,

6 v_job emp.job%type

7 );

8 type my_table is table of my_record index by binary_integer;

9 table_my my_table;

10 begin

11 select empno,ename,job BULK COLLECT into table_my from emp ;

12 for i in table_my.first..table_my.last loop

13 dbms_output.put_line(table_my(i).v_empno||'=='||table_my(i).v_ename||'=='||table_my(i).v_job);

14 end loop;

15 end;

16 结果同上⼀个tableboolean

布尔值只有TRUE, FALSE及 NULL 三个值

单⾏取值select

语法格式

select 字段 into 变量 from 表 where 条件

1. 将查询到得数据放⼊变量中

2. 确保必须有唯⼀⼀个字段

3. 不能存在多个值,也不能为空,否则报错