基于oracle 的PL/SQL编程 -变量使用
1. 需要开启的服务: 本机安装的oracle ,默认是开机启动服务的,开机时间太慢,关闭了,需要手动打开:
OracleDBConsoleorcl
OracleOraDb10g_home1iSQL*Plus
OracleOraDb10g_home1TNSListener
OracleServiceORCL 这个后面的ORCL就是数据库名字,官方术语叫做数据库sid
2.打开PL/SQL工具,用户名scott 登陆sid为ORCL的数据库, 密码 tiger
3.打开一个测试窗口,如下
-- Created on 2018/6/3 by ADMINISTRATOR
declare
-- 声明本地变量的地方,包括游标(结果集类型变量),如果没有,declare可以去掉
--相当于java的 public class A{}
i integer;
begin
-- 执行部分
--相当于Java的public static void main(String[] args)
--异常处理
end;
4.打印helloworld
结果如下:
dbms_output是oracle的程序包,put_line()是调用的方法
在命令行中打印:需要先设置 set serveroutput on ,才会将打印语句打印出来,否则只执行不打印。
5. PLSQL变量的使用:
PLSQL中的变量分两种:
(1)普通数据类型:char varchar2 date number(整数和小数) boolean long
(2)特殊变量类型(引用变量、记录型变量)
变量的声明方式为:变量名 变量类型(变量长度) ,例如:v_name varchar2(20)
变量赋值:
(1)声明时使用 := 直接赋值:v_name varchar2(20) := ‘zhangsan’ 只写=,则是进行比较
(2)语句赋值: select 值 into 变量名
5.1 普通变量的使用
-- 声明一个人的信息 姓名 薪水 地址
declare
-- 姓名 不能使用name,这是保留字
v_name varchar2(50) := '张三';
-- 薪水 小数:number(总长度(小数加整数的位数),小数位数) v_sal number(6,2) --1000.00
v_sal number;
--地址
v_addr varchar2(200);
begin
--直接赋值
v_sal := 15000;
--语句赋值
select '上海市南京路' into v_addr from dual; --实际工作中应该是from 某个表
-- 打印变量 || 是拼接符,相当于java 的+
dbms_output.put_line('姓名:' || v_name || ',薪水:' || v_sal || ',地址:' || v_addr);
end;
执行结果:
5.2 引用变量的使用
引用变量:变量的类型和长度取决于表中字段的类型和长度(变量的类型和长度引用表中字段的类型和长度),通过 表名.列名%TYPE 指定变量的类型和长度,例如 v_name emp.ename%TYPE
引用型变量的好处:使用普通变量定义方式,需要知道表中列的类型,而使用引用类型不需要考虑列的类型,使用%TYPE是非常号的编程风格,因为它使得PL/SQL更加灵活,更加适应于对数据库定义的更新。
-- 查询emp表中7839号员工的个人信息,打印姓名和薪水
declare
-- 姓名 定义的是引用变量
v_ename emp.ename%TYPE;
-- 薪水
v_sal emp.sal%TYPE; begin
--查询姓名和薪水并赋值给变量,。使用select into 语句赋值
select ename, sal into v_ename, v_sal from emp where empno = 7839;
dbms_output.put_line('姓名:' || v_ename || ',薪水:' || v_sal); end;
结果:
5.3 记录型变量
记录型变量 默认接接收 表中的一行数据,不能指定字段,相当于java中的一个对象。
语法: 变量名称 表名%ROWTYPE 例如 v_emp emp%rowtype; 通过 变量名.字段名 的方式获取变量中的值
--记录型变量示例:用该变量接收表中一行sql的信息
declare
-- 记录型变量
v_emp emp%ROWTYPE; begin
--查询所有字段并赋值给变量,字段名用v_emp.字段名 表示
select * into v_emp from emp where empno = 7839;
dbms_output.put_line('姓名:' || v_emp.ename || ',薪水:' || v_emp.sal); end;
结果:
6.流程控制:
6.1 条件分支,语法:
BEGIN
IF 条件1 then 执行1;
Elsif 条件2 then 执行2 ; --注意不是 elseif ,是elsif
Else 执行3
End if;
END
-- 判断emp表中记录是否超过20条,10-20 之间,或者10条以下
declare
--声明变量接收emp表中记录数
v_count number;
begin
-- 查询并赋值给变量
select count(1) into v_count from emp;
--判断打印
if v_count > 20 then
dbms_output.put_line('emp表中的记录数在20条以上为' || v_count);
elsif v_count >= 10 then
dbms_output.put_line('emp表中的记录数在10-20条之间为' || v_count);
else
dbms_output.put_line('emp表中的记录数在10条以下为' || v_count);
end if; end;
执行结果:
select * 结果如下:
6.2 loop循环.此处只记录loop循环的使用。 循环两个要点:1.循环变量初值,循环体中循环变量值要发生变化,
-- 循环打印1-10
declare
-- 声明一个循环变量并赋初值
v_num number := 1;
begin
loop
exit when v_num > 10;
dbms_output.put_line(v_num);
--循环变量的自增长
v_num := v_num + 1;
end loop;
end;
7.特殊的变量—— 游标,本质上是一条查询语句的结果的封装,只能往前,不能往后
用于临时存储一个查询返回的多行数据(结果集,类似于Java的jdbc连接返回的resultset集合),通过遍历游标,可以逐行访问处理该结果集的数据
游标使用方法:声明 打开 读取 关闭
语法:
游标声明: CURSOR 游标名[(参数列表)] IS 查询语句
游标打开: Open 游标名;
游标的取值: FETCH 游标名 into 变量列表;
游标关闭: CLOSE 游标名
游标属性:
%NOTFOUND 是在游标中找不到元素时返回TRUE,通常用于判断,退出循环
7.1 不带参数的游标 示例:
-- 使用游标查询emp表中所有员工的姓名和工资,并将其依次打印出来
declare
-- 声明游标
cursor c_emp is
select ename, sal from emp;
--声明变量接收游标中的数据
v_ename emp.ename%TYPE;
v_sal emp.sal%TYPE;
begin
-- 打开游标
open c_emp;
-- 遍历游标
loop
--获取游标中的数据,如果有的话就赋值给变量
fetch c_emp
into v_ename, v_sal;
exit when c_emp%notfound; --c_emp%notfound 没有数据时返回true
dbms_output.put_line('姓名:' || v_ename || ',薪水:' || v_sal);
end loop; --关闭游标
close c_emp; end;
结果如下:
7.2 带输入参数的游标:
-- 使用游标查询emp表中某个部门员工的姓名和工资,并将其依次打印出来
declare
-- 声明带参数的游标,在声明时加上形参,select语句里面加上查询条件
cursor c_emp(v_deptno emp.deptno%TYPE) is
select ename, sal from emp where deptno = v_deptno;
--声明变量接收游标中的数据
v_ename emp.ename%TYPE;
v_sal emp.sal%TYPE;
begin
open c_emp(10); -- 打开游标时加上实参
loop -- 遍历游标
fetch c_emp into v_ename, v_sal; --获取游标中的数据,如果有的话就赋值给变量
--在判断之前先获取一下数据,看有还是没有
exit when c_emp%notfound; --c_emp%notfound 没有数据时返回true
dbms_output.put_line('姓名:' || v_ename || ',薪水:' || v_sal);
end loop;
close c_emp; --关闭游标 end;
上述游标使用语句,相当于一个匿名的函数,当测试窗口关闭,语句也就没有了,无法实现复用。如果想要在窗口关闭了之后还能使用上面那段语句,就需要存储过程了。参见下文存储过程学习记录。
基于oracle 的PL/SQL编程 -变量使用的更多相关文章
- 基于oracle 的PL/SQL编程 - 存储过程
接上篇,游标使用的语句,相当于一段匿名的函数,窗口关闭了就不存在了.如果想要窗口关闭了,还能继续执行那段代码,就需要存储过程了: PLSQL是指一个个PLSQL的业务处理过程存储起来进行复用,这些被存 ...
- Oracle之PL/SQL编程
PL/SQL(Procedural Language/SQL,过程语言/SQL) 是结合了Oracel过程语言和结构化查询语言(SQL)的一种扩展语言. 优点: (1)PL/SQL具有编程语言的特点, ...
- PL/SQL编程—变量
SQL> declare c_tax_rate ,):=0.03; v_name ); v_passwd ); v_sale ,); v_tax_sale ,); begin select na ...
- PL/SQL编程--变量声明及赋值
declare v_price ,);--单价 v_usenum number;--水费字数 v_usenum2 number;--使用吨数 begin v_price:=2.45;--每吨单价 v_ ...
- Oracle PL/SQL编程之变量
注: 以下测试案例所用的表均来自与scott方案,使用前,请确保该用户解锁. 1.简介 和大多数编程语言一样,在编写PL/SQL程序时,可以定义常量和变量,在pl/sql程序中包括有: a.标量类型( ...
- ORACLE PL/SQL编程详解
ORACLE PL/SQL编程详解 编程详解 SQL语言只是访问.操作数据库的语言,并不是一种具有流程控制的程序设计语言,而只有程序设计语言才能用于应用软件的开发.PL /SQL是一种高级数据库程序设 ...
- [推荐]ORACLE PL/SQL编程之四:把游标说透(不怕做不到,只怕想不到)
原文:[推荐]ORACLE PL/SQL编程之四:把游标说透(不怕做不到,只怕想不到) [推荐]ORACLE PL/SQL编程之四: 把游标说透(不怕做不到,只怕想不到) 继上两篇:ORACLE PL ...
- ORACLE PL/SQL编程详解(转)
原帖地址:http://blog.csdn.net/chenjinping123/article/details/8737604 ORACLE PL/SQL编程详解 SQL语言只是访问.操作数据库的语 ...
- [强烈推荐]ORACLE PL/SQL编程详解之七:程序包的创建与应用(聪明在于学习,天才在于积累!)
原文:[强烈推荐]ORACLE PL/SQL编程详解之七:程序包的创建与应用(聪明在于学习,天才在于积累!) [强烈推荐]ORACLE PL/SQL编程详解之七: 程序包的创建与应用(聪明在于学习,天 ...
随机推荐
- Ajax对数据的删除与查看
1.数据库找一张表: 颜色表2.主页面主页面的代码用到tbody:TBODY作用是:可以控制表格分行下载,从而提高下载速度.(网页的打开是先表格的的内容全部下载完毕后,才显示出来,分行下载可以先显示部 ...
- Vagrant 手册之 Vagrantfile - SSH 设置 config.ssh
原文地址 配置的命名空间:config.ssh config.ssh 中的设置与配置 Vagrant 如何通过 SSH 访问您的计算机相关. 大多数 Vagrant 设置一样,一般使用默认设置即可,但 ...
- MongoDB分片配置 优化 不错
简单注解:mongos 路由进程, 应用程序接入mongos再查询到具体分片,监听端口默认27017config server 路由表服务, 每一台都具有全部chunk的路由信息 shard为数据存储 ...
- 题解[SCOI2009]粉刷匠 难度:省选/NOI-
Description windy有 N 条木板需要被粉刷.每条木板被分为 M 个格子.每个格子要被刷成红色或蓝色.windy每次粉刷,只能选择一条木板上一段连续的格子,然后涂上一种颜色.每个格子最多 ...
- Linear Regression and Gradient Descent
随着所学算法的增多,加之使用次数的增多,不时对之前所学的算法有新的理解.这篇博文是在2018年4月17日再次编辑,将之前的3篇博文合并为一篇. 1.Problem and Loss Function ...
- 关于VMware中的几个网络模式
直接参考别人的: 写的已经很细致了: http://blog.csdn.net/yaoyaowugui/article/details/7422388 关键是看别人的几张图
- PS总结
1.ALT:取消工具选择状态2. photoshopcs6 出现因为智能对象不能直接进行编辑 解决方案:右击---图层名---栅格化图层3.Shift+F5:填充画布颜色 4.PS不能变换路径, ...
- datepart()函数的使用
/* datepart()函数的使用 * datepart()函数可以方便的取到时期中的各个部分 *如日期:2006-07--02 18:15:36 ...
- [Codeforces 865C]Gotta Go Fast(期望dp+二分答案)
[Codeforces 865C]Gotta Go Fast(期望dp+二分答案) 题面 一个游戏一共有n个关卡,对于第i关,用a[i]时间通过的概率为p[i],用b[i]通过的时间为1-p[i],每 ...
- luogu P3657 (NOIP2017) 跳房子(二分+DP+单调队列)
题面 传送门 分析 显然答案有单调性,可以二分答案,设当前二分值为g,根据题意我们可以求出跳跃长度的范围[l,r] 考虑DP 子状态: dp[i]表示跳到第i个点时的最大和 状态转移方程 \(dp[i ...