设为首页 收藏本站
查看: 716|回复: 0

[经验分享] Oracle PL/SQL使用的变量小结

[复制链接]

尚未签到

发表于 2016-8-2 16:25:20 | 显示全部楼层 |阅读模式
  PLSQL变量有四种类型,分别是:
- 标量类型(Scalar)
- 复合类型(Composite)
- 参照类型(Reference)
- LOB类型(Large Object)
  
  1、标量类型:
- 只能存放单个数值的变量
- 定义时,必须要指定标量的数据类型
  1.1常用标量类型
(1)VARCHAR2(n)
定义可变长度的字符串
n指定字符串最大长度
n最大值是32767字节
使用时必须指定长度
当在PLSQL块钟使用该数据类型操纵VARCHAR2表列时,起数值长度不应超过4000字节
  (2)CHAR(n)
定义固定长度字符串
n指定字符串的最大长度
n最大值是32767自己
使用时指定长度,若没指定,则使用默认值1
当在PLSQL块钟使用该数据类型操纵CHAR2表列时,起数值长度不应超过2000字节
  (3)NUMBER(p,s)
定义固定长度的整数和浮点数
p表示精度,用于指定数字的总位数
s表示标度,用于指定小数点后的数字位数
  (4)DATE
定义日期和数据数据
  (5)BOOLEAN
定义布尔变量
值为:TRUE、FALSE、NULL
为PLSQL独有数据类型,表列不能采用该数据类型
NULL表示missing、inapplicable或者unknown
  (6)LONG和LONG ROW
long:数据类型用于定义变长字符串,类似于VARCHAR2数据类型,但其字符串的最大长度为32760字节
long row:数据类型用于定义变长的二进制数据,其数据最大长度为32760字节
  (7)BINARY_INTEGER
定义整数
数值范围-2147483647和2174483647之间
  (8)BINARY_FLOAT和BINARY_DOUBLE
BINARY_FLOAT定义单精度浮点数(oracle 10g新增加)
BINARY_DOUBLE定义双精度浮点数(oracle 10g新增加)
  (9)TIMESTAMP
定义时间和日期数据(oracle 9i新增加)
对其赋值方法与对date变量赋值方法完全相同
当显示TIMESTAMP变量数据时,不仅会显示日期,而且还会显示时间和上下午标记
  1.2、定义标量类型
语法:
identifier [CONSTANT] datatype [NOT NULL] [ :=|DEFAULT expr]
identifier:指定变量或常量名称
CONSTANT:指定是常量
datatype:用于指定变量或常量的类型
NOT NULL:非空,有它是必须初始化
:= :赋值符合
DEFAULT:默认值
expr:初始值
  定义标题变量示例:
v_ename              varchar2(10);
v_sal                    number(6,2);
c_balance            CONSTANT    number(3,2) := 5.5;
v_hiredate           date;
v_valid                 boolean      not null         default false;
  1.3、标量定义规则
每行声明一个变量
变量的赋值使用:identifier := value;
变量名称最多30个字符
  1.4使用%TYPE属性
安装数据库列或其他变量来确定新变量的类型和长度(具有动态性和绑定性)
语法:identifier Table.column_name%TYPE;
或者:identifier other_variable_name%TYPE;
  代码:
  DECLARE
   v_ename       emp.ename%TYPE;
   v_sal         emp.sal%TYPE;
   c_rate        CONSTANT  NUMBER(3,2) := 0.08;
   v_sal_rate    emp.sal%TYPE;
BEGIN
   SELECT ename,sal INTO v_ename,v_sal FROM emp WHERE empno=&eno;
   --计算个人应交的所得税
   v_sal_rate := v_sal*c_rate;
   --打印
   dbms_output.put_line('姓名:' || v_ename);
   dbms_output.put_line('工资:' || v_sal || '元.');
   dbms_output.put_line('所得税:' || v_sal_rate || '元.');
EXCEPTION
   WHEN no_data_found THEN
      dbms_output.put_line('输入的会员编号不存在,请重新输入.');
   WHEN OTHERS THEN
      dbms_output.put_line('系统错误,请与管理员联系.');
END;
  
2、复合变量指用于存放多个值的变量
当定义复合变量时,必须要使用PL/SQL的复合数据类型
PL/SQL的复合数据类型包括:
A、PL/SQL记录
  代码:
  DECLARE  
  TYPE emp_record_type IS RECORD(  
    name scott.emp.ename%TYPE,  
    salary scott.emp.sal%TYPE,  
    title scott.emp.job%TYPE);  
  emp_record emp_record_type;  
