基于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;
复制代码

 

上述游标使用语句,相当于一个匿名的函数,当测试窗口关闭,语句也就没有了,无法实现复用。如果想要在窗口关闭了之后还能使用上面那段语句,就需要存储过程了。参见下文存储过程学习记录。 

 

posted on   癫狂编程  阅读(370)  评论(0编辑  收藏  举报

编辑推荐:
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
阅读排行:
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
· 全程使用 AI 从 0 到 1 写了个小工具
· 从文本到图像:SSE 如何助力 AI 内容实时呈现?(Typescript篇)
历史上的今天:
2019-12-01 Oracle的ole db连接字符串
2019-12-01 oracle instantclient + plsql 远程连接数据库
2019-12-01 Oracle Instant Client(即时客户端) 安装与配置
2019-12-01 delphi连接oracle数据库
2018-12-01 开发一个delphi写的桌面图标管理代码

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
好的代码像粥一样,都是用时间熬出来的
点击右上角即可分享
微信分享提示