1.变量的声明:

摘自:Oracle+PL+SQL从入门到精通.丁士锋.清华大学出版社.2012

声明变量的范例:

declarev_empname varchar (20);v_deptname varchar (20);v_hiredae  date    not null:=sysdate;v_emmno      int     not null default 0114;
beginDBMS_OUTPUT.PUT_LINE('ther are declares some param');--DBMS_OUTPUT.PUT('现在时间是:');DBMS_OUTPUT.PUT_LINE('现在时间是:'||to_char(v_hiredae,'YYYY-MM-DD HH24:MI:SS'));
end;
/

注意,一旦出现了nut null字段,后面必须有赋初值的语句

2.变量的赋值

变量在使用前必须初始化或者赋值,如果使用前不赋值,后面对变量的的操作将会无效。

举例:

declarev_counter integer;
beginv_counter:=0;v_counter:=v_counter+1;DBMS_OUTPUT.PUT_LINE('v_counter = '||v_counter);
end;
/

正确为变量赋值,再操作,得到正确的结果

错误示范:注释赋值部分,得到空

使用数据库类型为变量赋值

declare v_string varchar2(200);v_hire_date   date;v_bool boolean;    --pl/sql 布尔类型
beginv_bool:= True;    --布尔类型赋值v_hire_date:=to_date('2019-01-29', 'yyyy-mm-dd');  --使用函数为日期赋值DBMS_OUTPUT.PUT_LINE('to_date 日期是:'||to_char(v_hire_date,'YYYY-MM-DD'));v_hire_date:=sysdate;    --使用日期函数赋值DBMS_OUTPUT.PUT_LINE('to_date 日期是:'||to_char(v_hire_date,'YYYY-MM-DD HH24:MI:SS'));v_hire_date:=date'2019-01-29';   --直接赋值静态日期DBMS_OUTPUT.PUT_LINE('date 日期是:'||to_char(v_hire_date,'YYYY-MM-DD'));v_string:='this is a string';DBMS_OUTPUT.PUT_LINE(v_string);end;
/

输出结果:

使用数据库数据为变量赋值

表结构如下:

表数据如下:

使用表数据为变量赋值过程:

SET SERVEROUTPUT ON;--打开DBM输出显示开关
declarev_id student2.sid%TYPE;v_name    student2.sname%TYPE;v_birthday  student2.sbirth%TYPE;v_solary   student2.solary%TYPE;
beginselect sid,sname,sbirth,solaryinto v_id,v_name,v_birthday,v_solaryfrom student2where sid = &id;   --id为入参,需要手动输入--输出变量的内容DBMS_OUTPUT.PUT_LINE('学生ID:'  || v_id);DBMS_OUTPUT.PUT_LINE('学生姓名:'|| v_name);DBMS_OUTPUT.PUT_LINE('学生生日:'|| v_birthday);DBMS_OUTPUT.PUT_LINE('学生月薪:'|| v_solary);
end;
/

执行结果:

注意:如果select into 查询返回多行数据会触发 TOO_MANY_ROWS异常,
           如果未找到任何行数据,会触发NO_DATA_FOUND异常。

3.使用 %TYPE

使用pl/sql的%TYPE,开发人员可以基于已有的变量类型,或者是数据库列的类型来之sing变量的类型。

declarev_id  student2.sid%TYPE;v_tid v_id%TYPE;v_solary  number(7,3) NOT NULL:=1000;v_others0lary   v_solary%TYPE:=500;
beginNULL;
end;
/

上述代码中的v_id使用%TYPE定义了与student2表中sid列相同的数据类型,而v_tid定义了与v_id相同的类型,因此,当student2表中的sid列的类型发生变化后,变脸的类型会自动发生变化,不需要手动地进行维护。
v_solary是一个具有NOT NULL约束的变量声明,在声明这个变量指定了厨师长,v_othersolary使用%TYPE定义了与v_solary相同的类型,因此也具有 NOT NULL的约束,在声明是同样为v_othersolary指定了变量的初始值,如果不指定这个初始值,pl/sql引擎将触发如下所示的异常:

注意:尽管v_othersolary会因为 指定的NOT NULL而触发异常,但是student2表中的sid列是不允许为空的,对于数据库
类型,%TYPE 只提供类型信息,并不提供 NOT NULL 约束信息,因此即便没有为v_id或v_tid指定初始值,也能够正常运行。

