Oracle学习(九)——————————————PL/SQL编程

 

PL/SQL时一种过程化语言,可以通过if或loop语句进行实现控制程序执行过程

一、PL/SQL简介

1.PL/SQL格式

[declare]   //声明部分,可选

begin       //执行部分

exception//异常部分,可选

end;

/

我们写一个hello world

SQL> begin
  2  dbms_output.put_line('hello world');
  3  end;
  4  /
hello world

PL/SQL 过程已成功完成。

输出了hello world

开始它可能没有输出,只显示加载成功,说明数据库把输出显示关掉了,所以先执行一次 set serveroutput on 就可以了。

2.PL/SQL注释

关键字:单行:--       多行/*     */

  2  dbms_output.put_line('hello world');--单行注释
  3  dbms_output.put_line('hello world');
  4  /*多行
  5  注释*/
  6  end;
  7  /
hello world
hello world

PL/SQL 过程已成功完成。

3.标识符

标识符可以是常量、变量、异常、显示游标、游标变量、参数、子程序以及包的名称。

定义常量、变量时:

1.每行只能定义一个常量和变量。

2.名称必须以英文字母开头,且最大长度为30.

3.名称只能使用 字母,数字,_,$,#.

4.不能使用orcale关键字

二、数据类型

1.数值型

数据类型                                                    描述
number(数据总长度,小数位长度)可以用来表示整数或者小数,占32个字节
PLS_INTEGER有符号的整数,范围-2^32~2^32.与number相比,所占空间小,性能好
BINARY_INTEGER不存储在数据库中,只能在PL/SQL使用带符号整数范围-2^32~2^32。如果运算溢出,则自动变为number类型

 

 

 

 

 

SQL> declare
  2  n number(3,2);--定义一个长度为3的数,小数长度为2
  3  begin
  4  n:=3.12;--赋值
  5  dbms_output.put_line(n);--输出
  6  end;
  7  /
3.12

PL/SQL 过程已成功完成。

2.字符型

数据类型描述
char(长度)定长字符串,如果所设置不足所定义的长度,则自动补充为空格,可以保存32767个字节
vaechar2(长度)可变长度字符串,可以保存1~21767个字节
nchar2(长度)定长字符串,保存为unicode编码数据
nvarchar2(长度)可变长度符串,保存为unicode编码数据
long可变长度数据,存储字符串长度超过4000时使用

 

 

 

 

 

 

 

SQL> declare
  2  ch1 char(3);
  3  ch2 char(1);
  4  vch1 varchar2(6);
  5  vch2 varchar2(6);
  6  begin
  7  ch1:='aa';
  8  ch2:='a';
  9  vch1:='abfc';
 10  vch2:='a';
 11  dbms_output.put_line('ch1='||ch1);
 12  dbms_output.put_line('ch2='||ch2);
 13  dbms_output.put_line('vch1='||vch1);
 14  dbms_output.put_line('vch2='||vch2);
 15  end;
 16  /
ch1=aa
ch2=a
vch1=abfc
vch2=a

PL/SQL 过程已成功完成。

注意:这里说的可变长度,是指在你定义长度范围内,你存了多少值,它便占用多大空间,而不是它可以自动扩容。

而定长是指如果你存的数据不够长度那么它会以空格填补,相对来说varchar2更加节省空间

3.日期类型

数据类型                                                                            描述
datedate是长度为7的字节列,可以保存日期和时间,不包含毫秒
timestampdate子类型,包含毫秒

 

 

 

 

SQL> declare
  2  day1 date;
  3  begin
  4  day1:=sysdate;
  5  dbms_output.put_line('day1='||day1);
  6  end;
  7  /
day1=25-12月-18

PL/SQL 过程已成功完成。

4.布尔型

数据类型描述
boolean可以设置为true.false.null

 

 

 

SQL> declare
  2  b1 boolean;
  3  begin
  4  b1:=true;
  5  if(b1) then
  6  dbms_output.put_line('结果为true');
  7  end if;
  8  end;
  9  /
结果为true

PL/SQL 过程已成功完成。

三、定义变量及赋值

1.定义一般变量

定义变量规则就不再说明了

赋值在declare中

具体语法:

变量名称 [constant] 类型 [not null] [:=value];

constant:定义常量,在定义时必须赋值

not null:此变量不允许为null

:=value:声明时赋值

SQL> declare
  2  str1 constant varchar2(6):='str1';--必须给初始值
  3  str2 varchar2(6) not null:='str2';--此时值不能e为null
  4  str3 varchar2(6):='str3';--在声明时赋值
  5  str4 varchar2(6);--在声明时没有赋值
  6  begin
  7  str4:='str4';
  8  dbms_output.put_line(str1||'-'||str2||'-'||str3||'-'||str4);
  9  end;
 10  /
str1-str2-str3-str4

PL/SQL 过程已成功完成。

2.%TYPE

创建一个与字段名相同类型的字段

格式:

变量名 表名称.字段名%TYPE

拿下面在这张表来做实验

SQL> select * from student order by sno asc;

       SNO SNAME                                    SSEX           SAGE SDEPT
---------- ---------------------------------------- -------- ---------- ----------------------------------------
         1 张波                                     男               18 软件工程
         2 李增福                                   男               21 预防医学
         3 安霞                                     女               21 临床医学
         4 贺建                                     女               20 应用数学
         5 杨鹏飞                                   男               20 应用数学
         6 李宇航                                   男               22 口腔医学
         7 苏小白                                   男               22 中医药
         8 李旭                                     男               19 临床医学
         9 张必过                                   男               19 预防医学
        10 安星宇                                   男               23 软件工程
        11 李四                                     男
        13 苏非                                     女               19 中医药

