当前位置:首页>微思动态 > >详情
全国热线电话 400-881-4699

在线留言

【技术分享】Oracle变量、输入输出、SELECT INTO、%TYPE与%ROWTYPE详解

发布作者:微思网络   发布时间:2026-01-28   浏览量:0

二维码OCP.jpg

一、变量

1.什么是变量

在 Oracle 数据库里,变量发挥着重要作用,它能够存储中间值、传递数据以及增强 SQL 和 PL/SQL 代码的灵活性。

2.定义变量的语法

  • DECLARE


  • --声明的地方(声明变量,常量,游标等等),这一块不是必须的。

  • BEGIN 


  •  --代码的执行的逻辑块(就是要做什么)

  • END;

  • BEGIN

  • dbms_output.put_line('你好');

  • END;


  • BEGIN

  • dbms_output.put_line('Hello World');

  • dbms_output.put_line('你好');

  • END;


3.变量的赋值

  • DECLARE

  • v1 varchar2(20);

  • v2 date;

  • BEGIN

  • v1 := 'Hello';

  • dbms_output.put_line(v1);

  • v2 := to_date('20220101', 'yyyymmdd');

  • dbms_output.put_line(v2);

  • END;

日期格式是按照国外的格式输出的


4.变量可以被多次赋值,可以被覆盖

  • DECLARE

  • v1 varchar2(20);

  • BEGIN

  • v1 := 'Hello';

  • -- dbms_output.put_line(v1);

  • v1 := '你好';

  • dbms_output.put_line(v1);

  • END;


dbms_output包主要用于调试pl/sql程序

一个变量的赋值,可以在 DECLARE 中赋初始值,也可以在 BEGIN END中进行赋值,一个变量也可以重复赋值。

练习 : 打印 数字 10 以及 打印 当前年月日 'YYYY-MM-DD'

  • -- 方法一:

  • DECLARE

  • v1 number;

  • v2 varchar2(20);

  • BEGIN 

  •  v1 := 10;

  • dbms_output.put_line(v1);

  • v2 := TO_CHAR(SYSDATE, 'YYYY-MM-DD');

  • dbms_output.put_line(v2);

  • END;


  • -- 方法二:

  • DECLARE

  • v1 number := 10;

  • v2 varchar2(20) := TO_CHAR(SYSDATE, 'YYYY-MM-DD');

  • BEGIN

  • dbms_output.put_line(v1 || chr(10) || v2);

  • END;


chr(10)表示换行

二、输入输出

1.&符号表示输入

  • 变量来源于用户输入值

  • &后面接变量值名称

示例:用户输入一个数字,输出它的三次幂(例如:用户输入2,返回8)

  • DECLARE

  • v1 number := &input; -- 变量值名称可自定义 

  •  v2 number;

  • BEGIN 

  •  v2 := power(v1, 3);

  • -- v2:=v1*v1*v1;

  • dbms_output.put_line(v2);

  • END;



2.关于赋值的数据类型说明

  • 如果赋值的变量是字符串类型,那么在弹出的小窗口上传值的时候,记得添加 单引号

  • 如果赋值的变量是DATE类型,那么在弹出的小窗口上传值的时候,要用 TO_DATE 这个函数转换数据类型

示例:用户输入两个变量并打印出来,一个字符串类型,一个是日期型

  • DECLARE 

  •  v1 varchar2(20) := '&input1';

  • v2 DATE := &input2;

  • BEGIN

  • dbms_output.put_line(v1 || CHR(10) || v2);

  • END;



练习:打印用户输入的两个值的 加减乘除 对应的值(6,3)

  • DECLARE 

  •  v1 number := &input1; 

  •  v2 number := &input2;

  • BEGIN 

  •  dbms_output.put_line(v1 + v2); 

  •  dbms_output.put_line(v1 - v2); 

  •  dbms_output.put_line(v1 * v2); 

  •  dbms_output.put_line(v1 / v2);

  • END;



三、变量赋值 SELECT INTO

  • 注意:select后面有几个值,into后面就要有相对应的变量,注意数据类型要一致。

示例:打印某个员工的薪资(用户输入工号,打印他的薪资)

  • DECLARE 

  •  v1 number := &input; 

  •  v_sal number;

  • BEGIN

  • select sal into v_sal from emp where empno = v1; 

  •  dbms_output.put_line(v_sal);

  • END;



