plsql学习笔记(一)对存储过程及函数的初步认识

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
procedures

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…);
结果图:
result1

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  /--这个符号表示执行

执行结果:
result

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写错了,表中并找不到也不会出错,但是没有正确执行
问题1
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;

结果:
result

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.存储过程取名与关键字相同产生的错误:
mistake

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值