已选择12行。

输入学号输出对应的姓名 

SQL> declare
  2  no student.sno%TYPE;--创建一个和student.sno类型相同的变量
  3  sname student.sname%type;--创建一个和student.sname类型相同的变量
  4  begin
  5   no:=&sno;--从键盘输入学号
  6  select sname into sname from student where no=sno;--查到的姓名输入sname中
  7  dbms_output.put_line(sname);
  8  end;
  9  /
输入 sno 的值:  1
原值    5:  no:=&sno;--从键盘输入学号
新值    5:  no:=1;--从键盘输入学号
张波

PL/SQL 过程已成功完成。

3.使用record声明变量类型

其实这就是相当于在java你创建一个只有属性类,然后把这个类的对象当成一个变量

格式:

TYPE  名 IS RECORD

(

变量1 数据类型 [not null] [:=value],

....

变量n 数据类型 [not null] [:=value],

)

比如查一个学生姓名,年龄,性别

SQL> declare
  2  type student_type is record--定义自己的变量类似
  3  (
  4  name student.sname%type,
  5  age student.sage%type,
  6  sex student.ssex%type
  7  );
  8  stu student_type;--声明所创建的变量类型
  9  begin
 10  select sname,sage,ssex into stu from student where sno=1;
 11  dbms_output.put_line(stu.name||'-'||stu.age||'-'||stu.sex);
 12  end;
 13  /
张波              -18-男

PL/SQL 过程已成功完成。

4.使用%ROWTYPE声明变量

格式:

变量名 表名%rowtype

创建一个表的所有列的类型

比如查一个学生表的所有类型

SQL> declare
  2  stu student%rowtype;
  3  begin
  4  select * into stu from student where sno=1;
  5  dbms_output.put_line(stu.sno||'-'||stu.sname||'-'||stu.sage||'-'||stu.ssex||'-'||stu.sdept);
  6  end;
  7  /
1-张波              -18-男 -软件工程

PL/SQL 过程已成功完成。

四、流程控制语句

1.选择语句

a.if语句

格式:if 条件

       then 执行满足后的语句

     [ elsif 判断条件

       then 执行满足后的语句]

    [...........]

     [  else  所有调节都不满足的情况下

       end if;]

 []内是可有可无

比如根据输入的月份来判断是什么季节

SQL> declare
  2  n number;
  3  begin
  4  n:=&number;
  5  if n>=1 and n<=3 then
  6  dbms_output.put_line('春天');
  7  elsif n between 4 and 6 then
  8  dbms_output.put_line('夏天');
  9  elsif n in(7,8,9) then
 10  dbms_output.put_line('秋天');
 11  elsif n>10 and n<=12 then
 12  dbms_output.put_line('冬天');
 13  else
 14  dbms_output.put_line('输入有误');
 15  end if;
 16  end;
 17  /
输入 number 的值:  5
原值    4: n:=&number;
新值    4: n:=5;
夏天

PL/SQL 过程已成功完成。

b.case语句

格式:

case 变量 

when 表达式1 then 语句1;

when 表达式2 then 语句2;

.。。。

when 表达式n then 语句n;

 else 都不满足执行的语句;

end case;

类似switch语句

例:输入1234分别代表输出加减乘除

SQL> declare
  2  num number;
  3  begin
  4  num:=&number;
  5  case num
  6  when  1 then
  7  dbms_output.put_line('加');
  8  when 2 then
  9  dbms_output.put_line('减');
 10  when 3then
 11  dbms_output.put_line('乘');
 12  when 4 then
 13  dbms_output.put_line('除');
 14  else
 15  dbms_output.put_line('输入有误');
 16  end case;
 17  end;
 18  /
输入 number 的值:  1
原值    4: num:=&number;
新值    4: num:=1;
加

PL/SQL 过程已成功完成。

2.循环语句

a.loop语句

格式 1:

loop

 循环语句;

exit when 循环语句结束调节;

循环语句结束条件修改

end loop;

类似do while 语句

SQL> declare
  2  i number:=1;
  3  num number:=0;
  4  begin
  5  loop
  6  num:=num+i;
  7  exit when i>=100;
  8  i:=i+1;
  9  end loop;
 10  dbms_output.put_line(num);
 11  end;
 12  /
5050

PL/SQL 过程已成功完成。

格式2:

while(循环结束条件) loop

循环执行的语句块;

循环结束条件修改;

end loop;

类似while 语句

求1-100和

SQL> declare
  2   i number:=1;
  3   num number:=0;
  4   begin
  5   while i<=100 loop
  6   num:=num+i;
  7   i:=i+1;
  8   end loop;
  9   dbms_output.put_line(num);
 10  end;
 11  /
5050

PL/SQL 过程已成功完成。

b.for语句

for 循环计数器 in[reverse] 循环下限值..循环上限值 loop

循环语句块;

end loop;

求1-100之和

SQL> declare
  2   i number:=1;
  3   num number:=0;
  4   begin
  5   for i in 1..100 loop
  6   num:=num+i;
  7  end loop;
  8   dbms_output.put_line(num);
  9  end;
 10  /
5050

PL/SQL 过程已成功完成。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值