4.使用%ROWTYPE

%ROWTYPE是预%TYPE 相似的用于绑定到数据库表列的类型,%TYPE仅绑定到单个数据库列的类型,而%ROWTYPE则绑定到一整行
的所有列类型,可以将使用%ROWTYPE定义的变量看做是一条记录类型,如下实例:

declarev_stu student2%ROWTYPE;   --定义student2表的所有列类型
beginselect *into v_stufrom student2where sid = &id;--输出结果DBMS_OUTPUT.PUT_LINE('学生ID:'  || v_stu.sid || chr(10)|| '学生姓名:' || v_stu.sname || chr(10)|| '学生月薪:' ||v_stu.solary);
end;
/

输出:

注意:在pl/sql中,chr(13)表示回车,chr(10)表示换行,同城使用cher(13)与chr(10)来进行回车与换行
插入行记录类型

使用%ROWTYPE定义游标类型的变量

declarecursor stu_cursor --定义游标类型isselect sid,sname,sage,job,solaryfrom student2;--使用%ROWTYPE定义游标类型的变量v_stu  stu_cursor%ROWTYPE;
beginopen stu_cursor;--循环提取游标数据loopfetch stu_cursorinto v_stu;--注意游标移动到最尾部退出游标exit when stu_cursor%NOTFOUND;--输出游标数据DBMS_OUTPUT.PUT_LINE('学生ID:'  || v_stu.sid || chr(10)|| '学生姓名:' || v_stu.sname || chr(10)|| '学生年龄:' ||v_stu.sage || chr(10)|| '学生月薪:' ||v_stu.solary || chr(10)|| '学生职位:' ||v_stu.job);end loop;--关闭游标close stu_cursor;
end;
/

输出:

可以看到代码定义了游标stu_sursor,然后定义了改游标类型的v_stu变量,使用%ROWTYPE指定类型为游标返回类型,
通过提取游标的FETCH INTO语句,一次将一行数据写入v_stu变量中,然后输出吧结果
5.变量的作用域和可见性

<<outer>>
declarev_name   varchar2(20);   --定义外层变量
beginv_name:='sherly';<<inner>>declarev_name varchar2(20);beginv_name:='lucky';--输出内层快的变量DBMS_OUTPUT.PUT_LINE('内层块的学生姓名:' || v_name);DBMS_OUTPUT.PUT_LINE('外层块的学生姓名:' || outer.v_name);end;DBMS_OUTPUT.PUT_LINE('outer的学生姓名:' || v_name);
end;
/

嵌套模块的语法格式如上,外层与内层的变量的作用域类似于C++的结构体作用域
注意:如果子块中重新声明了变量,本地变量优先权将高于全局变量。

内层的嵌套块遵循变量的可见性与作用域规则,仅在内部模块可见,当离开嵌套块时,变量占用的内存会
被释放,因此外层的块无法对内层的变量进行访问。

6.常量的定义

常量的定义类似于变量,但是常量的一个明显的特征是需要在变量声明时指定初始值,其值一旦指定,在整个程序的运行期间不能发生改变,常量通常用来定义静态的值,是的开发人员可以使用常量来替代代码中硬编码的值,增强代码的可维护性。
常量的定义语法如下所示:

constant_name    constant datatype :=value;

>>constant_name 是常量的名称,命名格式与变量相似 c_name
>>constant 是一个保留字,用来确保值不会被改变
>>value用来为常量指定一个值,在常量声明时必须具有一个初始值

declarec_solary_rate constant    number(7,2) :=0.25; --定义加薪常量值v_name    varchar2(20);v_solary   number(7,2);v_solaryadd number(7,2);
beginselect solary,snameinto v_solary,v_namefrom student2where sid = &id;v_solaryadd:=v_solary * (1 + c_solary_rate);DBMS_OUTPUT.PUT_LINE('学生姓名:' || v_name || chr(10)|| '学生当前薪水:' || v_solary || chr(10)|| '加薪后薪水:' || v_solaryadd);
end;
/

