Oracle总结之plsql编程(基础八)
原创作品,转自请注明出处:https://www.cnblogs.com/sunshine5683/p/10328524.html
一、函数
1、函数是可以返回一个特定的数据,函数的创建中必须包含return子句。
2、函数创建:
create function sp_function2(spname varchar2) return number is salaries number(7,3);
begin
----执行部分
select sal*10+nvl(comm,0)*10 into salaries from emp where ename=spname;
return salares;
end;

3、在sqlplus中调用函数
var xhq_salaries number
call sp_function2('SCOTT') into :xhq_salaries;

二、包
1、包是用于逻辑上组合过程和函数的,可以使用create package命令创建一个包。
如:
create package sp_package is
procedure update_sal(name varchar2,newsal number);
function sp_function2(name varchar2) return number;
end;

2、创建包体
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 sp_function2(name varchar2) return number is
salaries number;
begin
select sal into salaries from emp where ename=name;
return salaries;
end;
end;

3、调用包的函数或过程
exec sp_package.update_sal('SMITH',120);

三、plsql变量
1、标量类型(scalar)
标量包含许多类型,此处介绍常用类型就可以
如:
定义一个边长字符串: v_ename varchar2(20);
定义一个小数 ,范围-99.99~99.99: v_sal number(4,2);
定义一个小数并给一个初始值: v_sal2 number(6,2):=1111.11
例子:
输入员工号,输出员工工资,姓名,个人所得税(税率为0.01)
declare
c_tax_rate number(3,2):=0.01;
v_ename varchar2(10);
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;

上面报错原因是定义v_ename varchar(5),但实际上返回的值大于定义的,所以报错,改成v_ename varchar(10),问题解决,正常执行。
标量使用%type类型:表面。列名%type
如上面:v_ename emp.ename%type;这样定以后就会匹配大小,不会存在上述缓冲太小的错误,也不至于定义太大浪费空间。
2、复合类型(即plsql记录)
类似于高级语言中的结构体,使用:记录变量.记录成员.
3、复合类型之plsql表,相当于高级语言中的数组,区别是下标可以为负数,而在高级语言中是不可以为负数的。
4、参照变量:是指用于存放数值指针的变量,通过参照变量,可以使得应用程序共享相同对象,从而降低占用的空间,在编写plsql程序时,可以使用游标变量和对象变量两种参照变量,简单是用的最多的是游标变量。
使用游标变量时,不需要指定相应的select语句,但是使用又表示,需要指定select语句。
实例如下:
declare
type sp_emp_cursor is ref cursor;
test_cursor sp_emp_cursor;
--定义变量
v_ename emp.ename%type;
v_sal emp.sal%type;
begin
--吧test_cursor和一个select结合
open test_cursor for select ename,sal from emp where deptno=&no;
--循环取出查询出的数据
--循环取出查询出的数据
loop
fetch test_cursor into v_ename,v_sal;
exit when test_cursor%notfound;
dbms_output.put_line('姓名:'||v_ename||'工资:'||v_sal);
end loop;
--关闭游标
close test_cursor;
end;


