Oracle存储过程、包详解,先睹为快

procedure update_sal(name varchar2, newsal number);

function annual_income(name varchar2) return number;

end;

/

实例2:

–给包sp_package实现包体

SQL>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;

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> call sp_package.update_sal(‘SCOTT’, 1500);

2.4、触发器

常用的触发事件包括insert,update,delete语句,而触发操作实际就是一个pl/sql块。可以使用create trigger来建立触发器。

3.定义并使用变量,复合类型


3.1、标量定义的案例

定义一个变长字符串

v_ename varchar2(10);

定义一个小数,范围 -9999.99~9999.99

v_sal number(6,2);

定义一个小数并给一个初始值为5.4 :=是pl/sql的赋值号

v_sal2 number(6,2):=5.4;

定义一个日期类型的数据

v_hiredate date;

定义一个布尔变量,不能为空,初始值为false

v_valid boolean not null default false;

案例1:

SQL> declare

c_tax_rate number(3,2):=0.03;

–用户名

v_ename varchar2(5);

v_sal number(7,2);

v_tax_sal number(7,2);

begin

–执行

select ename,sal into v_ename,v_sal from emp where empno=&no;

–计算所得税

v_tax_sal := v_sal*c_tax_rate;

–输出

dbms_output.put_line(‘姓名是:’||v_ename||‘工资:’||v_sal||’ 交税:'||v_tax_sal);

end;

/

输出的结果是:

姓名是:SCOTT工资:2900 交税:87

PL/SQL procedure successfully completed

案例2:

标量(scalar)——使用%type类型

比如上例的v_ename,这样定义: v_ename emp.ename%type;

3.2、复合变量(composite)

用于存放多个值的变量。主要包括这几种:

 pl/sql记录

 pl/sql表

 嵌套表

 varray

3.2.1、pl/sql记录

类似于高级语言中的结构体,需要注意的是,当引用pl/sql记录成员时,必须要加记录变量作为前缀(记录变量.记录成员)如下:

SQL>declare

–定义一个pl/sql记录类型emp_record_type,类型包含3个数据name,salary,title。说白了,就是一个类型可以存放3个数据,主要是为了好管理

type emp_record_type is record(

name emp.ename%type,

salary emp.sal%type,

title emp.job%type);

–定义了一个sp_record变量,这个变量的类型是emp_record_type

sp_record emp_record_type;

begin

select ename, sal, job into sp_record from emp where empno = 7788;

dbms_output.put_line (‘员工名:’ || sp_record.name);

end;

/

3.2.2、pl/sql表

相当于高级语言中的数组,但是需要注意的是在高级语言中数组的下标不能为负数,而pl/sql是可以为负数的,并且表元素的下标没有限制。实例如下:

SQL>declare

–定义了一个pl/sql表类型sp_table_type,该类型是用于存放emp.ename%type

–index by binary_integer 表示下标是整数

type sp_table_type is table of emp.ename%type

index by binary_integer;

–定义了一个sp_table变量,这个变量的类型是sp_table_type

sp_table sp_table_type;

begin

select ename into sp_table(-1) from emp where empno = 7788;

dbms_output.put_line(‘员工名:’ || sp_table(-1));

end;

/

说明:

sp_table_type 是pl/sql表类型

emp.ename%type 指定了表的元素的类型和长度

sp_table 为pl/sql表变量

sp_table(0) 则表示下标为0的元素

注意:如果把select ename into sp_table(-1) from emp where empno = 7788;变成select ename into sp_table(-1) from emp;则运行时会出现错误,错误如下:

ORA-01422:实际返回的行数超出请求的行数

解决方法是:使用参照变量

小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
img

最后

总而言之,面试官问来问去,问的那些Redis知识点也就这么多吧,复习的不够到位,知识点掌握不够熟练,所以面试才会卡壳。将这些Redis面试知识解析以及我整理的一些学习笔记分享出来给大家参考学习

还有更多学习笔记面试资料也分享如下:

都是“Redis惹的祸”,害我差点挂在美团三面,真是“虚惊一场”

V无偿领取!(备注Java)**
[外链图片转存中…(img-QlQhvaIo-1711151389602)]

最后

总而言之,面试官问来问去,问的那些Redis知识点也就这么多吧,复习的不够到位,知识点掌握不够熟练,所以面试才会卡壳。将这些Redis面试知识解析以及我整理的一些学习笔记分享出来给大家参考学习

还有更多学习笔记面试资料也分享如下:

[外链图片转存中…(img-chDGptiD-1711151389603)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

  • 12
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Oracle存储过程是一段预定义的PL/SQL代码,它可以在Oracle数据库中执行。它是一种可重复使用的程序代码,可以被调用多次。存储过程通常用于执行一系列相关的操作,这些操作可以在一个单一的事务中执行,因此可以保证数据的完整性和一致性。 以下是一个简单的Oracle存储过程的实例: ``` CREATE OR REPLACE PROCEDURE get_employee_details (emp_id IN NUMBER, emp_name OUT VARCHAR2, emp_salary OUT NUMBER) IS BEGIN SELECT name, salary INTO emp_name, emp_salary FROM employee WHERE id = emp_id; DBMS_OUTPUT.PUT_LINE('Employee Name: ' || emp_name); DBMS_OUTPUT.PUT_LINE('Employee Salary: ' || emp_salary); END; ``` 在上面的示例中,存储过程名称是get_employee_details,它有三个参数:emp_id(输入参数)、emp_name(输出参数)和emp_salary(输出参数)。存储过程的主体含一个SELECT语句,它从employee表中检索员工的姓名和薪水,并将它们存储在emp_name和emp_salary变量中。最后,使用DBMS_OUTPUT.PUT_LINE函数将员工的姓名和薪水输出到控制台。 要调用这个存储过程,可以使用以下语句: ``` DECLARE emp_name VARCHAR2(50); emp_salary NUMBER; BEGIN get_employee_details(101, emp_name, emp_salary); END; ``` 在上面的示例中,调用了get_employee_details存储过程,并将101作为输入参数传递。输出参数emp_name和emp_salary将在存储过程执行后含员工的姓名和薪水。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值