学习笔记
一、程序代码块
1.语法结构
--语法结构
DECLARE
--声明的地方(声明变量、常量、游标等等),这一块可以省略
BEGIN
-- 代码执行的逻辑块
EXCEPTION
--处理异常的逻辑
END;
--程序结束声明
BEGIN
DBMS_OUTPUT.put_line('HELLO WORLD');
END;
一切语言都从hello world开始;
注:1.每写完一行代码后记得加上分号;
2.end最后一定要加上分号作为结束。
2.变量
(1)通过给定变量查询
DECLARE
V_EMPNO NUMBER;
V_ENAME VARCHAR2(30);
V_SAL NUMBER;
BEGIN
V_EMPNO :=7369; --注意赋值语法
SELECT T.ENAME,T.SAL
INTO V_ENAME,V_SAL
/* SELECT T.ENAME 变量插入数据要对应
INTO V_ENAME
*/
FROM EMP T
WHERE T.EMPNO = V_EMPNO;
DBMS_OUTPUT.put_line(V_EMPNO||' '||V_ENAME||' '||V_SAL);
END;
定义变量需要注意的事:
变量命名规则,一般都是 V_ 开头
1.声明/定义变量的时候,如果定义的是varchar类型的,那必须要给长度,
如果number类型的数据,可以给也可以不给,
如果是date类型的数据,就不用给长度;
2、定义了变量的长度之后,给这个变量赋值时不能超过该长度;
3、定义了什么类型的变量,赋值的时候就要赋什么类型的值;
4、定义了一个变量,结尾需要分号表示结束。
SELECT … INTO … 需要注意的点:
1、我们查询的结果 必须是一行数据 ,不能是0行或者多行;
2、INTO后面接的是变量,用处是将SELECT后查询出来的字段/列分别依次放到变量中;
3、INTO后面接的变量的顺序跟个数必须和SELECT后接的查询的字段的顺序和个数保持一致 。
eg:接收一个员工的编号(7788),将员工的姓名,
岗位,入职日期打印出来(DBMS_OUTPUT.put_line)
DECLARE
V_EMPNO NUMBER;
V_ENAME VARCHAR2(10);
V_JOB VARCHAR2(9);
V_HIREDATE DATE;
BEGIN
V_EMPNO := 7788;
SELECT E.ENAME
,E.JOB
,E.HIREDATE
INTO V_ENAME
,V_JOB
,V_HIREDATE
FROM EMP E
WHERE V_EMPNO = E.EMPNO;
DBMS_OUTPUT.put_line(V_ENAME);
DBMS_OUTPUT.put_line(V_JOB);
DBMS_OUTPUT.put_line(V_HIREDATE); --美式日期,日月年
DBMS_OUTPUT.put_line(TO_CHAR(V_HIREDATE,'YYYY-MM-DD DAY'));
--限定格式输出,加上星期几
END;
(2)通过输入变量查询(使用&符号)
DECLARE
V_EMPNO NUMBER;
V_ENAME VARCHAR2(10);
V_JOB VARCHAR2(9);
V_HIREDATE DATE;
BEGIN
--& 这个符号的作用就是弹出一个数据传入窗口,
--后面跟的文本信息“input_empno”时作为一个提示信息
V_EMPNO := &input_empno;
SELECT E.ENAME
,E.JOB
,E.HIREDATE
INTO V_ENAME
,V_JOB
,V_HIREDATE
FROM EMP E
WHERE V_EMPNO = E.EMPNO;
DBMS_OUTPUT.put_line(V_ENAME);
DBMS_OUTPUT.put_line(V_JOB);
DBMS_OUTPUT.put_line(V_HIREDATE); --美式日期,日月年
DBMS_OUTPUT.put_line(TO_CHAR(V_HIREDATE,'YYYY-MM-DD DAY'));
--限定格式输出,加上星期几
END;
SELECT * FROM EMP;
注意:
- 手动输入类型的时候输入数据的时候应该注意输入的类型
- 如输入VARCHAR2类型的时候应该加上单引号,
- 输入date类型的时候应该使用to_date函数,不能直接输入number类型的数据
eg:
DECLARE
V_STR VARCHAR2(30);
V_DATE DATE;
V_NUM NUMBER;
BEGIN
V_STR := &INPUT_STR; --输入的时候要加上单引号
V_DATE := &INPUT_DATE; --输入的时候要转换为日期类型
--to_date()函数
V_NUM := &INPUT_NUM;
DBMS_OUTPUT.put_line(V_STR);
DBMS_OUTPUT.put_line(V_DATE);
DBMS_OUTPUT.put_line(V_NUM);
END;
eg:根据输入的员工编号,输出员工的奖金,若为空则输出0;
DECLARE
V_EMPNO VARCHAR2(4);
V_COMM NUMBER;
BEGIN
V_EMPNO := &input_empno;
SELECT E.COMM
INTO V_COMM
FROM EMP E
WHERE E.EMPNO = V_EMPNO;
DBMS_OUTPUT.put_line(NVL(V_COMM,0));
END;
(3)变量声明类型
- %type
- %rowtype
- 常量 constant
a.%type
- %type : 可以用来确定数据类型
eg:根据输入的员工编号,输出员工的奖金,若为空则输出0;
DECLARE
V_EMPNO EMP.EMPNO%TYPE;
V_COMM EMP.COMM%TYPE;
BEGIN
V_EMPNO := &input_empno;
SELECT E.COMM
INTO V_COMM
FROM EMP E
WHERE E.EMPNO = V_EMPNO;
DBMS_OUTPUT.put_line(NVL(V_COMM,0));
END;
b.%rowtype
- %rowtype:引用数据库中的一个表所有字段的数据类型和长度;
eg:根据输入的员工编号,输出员工的奖金,若为空则输出0;
DECLARE
V_EMP EMP%ROWTYPE;
BEGIN
V_EMP.EMPNO := &input_empno;
SELECT E.COMM
INTO V_EMP.COMM
FROM EMP E
WHERE E.EMPNO = V_EMP.EMPNO;
DBMS_OUTPUT.put_line(NVL(V_EMP.COMM,0));
END;
注意:
- 当使用%rowtype时,相当于使用了一整张表的字段名作为变量进行了变量的声明,使用变量的时候要注意使用对应字段的变量名称(即使用 V_EMP.字段名 来调用),这里如果不采用这种形式来调用或者有漏写一两个字符就会报错;
eg:用%TYPE声明变量类型, 打印出工号为 7698 的工作, 名字 部门编号;
DECLARE
V_EMPNO EMP.EMPNO%TYPE := 7698;
V_ENAME EMP.ENAME%TYPE;
V_DEPTNO EMP.DEPTNO%TYPE;
BEGIN
SELECT E.ENAME
,E.DEPTNO
INTO V_ENAME
,V_DEPTNO
FROM EMP E
WHERE E.EMPNO = V_EMPNO;
DBMS_OUTPUT.put_line(V_ENAME);
DBMS_OUTPUT.put_line(V_DEPTNO);
END;
eg:用%ROWTYPE声明变量类型,打印出工号为 7698 的工作, 名字 部门编号;
DECLARE
V_EMP EMP%ROWTYPE;
BEGIN
V_EMP.EMPNO := 7698;
SELECT E.JOB
,E.ENAME
,E.DEPTNO
INTO V_EMP.JOB
,V_EMP.ENAME
,V_EMP.DEPTNO
FROM EMP E
WHERE V_EMP.EMPNO = E.EMPNO;
DBMS_OUTPUT.put_line(V_EMP.JOB);
DBMS_OUTPUT.put_line(V_EMP.ENAME);
DBMS_OUTPUT.put_line(V_EMP.DEPTNO);
END;
c.常量(CONSTANT)
常量在声明时赋予初值,整个生命周期内不能再进行更改;
- 使用的时候用 CONSTANT 关键字声明常量;
eg:计算圆的面积;
DECLARE
PI CONSTANT NUMBER := 3.14; --圆周率长值 ①
R NUMBER := 3; --圆的半径默认值3 ②
--R NUMBER := 3;
AREA NUMBER; --面积。
BEGIN
R := 5;
AREA := PI * R * R; --计算面积 78.5
DBMS_OUTPUT.PUT_LINE(AREA); --输出圆的面积 78.5
R := 6;
AREA := PI * R * R; --计算面积 113.04
DBMS_OUTPUT.PUT_LINE(AREA); --输出圆的面积
END;