Oracle总结之plsql编程(基础八)的更多相关文章
- Oracle总结之plsql编程(基础七)
紧接基础六,对oracle角色和权限的管理之后,在接下来的几次总结中来就最近工作中用过的plsql编程方面的知识进行总结,和大家分享! 原创作品,转自请注明出处:https://www.cnblogs ...
- Oracle基础 PL-SQL编程基础(4) 异常处理
异常处理: 即使良好的PL-SQL程序也会遇到错误或者未预料的事件,一个优秀的程序都应该能够处理各种出错情况,尽可能的从错误中恢复.程序在运行时出现的错误成为异常.发生异常后,语句讲终止执行,PLSQ ...
- Oracle基础 PL-SQL编程基础(1) 变量和常量
一.什么是PL-SQL PL-SQL是结合了Oracle过程语言和结构化查询语言(SQL)的一种扩展语言.具体来说,PL-SQL就是在普通的SQL语句的基础上增加了编程语言的特点,将数据操作和查询语句 ...
- Oracle总结之plsql编程(基础九)
原创作品,转自请注明出处:https://www.cnblogs.com/sunshine5683/p/10344302.html 接着上次总结,继续今天的总结,今天主要总结plsql中控制语句,如条 ...
- Oracle基础 PL-SQL编程基础(2) 分支结构
一.分支结构 1.if语句 语法: IF <布尔表达式> THEN PL/SQL和SQL语句 END IF; 示例: DECLARE v_count NUMBER := &n; B ...
- Oracle基础 PL-SQL编程基础(3) 循环结构
循环结构: 1. LOOP循环结构 语法: LOOP 要执行的语句; EXIT WHEN <条件> --条件满足则退出循环 END LOOP; 示例:循环输出1-10的整数 DECLA ...
- PLSQL编程基础
一 PL/SQL简介 1 SQL:结构化的查询语句 2 PL/SQL优点与特性: 提高运行效率==>>提高运行效率的其他方式(存储过程,分页,缓存,索引) 模块化设计 允许定义标识符(变量 ...
- oracle学习1 基于oracle数据库的PLSQL编程以及存储过程的创建和使用视频
https://www.bilibili.com/video/av46777605 plsql中选择testWindow中可以进行测试 1.编写函数在plsql的testwindow中 begin d ...
- plsql 编程基础
分支 declare --声明变量 a ); b ); c ); begin --开始 a := '小明'; dbms_output.put_line(a); b :; c :; if b > ...
随机推荐
- 「PKUSC2018」主斗地(暴搜)
这道斗地主比 \(PKUWC\) 那道可做多了... 我们用 \(NOIP\) 那道斗地主的思路:暴搜出三代和四代,贪心出散牌. 还有jry为什么要出xx网友而不出他的另一个老婆 我们发现两个人的每回 ...
- powerDesigner 把name项添加到注释(comment)
第一次写博客,分享一点经验吧,平时大家用powerDesigner的时候,pd是不会把name项默认添加到comment的,所以生成的数据库表里面也没有中文字段的注释. 我在网上查了一下.有解决方案了 ...
- 如何做好错误处理?(PHP篇)
起因 之前我在封装 PHP 一个类库的时候,如果有遇到错误(例如构造函数传参不合法的话),则直接 die() ,后来发现这种方法很不好,会直接退出程序. 所以我想到给 PHP 上异常捕获的机制了. 错 ...
- CSS中text-shadow的几个好看的文字demo及其代码
最近有看到一些镂空的或者立体的文字设计图非常好看,然后想了想,应该是使用text-shadow来实现的,这里我贴出我仿的八个demo,分享给大家 首先是HTML代码 <div class=&qu ...
- maven build的常用生命周期
常用的maven build goals: validate - validate the project is correct and all necessary information is av ...
- (转)Python3 模块3之 Urllib之 urllib.parse、urllib.robotparser
原文:https://blog.csdn.net/qq_36148847/article/details/79153738 https://blog.csdn.net/zly412934578/art ...
- Linux下安装Nginx详细图解教程 (nginx-1.2.6)
什么是Nginx? Nginx ("engine x") 是一个高性能的 HTTP 和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器,在高连接并发的情况下N ...
- 编写一个c++工程
c++接触的很少,之前也只是会编写一个简单的cpp文件,但一个工程的实现,往往不仅包括源文件(.cpp后缀文件)一般还有头文件(.h后缀文件)等.一个c++工程中只能有一个main函数,这个函数所在的 ...
- C# 高效率创建字符串类(StringBuilder)
1.为什么需要StringBuilder类? 因为String类型代表不可变字符串,所以无法对当前String类型实例进行处理.所以FCL提供了System.Text.StringBuilder类型, ...
- iOS事件分发
前段时间项目有一个需求,要在点击闪屏的时候做一些处理,刚接到这个需求觉得很简单啊,在原有的view上加个button或者手势识别啥的,后面实现的时候发现还是有点坑.无论我在闪屏上面加button还是手 ...