BEGIN  
  SELECT t.ename,t.sal,t.job INTO emp_record  
  FROM scott.emp t WHERE t.empno=7788;  
  dbms_output.put_line(emp_record.name);  
END; 
  B、PL/SQL表(索引表)
  代码:
  DECLARE  
    TYPE ename_table_type IS TABLE OF scott.emp.ename%TYPE  
         INDEX BY BINARY_INTEGER;  
    ename_table ename_table_type;  
BEGIN  
     SELECT ename INTO ename_table(-1) from scott.emp  
     WHERE empno = 7788;  
     dbms_output.put_line(ename_table(-1));       
END; 
  C、PL/SQL嵌套表
  代码:
  CREATE OR REPLACE TYPE emp_type as object(  
 name varchar2(10),salary NUMBER(6,2),hiredate DATE);  
 /  
CREATE OR REPLACE TYPE emp_array IS TABLE OF emp_type;  
/  
 
CREATE TABLE department(  
       deptno NUMBER(2),dname VARCHAR2(10),  
       employee emp_array  
) NESTED TABLE employee STORE AS employee; 
  D、VARRAY
  代码:
  CREATE TYPE article_type AS OBJECT (  
title VARCHAR2(30),pubdate DATE  
);  
 
CREATE TYPE article_array IS VARRAY(20) OF article_type;  
 
CREATE TABLE author(  
id NUMBER(6),name VARCHAR2(10),article article_array  
); 
关于这些复合数据类型,由相关章节给出
  
3、参照变量指用于存放数值指针的变量
可以通过参照变量来共享相同对象,从而降低占用空间
两种参照变量:
A、游标变量(REF CURSOR)
  代码:
  DECLARE  
  TYPE c1 IS REF CURSOR;  
  emp_cursor c1;  
  v_ename scott.emp.ename%TYPE;  
  v_sal scott.emp.sal%TYPE;  
BEGIN  
     OPEN emp_cursor FOR   
          SELECT t.ename,t.sal  FROM scott.emp t WHERE t.deptno=10;  
     LOOP  
         FETCH emp_cursor INTO v_ename,v_sal;  
         EXIT WHEN emp_cursor%NOTFOUND;  
         dbms_output.put_line(v_ename);  
     END LOOP;  
     CLOSE emp_cursor;  
END;
B、对象类型变量(REF obj_type)
  代码:
  CREATE OR REPLACE TYPE home_type AS OBJECT(  
  street VARCHAR2(50),city VARCHAR2(20),  
  state VARCHAR2(20),zipcode VARCHAR2(6),  
  owner VARCHAR2(10)  
);  
 
CREATE TABLE homes OF home_type;  
 
SELECT * FROM homes  
 
INSERT INTO homes VALUES('DaTongJie 15 Hao','DaLian','LiaoNing','160000','Mr.Lee');  
INSERT INTO homes VALUES('DaTongJie 16 Hao','DaLian','LiaoNing','160000','Mr.Wang');  
INSERT INTO homes VALUES('DaTongJie 17 Hao','DaLian','LiaoNing','160000','Mr.Piao');  
 
CREATE TABLE person(  
id NUMBER(6) PRIMARY KEY,  
name VARCHAR2(10),addr REF home_type  
);  
 
INSERT INTO person SELECT 1,'Mr.Lee',ref(p) FROM homes p WHERE p.owner='Mr.Lee';  
INSERT INTO person SELECT 2,'Mr.Zheng',ref(p) FROM homes p WHERE p.owner='Mr.Lee';  
 
SELECT * FROM person
关于这些参照变量,由相关章节给出
  
4、LOB变量用于存储大批量数据的变量
分为两种:
内部LOB:包括CLOB、BLOB、NCLOB,它们的数据被存储在数据库中,并且支持事务操作
外部LOB:BFILE,该类型数据被存储在OS文件中,并且不支持事务操作
  CLOB:存储大批量字符数据
NCLOB:存储大批量字符数据,unicode编码
BLOB:存储大批量二进制数据
BFILE:存储指向OS文件的指针
  
5、非PL/SQL变量
  5.1、替换变量(仅用于SQL *Plus或者用于原理和SQL *Plus相同的开发工具):
临时存储值
利用它可以达到创建通用脚本的目的
利用它可以达到和用户交互,故在SQL *Plus中又称交互式命令
替换变量的格式式在变量名称前加一个&,以便在运行SQL命令时提示用户输入替换数据,然后按输入数据运行SQL命令
语法:
(1)& :“&变量名”eg:&name;
生命周期:单次引用中,不需要声明,如果替换字符或日期类型,最好用单引号扩起
使用范围:where、order by、列表达式、表名、整个SELECT 语句中
  (2)&& :“&&变量名”eg:&&name;
