PLSQL语法
Procedural Language和SQL的结合体。通过增加变量、控制语句,使我们可以写些逻辑更加复杂的数据库操作
语句框架组成
declare – 可选
声明各种变量或游标的地⽅。
begin – 必要
开始执⾏语句。
--单⾏注释语句⽤两个连在⼀起的‘-’表⽰。
/*多⾏注释语句,
可以换⾏*/
exception – 可选
出错后的处理。
end; – 必要(请注意end后⾯的分号)
简单helloworld程序
1declare
2    v_temp number(6):=123; /* := 是⼀个赋值符号 */
3begin
4    dbms_output.put_line('middle');
5    dbms_output.put_line(v_temp);
6end;
注意
要想显⽰程序的东西需要设置环境
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_pno%type;
%rowtype 与表结构完全⼀致 %rowtype 举例:
1declare
2  v_tt emp%rowtype;
3begin
4select*into v_tt from emp where empno=7521;
5      dbms_output.put_line(v_tt.job);
6      dbms_output.put_line(v_tt.sal);
7end;
8
9输出:SALESMAN
101250
varray
定义语法
TYPE VARRAY NAMEIS VARRAY(SIZE) OF ELEMENT TYPE [NOT NULL];
其中,varray name是VARRAY数据类型的名称,size是正整数,表⽰可以容纳的成员的最⼤数量,每个成员的数据类型是element typeo默认时,成员可以取空值,否则需要使⽤NOT NULL加以限制。
数组是具有相同数据类型的⼀组成员的集合。每个成员都有⼀个唯⼀的下标,它取决于成员在数组中的位置。在PL/SQL中,数组数据类型是VARRAY(variable array,即可变数组)。
1declare
2    type my_varray is varray(2) of varchar2(12) not null;
3    varray_my my_varray;
4begin
5    varray_my:=my_varray('dsa','sdafds');
6    dbms_output.put_line(varray_my(1));
7end;
如果初始化数量⼤于设定的⼤⼩,会报下标超出限制异常
如果初始化数量⼩于设定的⼤⼩,会按照初始化数量进⾏设定⼤⼩,访问不存在数据的下标(即使在设定范围内).也会报异常
1DECLARE
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;
6BEGIN
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));
18END;
table
定义记录表(或索引表)数据类型。它与记录类型相似,但它是对记录类型的扩展。它可以处理多⾏记录,类似于C语⾔中的⼆维数组,使得可以在PL/SQL中模仿数据库中的表。
定义记录表类型的语法如下:
TYPE TABLE NAME IS TABLE OF ELEMENT_TYPE [NOT NULL] INDEX BY [BINARY INTEGER|LS INTEGER|VARRAY2];
关键字INDEX BY表⽰创建⼀个主键索引,以便引⽤记录表变量中的特定⾏。 BINARY_INTEGER的说明
如语句:TYPE NUMBERS IS TABLE OF NUMBER INDEX BY BINARY INTEGER;其作⽤是,加”INDEX BYBINARY INTEGER ”后,NUMBERS类型的下标就是⾃增长,NUMBERS类型在插⼊元素时,不需要初始化,不需要每次EXTEND增加⼀个空间。
⽽如果没有这句话“INDEXBY BINARY_INTEGER”,那就得要显⽰对初始化,且每插⼊⼀个元素到NUMBERS类型的TABLE中时,都需要先EXTEND。
1--table 不能像varray⼀样初始化数据,只能⼀个⼀个赋值
2declare
3  type table_my is table of number not null index by binary_integer;-- by binary_integer表⽰创建⼀个主键索引,以便引⽤记录表变量中的特定⾏。
4  my_table table_my;
5begin
6  my_table(1):=23;
7  my_table(2):=24;
8  my_table(3):=24;
9  dbms_output.put_line(my_table(1));
10end;
11
12结果: 23
13
14
15---table结合rowtype的使⽤
16declare
17 type table_my is table of emp%rowtype index by binary_integer;
18
19 my_table table_my;
20begin
21select*BULK COLLECT into my_table from emp ;
22for i in my__table.last loop
23    dbms_output.put_line(my_table(i).empno||'=='||my_table(i).ename||'=='||my_table(i).job);
24end loop;
25end;
26
27结果:1357==oracle==
287369==SMITH==CLERK
297499==ALLEN==SALESMAN
30    ...
table常见⽅法
record
定义记录数据类型。它类似于C语⾔中的结构数据类型(STRUCTURE),PL/SQL提供了将⼏个相关的、分离的、基本数据类型的变量组成⼀个整体的⽅法,即RECORD复合数据类型。在使⽤记录数据类型变量时,需要在声明部分先定义记录的组成、记录的变量,然后在执⾏部分引⽤该记录变量本⾝或其中的成员。
定义记录数据类型的语法如下:
TYPE RECORD NAME IS RECORD(
  V1 DATA TYPE1 [NOT NULL][:=DEFAULT VALUE],
  V2 DATATYPE2 [NOT NULL][:=DEFAULTVALUE],
  VN DATA TYPEN [NOT NULL][:=DEFAULT_VALUE]
);
1---record实现多列多⾏查询
2declare
3  type my_record is record(
4        v_pno%type,
5        v_ame%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;
10begin
11select empno,ename,job BULK COLLECT into table_my from emp ;
12for i in table_able_my.last loop
13    dbms_output.put_line(table_my(i).v_empno||'=='||table_my(i).v_ename||'=='||table_my(i).v_job);
14end loop;
15end;
16结果同上⼀个table
boolean
布尔值只有TRUE, FALSE及 NULL 三个值
单⾏取值select
语法格式
select 字段 into 变量 from 表 where 条件
1. 将查询到得数据放⼊变量中
2. 确保必须有唯⼀⼀个字段
3. 不能存在多个值,也不能为空,否则报错
4. 将查询到得数据放⼊变量中
异常处理,⼀级⾃定义异常
语法格式
EXCEPTION
  WHEN first exception THEN code to handle first exception
  WHEN second exception THEN code to handle second exception  WHEN OTHERS THEN code to handle others exception
END;
异常处理可以按任意次序排列,但 OTHERS 必须放在最后
常见异常
⾃定义异常:
1declare
2    v_exception exception;
3    v_sal emp.sal%type;
4begin
5select sal into v_sal from emp where empno=7521;
6if v_sal>1000then
7    raise v_exception;
8else
9      dbms_output.put_line('还可以');
10end if;
11    exception
12when v_exception then
13        dbms_output.put_line('钱太少啦');
14end;
15
16结果:钱太少啦
⾃定义错误----------------
1declare
plsql注册码激活2 v_sal emp.sal%type;
3begin
4select sal into v_sal from emp where empno=7521;
5if v_sal>1000then
6    raise_application_error('-20000','⼯资太低啦');
7else
8      dbms_output.put_line(v_sal);
9end if;
10
11end;
12结果:会弹出弹出框错误
PLSQL嵌套DML的 insert update delete
1. 直接使⽤
2. DML语句起作⽤或者回退的话,需要显式的调⽤commit或者rollback
3. sql%rowcount属性来记录最后⼀条SQL语句影响了多少条记录
insert
1declare
2    v_pno%type:=&s_empno;
3begin
4insert into emp(empno,ename) values(v_empno,'张三');
5if v_empno>4then
6rollback;
7      raise_application_error('-20000','不能这样插滴~~');
8end if;
9end;
10结果弹出错误.
update和delete⽤法同上
execute immediate的⽤法
拼接字符串:标准的sql语句
execute immediate +字符串
execute immediate +字符串 into 变量 using 参数
- execute immediate 执⾏ddl语句或dml语句或dcl语句 (标准的sql语句) 1----1---
2declare
3    v_sql varchar2(122):='insert into emp(empno,ename) values(:a,:b)';
4begin
5execute immediate v_sql using 111,'shfdk';
6commit;
7end;
8
9----2-----
10declare
11      v_sql  varchar2(122) :='select ename from emp where sal=:a';
12      v_ame%type;
13begin
14execute immediate v_sql
15into v_name
16        using 800;
17      dbms_output.put_line(v_name);
18end;
循环结构
when
1打印偶数
2declare
3  v_num number(3, 0) :=0;
4begin
5  loop
6    dbms_output.put_line(v_num);
7    v_num := v_num +2;
8exit when v_num =100;
9end loop;
10end;
for循环
1打印乘法⼝诀表
2begin
3for i in1..9 loop
4for j in1..i loop
5      dbms_output.put(j||'*'||i||'='||(i*j)||chr(9));
6if i=j then  w_line();
7end if;
8end loop;

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。