PL/SQL(一):基础知识

一、什么是PL/SQL
 PL:Procedural language
 SQL:Structured Query Language
 PL/SQL是由Oracle开发,专用于Oracle的一种程序设计语言,对SQL语句的扩展,增加了编程语言的特点
二、优点
1、改善了性能
 以整个语句块发送给服务器端,降低网络拥挤
2、可重用性
 能运行在任何Oracle环境中
3、模块化
 每个PL/SQL单元可以包含一个活多个程序块,程序中的每一块都实现一个逻辑操作,块之间可以使独立活是嵌套。
  

三、块结构
1、组成
1)declare
 定义部分变量,先定义后使用
2)begin 
 可执行部分,内容主体,以end结束
3)exception
 异常处理部分,程序异常时的处理动作
2、格式
DECLARE – 可选
 变量、常量、游标、用户自定义的特殊类型
BEGIN – 必须
 SQL 语句
 PL/SQL 语句
EXCEPTION – 可选
 错误发生时的处理动作
END; – 必须
3、块类型
1)匿名块
 只执行一次,不能存储在数据库
2)过程、函数和包
 是命名的PL/SQL块,存储在数据库中,能被多次执行,可以被外部程序来执行 
3)触发器
 是命名的PL/SQL块,存储在数据库中,当相应的触发事件发生时自动被执行
区别:
 仅执行一动作时定义为过程,计算值时定义为函数
四、变量声明
1、声明语法
 图示

2、%type属性
 参照变量
 好处
  跟数据库类型保持一致
五、表达式
1、函数的应用
   过程语句中的有效函数
 1)单行数字:mod、round、trunc等
 2)单行字符:concat length lower substr等
 3)数据类型转换:to_char to_date to_number等
 4)日期:add_months sysdate months_between等
   无效函数
 1)decode
 2)分组函数(avg min max count sum等)
 备注:在PL/SQL语句中适用
2、事务处理
 事务开始与commit 或 rollback 后的第一个DML语句
 使用commit 和 rollback 语句来终止一个事务
 在事务处理过程中使用savepoint来标记中间点
六、与Oracle的交互
 图
七、使用
1、变量赋值
 v_name := 'sam';
2、输出结果
 dbms_output.put_line('名字是'||v_name);
3、注释
 1)单行注释 :--注释内容
 2)多行注释 :/* 注释内容*/

八、示例代码

demo表:

create table T_STU(STU_ID char(5),
                   STU_NAME   varchar(8),
                   constraint PK_T_STU primary key (STU_ID)

);

create table T_SCORE(
       EXAM_SCORE number(5,2),
       EXAM_DATE  date,
       AUTOID  number(10),
       STU_ID char(5),
       SUB_ID char(3),
       constraint PK_T_SCORE primary key (AUTOID),
       constraint PK_T_SCORE_REFE foreign key (STU_ID) references T_STU (STU_ID)
);

insert into T_STU values('1000','gk');
insert into T_STU values('1001','clc');
insert into T_STU values('1002','ccc');

-------------------------------------------------

insert into T_SCORE values (99.5,sysdate-1,10000000,'1000','000');
insert into T_SCORE values (92.5,sysdate-1,10000001,'1000','001');
insert into T_SCORE values (90.5,sysdate-1,10000002,'1000','002');
insert into T_SCORE values (89.5,sysdate-2,10000003,'1001','000');
insert into T_SCORE values (82.5,sysdate-2,10000004,'1001','001');
insert into T_SCORE values (80.5,sysdate-2,10000005,'1001','002');
insert into T_SCORE values (59.5,sysdate-2,10000006,'1002','000');
insert into T_SCORE values (52.5,sysdate-2,10000007,'1002','001');
insert into T_SCORE values (50.5,sysdate-2,10000008,'1002','002')





1、基本调用

declare 
  c_name constant varchar(20) := 'gaoke';  --常量定义时就要赋初值
  n_name varchar(20) not null := 'curry';  --not null 定义时也要赋初值
  
  id varchar(20);
  name varchar(20) := 'gaoke';
  age number;
  add varchar(20);
  
begin 
  null;
  id := '031302306';
  age := 23;
  add := id || name || age;
  dbms_output.put_line('工号: '|| id);
  dbms_output.put_line('姓名: '|| name);
  dbms_output.put_line('年龄: '|| age);
  dbms_output.put_line('汇总: '|| add);
end;
运行结果:

2:调用数据库

declare
  score T_SCORE.EXAM_SCORE%type;
  date1 T_SCORE.EXAM_DATE%type;
  id1 T_SCORE.STU_ID%type;

begin
  select EXAM_SCORE, EXAM_DATE, STU_ID into score, date1, id1
  FROM T_SCORE
  where AUTOID=10000002;
  dbms_output.put_line(score);  
  dbms_output.put_line(date1);
  dbms_output.put_line(id1);
end;
运行结果:




3:聚集函数

declare
  num number;
  max_score T_SCORE.EXAM_SCORE%type;

begin
  num := MOD(10,3);
  select max(EXAM_SCORE) into max_score from T_SCORE;
  dbms_output.put_line(num);
  dbms_output.put_line(max_score);
end;
运行结果:


4:事务

begin
  insert into T_SCORE values (100,sysdate-1,70000000,'1000','000');
  savepoint a;  --设置保持点 a
  insert into T_SCORE values (10,sysdate-1,80000000,'1000','000');
  savepoint b;   --设置保持点 b
  rollback to savepoint a;  --回滚至保存点 a
  commit;
end;

运行结果:(第二条数据没有插入到数据库中)




















猜你喜欢

转载自blog.csdn.net/S031302306/article/details/73277294
今日推荐