生命周期:整个会话(session连接),不需要声明
  (3)define :“define 变量名=变量值”eg:DEFINE a = clark;
生命周期:整个会话,预先声明,使用时用&引用声明的变量
define variable=用户创建的CHAR类型的值:define 变量名=值;
define column_name(变量名):查看变量命令。
undefine 变量名:清除变量
define:查看在当前会话中所有的替换变量和它们的值
  (4)accept
  生命周期:整个会话
预先声明,可以客户化提示信息,使用时用&引用声明的变量。
定义:
accept 变量名name number/char/date prompt '提示信息内容'即:ACC[EPT] variable [NUM[BER] | CHAR | DATE] [FOR[MAT] format] [DEF[AULT] default] [PROMPT text | NOPR[OMPT]] [HIDE]
解释:
PROMPT命令:用于输出提示用户的信息,以便使用户了解脚本文件的功能和运行情况
PAUSE命令:用于暂停脚本文件的运行
HIDE选项:用于隐藏用户的输入,使别人不可见,安全
这条命令的意思是:当plsql程序段执行到变量name的时候,此时需要用户的交互才能继续执行下去,plsql程序段会显示“提示信息内容”让用户输入相关信息(如果指定hide选项,那么在接下去用户输入的东西将被用星号显示出来增加安全,有点像输入密码),用户输入的内容被接收到并且把它付给name,关于在“提示信息内容”下用户输入的内容的类型,plsql程序段开发人员来通过number/char/date指定,变量name得到正确的值以后,继续执行相关下面的程序!
例:accept a char prompt '请输入员工的雇佣时间(yyyy-mm-dd):' hide
例:accept a char prompt 'input a:' hide
  替换变量非常的依赖SQL *Plus的环境,当环境变量verify被关闭的时候它就不可用,只有通过打开它才能使用:
set verify(环境变量) off;关闭调试命令(关掉替换过程)
set verify(环境变量) on;打开调试命令(可以看到替换过程)
  
5.2、SQL *PLUS环境变量(仅用于SQL *Plus或者用于原理和SQL *Plus相同的开发工具):
ECHO 显示回显
HEADING {OFF/ON}是否显示列标题
ARRAYSIZE{20/n}每一次从查询得到的返回量的大小
FEEDBACK{OFF/ON}回馈,反馈信息
LONG{80/n}on/text} LONG类型
LINESIZE 行的宽度
SET LINESIZE n(最好是在200之内)
PAGESIZE :设置页的大小。SET PAGESIZE N
wrap{off/on} 折行
SET 修改
SHOW 显示
  SQL *PLUS中格式化显示的命令:
COLUMN[column option]可以设置字段或字段别名的格式
COLUMN last_name HEADING employee|name '|'代表换行
col 字段名 查看命令
CLE[AR]:清除列的格式
HEA[DING] TEXT:设置列标题
FOR[MAT] FORMAT:格式化显示列的值,对字符和数字有效,对日期无效,eg:column salary justify left format $999,999.00,其中justify left:左对齐;col manager_id format 999999999
限制字符串的长度有A+数字限制
限制数字的长度有9,有几为9就限制成几位。
NOPRINT/PRINT NOPRINT:把一个字段从输出上屏蔽掉(返回但不显示)。
col 字段名 noprint/print.
NULL如果有NULL值,显示什么。
col name null 'on employee'
TTITLE[text/off/on]设置报表的表头
BTITLE[text/off/on]设置报表的表尾
做报表的时候要先想好PAGESIZE的大小。
BREAK ON [REPORT_ELEMENT]
压制重复值的显示,只能跟一个字段名才有效,eg:
select department_id,last_name
from employees
where rownum<30
order by 1,2;
break on department_id
  5.3、做PL/SQL脚本文件的过程:
  变量定义accept
环境变量设置SET
格式控制命令
SPOOL
使用变量的SQL
SPOOL OFF
清除格式控制
重置环境变量
释放变量
  5.4、引用非PL/SQL变量当要在PL/SQL块中引用非PL/SQL变量时,也就是要引用PL/SQL块所在地的host变量(或称“环境变量”)时,必须要在非PL/SQL变量前加冒号(“:”),eg:”:name”,name为非PL/SQL变量。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-252119-1-1.html 上篇帖子: struts2.0 + hibernate + oracle 分页问题 下篇帖子: Oracle 11g新特性:Result Cache
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表