1.入门例子
1.打开command window建表
create table LearningTb(
EMPNO NUMBER(4) not null,
ENAME VARCHAR2(10),
JOB VARCHAR2(9),
MGR NUMBER(4),
HIREDATE DATE,
SAL NUMBER(7,2),
COMM NUMBER(7,2),
DEPTNO NUMBER(2)
);
alter session set nls_date_format='yyyy-mm-dd';--更改日期格式,方便后面的操作
2.创建存储过程,右键–>new或者工具栏new–>progarm window–>procedure
create or replace procedure LearningTest is--创建,replace表示如果存在则替换
begin
insert into LearningTb values('01','man','superman','001','2016-12-12','30000','30000','07');
end ;
3.打开command window
查看错误信息:show error;
调用该过程:exec LearningTb;
exec语法:exec 过程名(参数值1,参数值2…);
结果图:
2. 在简单例子中使用块
pl/sql块介绍:
块(block)是pl/sql的基本程序单元,编写pl/sql程序实际上就是编写pl/sql块,要完成相对简单的应用功能,可能只需要编写一个pl/sql块,但是如果想要实现复杂的功能,可能需要在一个pl/sql块中嵌套其它的pl/sql块。
块结构示意图
pl/sql块由三个部分构成:定义部分,执行部分,例外处理部分。
如下所示:
declare
/定义部分——定义常量、变量、游标、例外、复杂数据类型/
begin
/执行部分——要执行的pl/sql 语句和sql 语句/
exception
/例外处理部分——处理运行的各种错误/
end;
说明:
定义部分是从declare开始的,该部分是可选的;
执行部分是从begin开始的,该部分是必须的;
例外处理部分是从exception开始的,该部分是可选的。
可以和java编程结构做一个简单的比较。
1.打开command window
SQL> set serveroutput on;--打开输出选项,就是会出现一个框框让你输入你想要的数字
SQL> declare
2 v_ename varchar2(20);
3 begin
4 select ename into v_ename from Learningtb where empno=&no;--&表示要接收从控制台输入的变量,就是说你输入的变量叫做no
5 dbms_output.put_line('雇员名:'||v_ename);
6 end;
7 /--这个符号表示执行
执行结果:
3.存储过程
概念
存储过程用于执行特定的操作,当建立存储过程时,既可以指定输入参数(in),也可以指定输出参数(out),通过在过程中使用输入参数,可以将数据传递到执行部分;通过使用输出参数,可以将执行部分的数据传递到应用环境。在sqlplus中可以使用create procedure命令来建立过程。
例子
编写一个存储过程,可以输入雇员名,新奖金,用来修改雇员的奖金
1.在procedurs窗口中编写存储过程
create or replace procedure update_t(uname varchar2, newcomm number) is
begin
update Learningtb set comm=newcomm where ename=uname;
end ;
2.在command windows中执行
SQL>exec update_t('ironman',1000);
发现问题:
1.加入ename写错了,表中并找不到也不会出错,但是没有正确执行
2.没有写commit也执行了(区别留给以后去发现)
4.函数
概念
函数用于返回特定的数据,当建立函数时,在函数头部必须包含return子句。而在函数体内必须包含return语句返回的数据。我们可以使用create function来建立函数。
例子
1.在procedurs窗口中编写存储过程
create or replace function annual_incomec(uname varchar2) return number is
annual_salary number;
begin
select lt.sal*12 into annual_salary from Learningtb lt where lt.ename=uname;
return(annual_salary);
end annual_incomec;
2.在command windows中执行
SQL> var income number;
SQL> call annual_incomec('ironman')into:income;
结果:
5.包
概念
包用于在逻辑上组合过程和函数,它由包规范和包体两部分组成。
创建包
1.使用create package命令来创建包
–声明该包有一个存储过程和一个函数
create package sp_package is
procedure update_sal(name varchar2, newsal number);
function annual_income(name varchar2) return number;
end;
2.建立包体可以使用create package body命令
给包sp_package实现包体
CREATE OR REPLACE PACKAGE BODY SP_PACKAGE IS
--存储过程
PROCEDURE UPDATE_SAL(NAME VARCHAR2, NEWSAL NUMBER) IS
BEGIN
UPDATE EMP SET SAL = NEWSAL WHERE ENAME = NAME;
COMMIT;
END;
--函数
FUNCTION ANNUAL_INCOME(NAME VARCHAR2) RETURN NUMBER IS
ANNUAL_SALARY NUMBER;
BEGIN
SELECT SAL * 12 + NVL(COMM, 0) INTO ANNUAL_SALARY FROM EMP WHERE ENAME = NAME;
RETURN ANNUAL_SALARY;
END;
END;
两种创建方法的区别:第一种是声明,直接调用已经写好的过程或者函数,第二种是在包里面现写
调用包
--调用存储过程
SQL> exec sp_package.update_sal('SCOTT', 8888);
--调用函数
var income NUMBER;
CALL sp_package.ANNUAL_INCOME('SCOTT') INTO:income;
print income;
其实就是通过包名来引用PakageName.procedureName or PakageName.functionName
最精彩的一部分- -犯过的错误(大部分是低级错误):
1.直接复制导致圆角半角混乱,编译错误:PLS-00103: 出现符号 “end-of-file”
2.存储过程取名与关键字相同产生的错误: