pl/sql 基础---定义并使用变量!

简介: pl/sql 基础---定义并使用变量! 在编写 pl/sql 程序时,可以定义变量和常量;在pl/sql 程序中包括有: ①标量类型 (scalar) ②复合类型 (composite) ③参照类型 (reference) ④lob (large object)   >标量(scalar)-- 常用类型 在编写 pl/sql 块时,如果要使用变量,需在定义部

pl/sql 基础---定义并使用变量!

在编写 pl/sql 程序时,可以定义变量和常量;在pl/sql 程序中包括有:

①标量类型 (scalar)

②复合类型 (composite)

③参照类型 (reference)

lob (large object)

 

>标量(scalar-- 常用类型

在编写 pl/sql 块时,如果要使用变量,需在定义部分定义变量。

pl/sql 中定义变量和常量的语法如下:

 

标量定义的案例:

①定义一个变长字符串

v_ename   varchar2(10);

②定义一个小数范围 -9999.99~9999.99

v_sal   number(6,2);

③定义一个小数并给一个初始值为 5.4:= 是 pl/sql 的赋值号

v_sal2   number(6,2):=5.4

④定义一个日期类型的数据

v_hiredate   date;

⑤定义一个布尔变量,不能为空,初始值为 false

v_valid  boolean not null default false;

 

>标量:使用标量

在定义好变量后,就可以使用这些变量。这里需要说明的是 pl/sql 块为变量赋值不同于其他的编程语言,需要在等号前加冒号 (:=)

 例子:输入员工号,显示雇员姓名,工资,个人所得税(税率为0.03)。

----------------------------------------------

declare

c_tax_rate number(3,2):=0.03;

---用户名

v_ename varchar2(5);            ///万一有用户名大于5个字符就会报错了

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;

 

>标量(scalar):使用%type类型

对于上面的 pl/sql 块有一个问题:

就是如果员工姓名超过了5字符的话,就会有错误,为了降低 pl/sql 程序的维护工作量,可以使用 %type 属性定义变量,这样它会按照数据库列来确定你定义的变量的类型和长度。

标识符名 表名.列名%type;

----------------------------------------------

declare

c_tax_rate number(3,2):=0.03;

---用户名

v_ename emp.ename%type;  //v_ename,类型是和表emp.ename下面的字段的类型大小一样!

v_sal emp.sal%type;

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;

 

复合变量(composite---介绍 []

用于存放多个值的变量。主要包括:

① pl/sql 记录

② pl/sql 

③ 嵌套表 nested table  ///③④再研究!

④ 变长数组 varray    ///动态表

 

》复合类型--pl/sql 记录

类似于高级语言中的结构体,需要注意的是,当引用 pl/sql 记录成员时,必须要加记录变量作为前缀(记录变量.记录成员)如下:

pl/sql  记录实例

declare 

----定义一个 pl/sql 记录类型 emp_record_type [类似于自己定义了一个数据类型,或像一个类,这个类型含三个数据 name, salary, tittle !就是这一个类型,就存放三个数据,便于管理]

type emp_record_type is record(

name emp.ename%type, 

salary emp.sal%type, 

title emp.job%type);

----定义了一个 sp_record 变量,这个变量的类型是 emp_record_type

sp_record emp_record_type;    ---等价: v_name varchar2(45);

begin

select ename,sal,job into sp_record     ///一次取出三个数据,扔进sp_record

from emp where empno=7788;

dbms_output.put_line('员工名:'||sp_record.name||’ 工资是:’sp_record.salary);

///用 sp_record.name!类似面向对象!而不是C的 sp_record->name

end;

/

 

》复合类型-pl/sql

相当于高级语言中的数组,但是需要注意的是在高级语言中数组的下标不能为负数,而pl/sql是可以为负数的,并且表元素的下标没有限制,实例如下:

declare

-----定义了一个 pl/sql表类型 sp_table_type,该类型是用于存放 emp.ename%type

-----index by binary_integer 表示下标是整数

type sp_table_type is table of emp.ename%type index by binary_integer;

-----定义了一个 sp_table 变量,这个变量的类型是 sp_table_type

///注意,PL/SQL的习惯是变量写在前面,类型在后面

sp_table sp_table_type;

begin

select ename into sp_table(0) from emp where empno=7788;  //没有where,需要参照变量!

dbms_output.put_line('员工名:'||sp_table(0));

end;

/

说明:

sp_table_type   是 pl/sql 表类型

emp.ename%type  指定了表的元素的类型和长度

sp_table 为pl/sql表变量

sp_table(0)  则表示下标为0的元素

问题:能否将 pl/sql记录作为 pl/sql表的类型?

 

参照变量---介绍

  参照变量是指用于存放数值指针的变量。通过使用参照变量,可以使得应用程序共享相同对象,从而降低占用的空间。在编写pl/sql程序时,可以使用游标变量(ref cursor)和对象类型变量 (ref obj_type) 两种参照变量类型。

参照变量--ref cursor游标变量

使用游标时,当定义游标时不需要指定相应的 select 语句,但是当使用游标时(open)需要指定 select 语句,这样一个游标就与一个 select 语句结合了。实例如下:

①请使用 pl/sql 编写一个块,可以输入部门号,并显示该部门所有员工姓名和他的工资。

②在①基础上,如果某个员工的工资低于200元,就增加100元。

①:::::::::::

declare

---定义游标类型 sp_emp_cursor

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;

---判断是否 test_cursor 为空

exit when test_cursor%notfound;

dbms_output.put_line('名字:'||v_ename||'工资:'||v_sal);

end loop;

end;

/

目录
相关文章
|
19天前
|
SQL 数据采集 监控
局域网监控电脑屏幕软件:PL/SQL 实现的数据库关联监控
在当今网络环境中,基于PL/SQL的局域网监控系统对于企业和机构的信息安全至关重要。该系统包括屏幕数据采集、数据处理与分析、数据库关联与存储三个核心模块,能够提供全面而准确的监控信息,帮助管理者有效监督局域网内的电脑使用情况。
16 2
|
3月前
|
SQL Oracle 关系型数据库
SQL与PL/SQL:数据库编程语言的比较
【8月更文挑战第31天】
65 0
|
3月前
|
SQL 安全 Java
访问者模式问题之在上面的 SQL 结构定义中, sealed 接口的作用如何理解
访问者模式问题之在上面的 SQL 结构定义中, sealed 接口的作用如何理解
|
4月前
|
SQL 运维 分布式计算
DataWorks产品使用合集之ODPPS中如何使用SQL查询从表中获取值并将其赋值给临时变量以供后续使用
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
|
4月前
|
SQL 存储 索引
MySQL设计规约问题之为什么应该把字段定义为NOT NULL并且提供默认值
MySQL设计规约问题之为什么应该把字段定义为NOT NULL并且提供默认值
|
5月前
|
SQL 存储 分布式计算
MaxCompute产品使用问题之odps sql如何定义变量
MaxCompute作为一款全面的大数据处理平台,广泛应用于各类大数据分析、数据挖掘、BI及机器学习场景。掌握其核心功能、熟练操作流程、遵循最佳实践,可以帮助用户高效、安全地管理和利用海量数据。以下是一个关于MaxCompute产品使用的合集,涵盖了其核心功能、应用场景、操作流程以及最佳实践等内容。
185 0
|
5月前
|
SQL 数据库 Perl
PL/SQL中执行按钮变为灰色后如何恢复【已解决】
PL/SQL中执行按钮变为灰色后如何恢复【已解决】
505 0
|
SQL
SQL*Plus中替换变量与定义变量
替换变量 SQL*Plus中的替换变量又叫替代变量,它一般用来临时存储相关数据;在SQL语句之间传递值。一般使用&或&&前缀来指定替换变量. 关于使用替换变量,一般是利用其创建通用的脚本或达到和用户交换目的。
1227 0
|
2月前
|
关系型数据库 MySQL 网络安全
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
|
4月前
|
SQL 存储 监控
SQL Server的并行实施如何优化?
【7月更文挑战第23天】SQL Server的并行实施如何优化?
112 13