ORACLE的组件也可以用PL/SQL去写,后边有存储过程,存储函数,触发器,可以自己来写存储过程,或者叫触发器,
那前面有哪些我们就走一走,这里实际上是一本小书了,59页,比较经典版的plsql,我们不能像讲JAVA一样,光讲
JAVA基础就讲了几个月的时间了,PL/SQL讲一天,讲一天就讲完了,从前往后我们走一走,PL/SQL是一门高级程序设计语言,
然后在各种环境下对ORACLE数据库进行访问,然后他继承与数据库服务器中,他的代码也可以对数据进行快速高效的处理,
了解一下就行
他的全称是叫Procedure Language,或者Structured Query Language,就是结构化查询语言,也就是过程语言,
它是对SQL语言存储过程语言的扩展,他里面可以定义函数,SQL当时我们讲流程控制的时候,case when then,
讲了一个decode,PL/SQL作为一个编程语言了,他就比较全了,就跟JAVA一样,可以有条件判断,也可以有循环,
他这里面就有循环了,当然其实它作为一个语言,就像JAVA里面可以定义方法,他这里边也可以定义,不过叫函数了,
可以定义函数,这个函数就叫存储函数,还可以定义存储过程,一个有返回值,一个没有返回值,还可以定义触发器,
你定义好以后,就像你一个类一样,JAVA里面我们创建一个类,类就存在了,你想调的时候过来调,它是一个面向过程的
语言
我们就直接往后过,PL/SQL是ORACLE系统的核心语言,现在他又很多组件也是由PL/SQL来写的,PL/SQL可以使用
SQL里面的关键字,增删改查,然后后面就是DCL的,像回滚,设置保存点,增删改查的也要注意,这个select跟SQL
里面的不一样,这个叫select什么什么into,到一个变量里,或者到记录类型里,等等,存储到游标的一个对象里,
存储到一个游标里,into,多了一个他
介绍就说完了,PL/SQL块结构和组成元素,还有那几部分构成,由三个块构成,叫声明部门,执行部门,异常处理部分
三块对应的有4个关键字,四个关键字 把它隔离成三块,DECLARE,叫声明部分,你在整个执行过程当中,需要用到
哪些变量,除了变量之外,还有比如有记录类型,游标,这个东西你给他定义在DELARE里面,就有点类似于JAVA里面的
成员变量一样,成员变量不就是直接类完了以后就开始写这个变量,这个你就相当于把这个变量写在这,begin就是你真正
开始执行的这个部分,可能要用到你要用到上面声明的这些变量,有点类似于JAVA里面的类方法,类方法有一个入口可以执行,
这里是从begin开始执行,然后JAVA程序里面也有异常,他这里也有异常,这个异常如何处理,他单纯加了一块exception,如果你
在begin执行的时候,出现异常了,根据你这个异常,也有一个对象,跟你这个对象的类型,然后到我这里去匹配,他用的是when来
匹配,when当是这个异常对象的时候,when怎么去处理,when什么对象,怎么怎么处理,我们JAVA里面用的是try catch,try这段代码,
当你有异常的catch的时候,你那个对象是哪个类型的放过来,然后在catch那个大括号里面处理,形式不太一样,但是方式是类似的,
end表明你这个块结束了,那我们写一个最简单的PL/SQL的一个程序,最简单的是helloworld
在这个PL/SQL中,你要使用的话,你首先要进行这样一个操作,这个是必须的,叫set serveroutput on,没有分号回车
每次你不写这个命令的时候,你就运行完了就没有数据结果,我们就写一个最简单的PL/SQL的程序,
helloworld它会有三部分,declare,begin,还有exception,end,end在这要加上分号,最简单的一个helloworld,
这里面涉及到声明的变量,或者叫类型,或者叫游标,begin是你程序真正执行的部分,类似于JAVA里的main方法,
exception根据begin出现的异常进行处理,提供处理的机制,最后表示结束,这个处理机制他使用的是when,然后
then怎么处理,你可以再加上一个再when,然后这样处理,我们讲的异常后面会说,你想写最简单的一个helloworld
的话,是不是不用定义变量,没有什么变量,就直接begin了,begin就直接一条语句输出,这不是相当于main方法吗,
写输出语句,JAVA里面用的是system.out.println,那这里面谁相当于刚才说的那句话,这个dbms_output.put_line,
一个小括号,下划线结束,打印的是helloworld的一个字符串,然后没有异常,没有异常就不写了,就这样,这就是最简单的,
他这个把它注掉,helloworld是吧
declare
begin
dbms_output.put_line('helloworld');
exception
end;
因为你这里写了exception但是没有处理,那就是说没有用的,这个表没有异常,把它就可以注了,这个没有声明,
他也可以不要了,那我这个程序实际上就三行,这三行是最简洁的方式了,再少也少不了了,begin是你程序的入口,
这个是必须要有的,end表示你程序结束,那最简单的不就是一条语句,最简洁的一个条件,格式就这样,这是最简洁
的一个程序,helloworld
begin
dbms_output.put_line('helloworld');
end;
那我们写一个比他复杂一点的,复杂一点的,复杂到什么程度,查询一下100号员工的工资,它是100号员工
工资的话,我们用SQL语言的话,select salary from employees where employee_id = 100
select salary from employees where employee_id = 100;
用PL/SQL的话怎么写,就这样写,declare,先把这个结构写出来,没有异常,end结束,我声明一个变量,
我先写一遍再注释,这个变量我们后面会讲到,往后拉的话,变量如何声明,如果是变量的话V开头,常用用C,
如果异常开头就用E,记录类型后面加一个下划线record,就像我们写一个主键一样,主键或者外键
增强他的可读性,这儿我定义的是一个变量,所以我就v,是一个工资相关的,然后变量的数据类型,varchar2,20来存,
分号结束,就是这个变量我声明了,声明了以后,begin来操作,本质上操作还是用的select语句,只不过是select into,
我select salary,into v_sal,from哪个表,employees表,where department_id等于100,这个时候加一个分号,这个呢我
select放到这里边,我想给打印出来,dbms_output.put_line(v_sal)给打印出来,打印完以后就end,还是2万4
declare
v_sal varchar2(20)
begin
select salary into v_sal from employees where employee_id = 100;
dbms_output.put_line(v_sal);
end;
这里说一下,declare你就把他理解成声明,类似于JAVA里面的成员变量位置,我可以在这声明变量,然后这是
SQL的一个操作,SQL语句的操作,这里面实现select的操作,select什么什么into什么什么,然后有表的话就from什么
什么表,如果有条件的话加上一个where,放到这个变量里,然后呢,打印,最后结束,这是最标准的一个程序
那现在我们说了,不光是想输出100号员工的工资,我还想输出他的email,甚至hire_date,phone_number,
都想输出,那你这个变量就多定义几个,还有一个叫email,这个需要注意的是,我这写的不太好,salary是
一个number类型的,我给他放在一个varchar里面,最好你的数据类型是他的一致的,20个,两个小数,email
你是把这个表的email放到这里,email是个varchar的,这个是varchar2,20个,而且你这个数,不能够比你这个email
小,小的时候就放不进去了,可以再声明一个,v_hire_date,date类型的,分号,每一个都是分号结束的,select在这里写
明,按照这个顺序填进去,salary,email,hire_date,into v_sal,v_email,v_hire_date,从这个表当中,where到这,然后
打印的时候打印,打印他的工资,也打印一下他的email,再打印一下他的hire_date,看一下结果,就是这样
declare
v_sal number(10,2);
v_email varchar2(20);
v_hire_date date;
begin
select salary,email,hire_date into v_sal,v_email,v_hire_date from employees
where employee_id = 100;
dbms_output.put_line(v_sal||','||v_email||','||v_hire_date);
end;
相较于刚才这个,这里定义了三个变量,这里需要对应,类型也对应,然后这个储值范围要注意,
比如v_email,你要给2的话,说字符串缓冲区太小了
declare
v_sal number(10,2);
v_email varchar2(2);
v_hire_date date;
begin
select salary,email,hire_date into v_sal,v_email,v_hire_date from employees
where employee_id = 100;
dbms_output.put_line(v_sal||','||v_email||','||v_hire_date);
end;
所以你这里声明的类型大小是不能够小于人家本身这个的,email你是要存的这里面的email,这里面的数据类型的一个大小,
你这个不能比他小,就是这个,这个完了以后,我们刚才说了,这个数据类型,先说这个吧,数据类型,然后你这样来看,你这个不能
比他小,而且数据类型也要一样,我刚才不是声明成他了,我给他改了,你不是要放employees这个表吗,而且是要把里面的salary
放到这里,那你这个salary的数据类型,我就放到这儿,使用这样一个形式,这个表明就是v_sal,这个变量的数据类型,跟employees
表下的salary数据类型,是一样的,这个相当于动态的来获取一下salary的数据类型,当这个数据类型如果变化的时候,我这儿也跟着
改变,那同样的下边这几个,可以给他处理掉,点email,问号type,然后这儿,这个date其实可以不写了,动态的获取一下,这个表对应三个
变量的类型,然后这不变,然后打印,照样就出来了
declare
v_sal employees.salary%type;
v_email employees.email%type;
v_hire_date employees.hire_date;
begin
select salary,email,hire_date into v_sal,v_email,v_hire_date from employees
where employee_id = 100;
dbms_output.put_line(v_sal||','||v_email||','||v_hire_date);
end;