Oracle 学习——变量相关推荐

  1. Oracle学习笔记:oracle和serverver在过程sql中通过select对变量进行赋值的区别

    变量的声明: oracle的变量必须在在declare部分声明--意思是必须建立begin end块,块结构也强制变量必须先声明后使用,即oracle变量在过程内是有不同作用域.不同的生存期的:同一变 ...

  2. oracle系统user$,Oracle 系统变量函数介绍

    Oracle函数多种多样,系统变量函数就是其中之一,下面就为您介绍三种最常见的系统变量函数,希望对您学习Oracle能有所帮助. Oracle系统变量函数: (1)SYSDATE 该函数返回当前的日期 ...

  3. oracle学习数据,oracle学习中的一些心得

    当前位置:我的异常网» 数据库 » oracle学习中的一些心得 oracle学习中的一些心得 www.myexceptions.net  网友分享于:2015-08-26  浏览:10次 oracl ...

  4. oracle:oracle学习笔记(四)循环、光标、异常、瀑布模型

    oracle学习笔记:循环.光标.异常 文章目录 打印Hello World 定义基本变量 引用型变量(单行)` my_name emp.ename%type ` 记录型变量(多行) `emp_rec ...

  5. 在大量数据迁移期间oracle学习笔记

    在数据迁移期间oracle学习笔记 0主键(自增) 1用户代码 2区域代码 3承保公司代码 4理赔编码 5投保确认码 6案件状态 7案件进展 8重开案件进展 9转换后案件状态 需求分析: 1.根据上述 ...

  6. linux环境oracle环境变量,Linux下设置oracle环境变量

    Linux设置Oracle环境变量 方法一:直接运行export命令定义变量,该变量只在当前的shell(BASH)或其子shell(BASH)下是有效的,shell关闭了,变量也就失效了,再打开新s ...

  7. bulk怎么使用oracle,oracle学习之bulk collect用法

    通过bulk collect减少loop处理的开销,使用Bulk Collect提高Oracle查询效率 Oracle8i中首次引入了Bulk Collect特性,该特性可以让我们在PL/SQL中能使 ...

  8. Oracle学习笔记 字符集概述

    Oracle 学习笔记 字符集概述 这节课开始讲oracle里面的字符集 偏重于原理和简单的一些判断以及实现 字符集它涉及到很多的东西 比如建库和操作系统环境 这节课把字符集的原理性的东西以及常见的操 ...

  9. oracle如何高效分页,oracle学习之高效分页存储过程实例

    oracle学习之高效分页存储过程实例 时间:2017-07-11 来源: create or replace package p_page is -- Author : PHARAOHS -- Cr ...

最新文章

  1. java基础.0——Object类
  2. sudo规则支持正则
  3. [系统安全]使用OD编写连连看外挂
  4. 冷热复位_冷热rx-java可观察
  5. mysql主键重复会覆盖还是_mysql如果主键重复了会发生什么情况
  6. python函数示例_带Python示例的float()函数
  7. python选定区域设置边框_Python教程:巧用openpyxl为指定区域设置边框为粗匣框线...
  8. python np.cos 转化为角度_postman接口用例转化为python自动化测试用例(三)
  9. 使用.net core和abp框架实现动态webapi的简单说明
  10. 教务管理系统C++全部代码
  11. 第六届中国电子信息博览会今日正式开幕,智享新时代!
  12. 常用crc查表法_CRC8查表法
  13. NetApp存储方案及巡检命令
  14. Excel如何将多个工作簿数据合并到一起
  15. C# 读取SQLite
  16. 腾讯地图位置服务器,腾讯位置服务离线地图接入指南
  17. 我不要我觉得,我要你觉得--如何根据企业研发的现状实施DevOps
  18. 更换固态,重装win10系统
  19. AD根据已有的PCB封装链接至原理图
  20. TCP/UDP、TCP/IP区别

热门文章

  1. UserWarning: Failed to load image Python extension: [WinError 126] 找不到指定的模块。 warn(f“Failed to load
  2. DEDECMS生成RRS绝对路径
  3. Linux运维部落 DNS服务,DNS资源记录类型
  4. 股票实战技巧——行业是选股核心原则(转载)
  5. 简单记录:银联在线支付
  6. 一条SQL语句求全年平均值
  7. Netty-粘包,半包和使用Json方式传输数据
  8. 建立如下所示学生c语言成绩单,2010年计算机等级考试一级模拟试题11
  9. 开心斗地主小游戏代码
  10. Redis HSET 详解