示例:接收一个员工的编号,将员工的姓名,工资,入职日期打印出来

  • DECLARE

  • v1 number := &input;

  • v_ename varchar2(20); 

  •  v_sal number; 

  •  v_hiredate date;

  • BEGIN 

  •  select ename, sal, hiredate 

  •  into v_ename, v_sal, v_hiredate

  • from emp where empno = v1; 

  •  dbms_output.put_line(v_ename || ',' || v_sal || ',' || TO_CHAR(v_hiredate, 'YYYY-MM-DD'));

  • END;



练习1:输入一个部门编号,打印这个部门的平均薪资(保留两位小数)

输出样式:10号部门的平均薪资为:2916.67

  • DECLARE 

  •  v1 number := &input; 

  •  v_avg_sal number;

  • BEGIN 

  •  select round(avg(sal + nvl(comm, 0)),2) avg_sal

  • into v_avg_sal

  • from emp 

  •  where deptno = v1 

  •  group by deptno; 

  •  dbms_output.put_line(v1 || '号部门的平均薪资为:' || v_avg_sal);

  • END;



练习2:写一个代码块,传入一个员工姓名,将这个员工的工号,岗位打印到 OUTPUT 窗口来

  • DECLARE 

  •  v1 varchar2(20) := '&input'; 

  •  v_empno number; 

  •  v_job varchar2(20);

  • BEGIN 

  •  select empno, job into v_empno, v_job from emp where ename = v1; 

  •  dbms_output.put_line(v_empno || ',' || v_job);

  • END;



四、使用%TYPE与%ROWTYPE无需写变量数据类型

  • %TYPE:引用数据库中的某张表的某列的数据类型。

  • %ROWTYPE:引用数据库中的某张表的一行(所有字段)作为数据类型。

1.%TYPE

示例:接收一个员工的编号,将员工的姓名,工资,入职日期打印出来

  • DECLARE

  •  v_EMPNO EMP.EMPNO%TYPE := &input;

  • v_ENAME EMP.ENAME%TYPE;

  • v_SAL EMP.SAL%TYPE;

  • v_HIREDATE EMP.HIREDATE%TYPE;

  • BEGIN select ENAME, SAL, HIREDATE

  • into v_ENAME, v_SAL, v_HIREDATE 

  •  from EMP

  • where EMPNO = v_EMPNO; 

  •  dbms_output.put_line(v_ENAME || '的薪资是:' || v_SAL || '入职时间:' || 

  •  TO_CHAR(v_HIREDATE,'YYYY-MM-DD'));

  • END;



2.%ROWTYPE

  • DECLARE 

  •  v_emp emp%ROWTYPE;

  • BEGIN

  • v_emp.EMPNO := &INPUT; 

  •  select ENAME, SAL, HIREDATE 

  •  into v_emp.ENAME, v_emp.SAL, v_emp.HIREDATE

  • from EMP 

  •  where EMPNO = v_emp.EMPNO;

  • dbms_output.put_line(v_emp.ENAME || '的薪资是:' || v_emp.SAL || '入职时间:' || 

  •  TO_CHAR(v_emp.HIREDATE, 'YYYY-MM-DD'));

  • END;


练习:写一个代码块,传入一个员工姓名,将这个员工的工号,岗位打印到 OUTPUT 窗口来

将刚才写的两个课堂练习用 %TYPE 和 %ROWTYPE 实现

  • -- %TYPE

  • DECLARE 

  •  v_ENAME EMP.ENAME%TYPE := '&input';

  • v_EMPNO EMP.EMPNO%TYPE;

  • v_JOB EMP.JOB%TYPE;

  • BEGIN 

  •  select EMPNO, JOB into v_EMPNO, v_JOB from EMP where ENAME = v_ENAME; 

  •  dbms_output.put_line(v_ENAME || '的工号是:' || v_EMPNO || '岗位是:' || v_JOB);

  • END;

  • -- %ROWTYPE

  • DECLARE 

  •  v_EMP EMP%ROWTYPE;

  • BEGIN

  • v_EMP.ENAME := '&INPUT'; 

  •  select EMPNO, JOB 

  •  into v_EMP.EMPNO, v_EMP.JOB 

  •  from EMP 

  •  where ENAME = v_EMP.ENAME; 

  •  dbms_output.put_line(v_EMP.ENAME || '的工号是:' || v_EMP.EMPNO || '岗位是:' || v_EMP.JOB);

  • END;



好课推荐: Oracle认证


Oracle数据库是甲骨文公司推出的一个数据库管理系统。也是目前世界上使用最为广泛的数据库管理系统。一个OCP工程师不仅仅可以从事DBA,还可以进—步进行学习成为ERP实施、中间件管理、B(商业智能)等企业最高薪酬的IT类专家。


课程详情


学习资料



 更多学习关注微思专栏【数据库技术

2.gif


返回顶部