PL/SQL基础2(笔记)
1 第一个PL/SQL的程序
DECLARE
BEGIN
DBMS_OUTPUT.PUT_LINE('Hello World!');
END;
/
--2一个简单的PL/SQL程序
DECLARE
v_num NUMBER;
BEGIN
v_num:=30;
dbms_output.put_line('v_num变量内容是:'||v_num);
END;
/
--3输入 一个员工编号,而后取得员工姓名
DECLARE
v_eno NUMBER:=&ID;
v_ename VARCHAR2(20);
BEGIN
SELECT ename INTO v_ename
FROM emp
WHERE empno=v_eno;
dbms_output.put_line('编号为:'||v_eno||' 员工姓名:'||v_ename);
END;
/
--变量的声明与赋值%type和%rowtype的使用
--定义变量不设置默认值
DECLARE
v_result VARCHAR2(30); --只声明变量没有内容
BEGIN
dbms_output.put_line('v_result的内容:'||v_result );
END;
/
--5加法
DECLARE
v_resultA NUMBER:=100; --只声明变量没有内容
v_resultB NUMBER;
BEGIN
v_resultB:=30;
dbms_output.put_line('加法'||(v_resultA+v_resultB) );
END;
/
--定义非空
DECLARE
v_resultA NUMBER NOT NULL:=100; --只声明变量没有内容
BEGIN
dbms_output.put_line('v_resultA:'||v_resultA );
END;
/
--定义非空
DECLARE
v_resultA NUMBER NOT NULL; --只声明变量没有内容
BEGIN
dbms_output.put_line('v_resultA:'||v_resultA );
END;
/
--定义常量
DECLARE
v_resultA CONSTANT NUMBER NOT NULL:=100; --使用CONSTANT关键字定义常量
BEGIN
dbms_output.put_line('v_resultA:'||v_resultA );
END;
/
--常量不能改变
DECLARE
v_resultA CONSTANT NUMBER NOT NULL:=100; --使用CONSTANT关键字定义常量
BEGIN
v_resultA:=20;
dbms_output.put_line('v_resultA:'||v_resultA );
END;
/
--如果希望与指定数据表中某一列的类型一样,则可以使用 变量名 表名称。字段名称%TYPE 的格式定义
DECLARE
v_eno emp.empno%TYPE; --与empno类型相同
v_ename emp.ename%TYPE; --与ename类型相同
BEGIN
dbms_output.put_line('请输入员工编号:');
v_eno:=&empno; --由键盘输入员工编号
SELECT ename INTO v_ename FROM emp WHERE empno=v_eno;
dbms_output.put_line('编号为:'||v_eno||'员工姓名: '||v_ename);
END;
/
--还可以使用%ROWTYPE 标记定义表中一行的记录类型
--使用ROWTYPE装载一行记录
DECLARE
v_deptROW dept%ROWTYPE ; ---装载一行的dept记录
BEGIN
SELECT * INTO v_deptRow FROM dept WHERE deptno=10;
dbms_output.put_line('部门编号'||v_deptRow.deptno||' 部门名称:'||v_deptRow.dname||' 部门位置'||v_deptRow.loc);
END;
/
--************运算符
--赋值运算符 变量:=表达式
DECLARE v_info VARCHAR2(50):='欢迎使用Oracle数据库'; vurl VARCHAR2(50); BEGIN vurl :='www.163.com'; dbms_output.put_line(v_info); dbms_output.put_line(v_url); END; /
连接运算符
使用”||”完成操作
DECLARE v_info VARCHAR2(50):='欢迎使用Oracle数据库'; v_url VARCHAR2(50); BEGIN v_url :='www.163.com'; dbms_output.put_line(v_info ||'网址'|| v_url); END; /
--关系运算符
--关系运算符>,<,>=,<=,=,!=,<>
--判断NULL IS NULL ,IS NOT NULL
--范围查询 BETWEEN 最小值 AND最大值
--范围查询 IN
--模糊查询LIKE
DECLARE
v_url VARCHAR2(50):='www.163.com';
v_num1 NUMBER:=80;
v_num2 NUMBER:=30;
BEGIN
IF v_num1>v_num2 THEN
dbms_output.put_line('第一个数字比第二个数字大');
END IF;
IF v_url LIKE '%163%' THEN
dbms_output.put_line('网址中包含163的字样');
END IF;
END;
/
--逻辑运算符 AND RO NOT
DECLARE
v_flag1 BOOLEAN:=TRUE;
v_flag2 BOOLEAN:=FALSE;
v_flag3 BOOLEAN;
BEGIN
IF v_flag1 AND (NOT v_flag2) THEN
dbms_output.put_line('v_flage1 AND (NOT v_flag2)=TRUE');
END IF;
IF v_flag1 OR v_flag3 THEN
dbms_output.put_line('v_flage1 OR v_flag3=TRUE');
END IF;
IF v_flag1 AND v_flag3 IS NULL THEN
dbms_output.put_line('v_flage1 AND v_flag3 的结果为NULL');
END IF;
END;
/
---数值型
--使用NUMBER变量
DECLARE
v_x NUMBER(3); --最多只能为3位数字
v_y NUMBER(5,2) ;--3位整数,2 位小灵敏
BEGIN
v_x:=-500;
v_y:=999.88;
dbms_output.put_line('v_x'||v_x);
dbms_output.put_line('v_y'||v_y);
dbms_output.put_line('v_x+v_x'|| (v_x+v_y));
END;
/
--BINARY_INTEGER与 PLS_INTEGER(-2147483648---2147483647)
--BINARY_INTEGER与 PLS_INTEGER具有相同的范围长度,与NUMBER相比较其所占用的范围更小,
--在数学计算时,NUMBER保存为十进制,需要先转换为二进制后才可以说进行计算,
----BINARY_INTEGER与 PLS_INTEGER采用二进制的补码形式存储,所以性能上要比NUMBER高
--但是--BINARY_INTEGER与 PLS_INTEGER还是有区别的
--当--BINARY_INTEGER操作的数大于其数据范围里会变为NUMBER,
--PLS_INTEGER操作的数大于其数据范围里会抛出异常
DECLARE
v_pls1 PLS_INTEGER:=100;
v_pls2 PLS_INTEGER:=200;
v_result PLS_INTEGER;
BEGIN
v_result:=v_pls1+v_pls2;
dbms_output.put_line('计算结果:'||v_result);
END;
--字符型
--char和VARCHAR2
DECLARE
v_info_char CHAR(10);
v_info_varchar VARCHAR2(10);
BEGIN
v_info_char:='bdqn';
v_info_varchar:='java';
dbms_output.put_line('v_info_char内容长度:'||LENGTH(v_info_char));
dbms_output.put_line('v_info_varchar内容长度:'||LENGTH(v_info_varchar));
END;
--Nchar和NVARCHAR2
DECLARE
v_info_char NCHAR(10);
v_info_varchar NVARCHAR2(10);
BEGIN
v_info_char:='bdqn';
v_info_varchar:='java';
dbms_output.put_line('v_info_char内容长度:'||LENGTH(v_info_char));
dbms_output.put_line('v_info_varchar内容长度:'||LENGTH(v_info_varchar));
END;
NCHAR和NVARCHAR2保存数据为UNICODE编码,中文或者英文都会变为十六进制保存,但是浪费空间
--日期型
--date数据
--定义DATE型变量
DECLARE
v_date1 DATE:=SYSDATE;
v_date2 DATE:=SYSTIMESTAMP;
v_date3 DATE:='23-9月-1984';
BEGIN
dbms_output.put_line('日期数据 :'|| to_char(v_date1,'yyyy-mm-dd hh24:mi:ss'));
dbms_output.put_line('日期数据 :'|| to_char(v_date2,'yyyy-mm-dd hh24:mi:ss'));
dbms_output.put_line('日期数据 :'|| to_char(v_date3,'yyyy-mm-dd hh24:mi:ss'));
END;
--定义TIMESTAMP
DECLARE
v_date1 TIMESTAMP:=SYSDATE;
v_date2 TIMESTAMP:=SYSTIMESTAMP;
v_date3 TIMESTAMP:='23-9月-1984';
BEGIN
dbms_output.put_line('日期数据 :'|| v_date1);
dbms_output.put_line('日期数据 :'|| v_date2);
dbms_output.put_line('日期数据 :'|| v_date3);
END;
-- --if
DECLARE
v_countResult NUMBER;
BEGIN
SELECT COUNT(*) INTO v_countResult FROM emp;
IF v_countResult>10 THEN
dbms_output.put_line('EMP表记录大于10条');
END IF;
END;
--IF ELSE
DECLARE
v_countResult NUMBER;
BEGIN
SELECT COUNT(*) INTO v_countResult FROM dept;
IF v_countResult>10 THEN
dbms_output.put_line('DEPT表记录大于10条');
ELSE
dbms_output.put_line('DEPT表记录小于10条');
END IF;
END;
--IF ELSIF ...ELSE
DECLARE
V_COUNTRESULT NUMBER;
BEGIN
SELECT COUNT(*) INTO V_COUNTRESULT FROM EMP;
IF V_COUNTRESULT > 10 THEN
DBMS_OUTPUT.PUT_LINE('EMP表记录大于10条');
ELSIF V_COUNTRESULT < 10 THEN
DBMS_OUTPUT.PUT_LINE('EMP表记录小于10条');
ELSE
DBMS_OUTPUT.PUT_LINE('EMP表记录等于于10条');
END IF;
END;
--查询EMP表的工资,输入员工编号,根据编号查询工资,如果工资高于3000,则显示高工资
--大于2000,中等工资,小于2000,显示低工资
DECLARE
V_ENO EMP.EMPNO%TYPE;
V_EMPSAL EMP.SAL%TYPE;
V_EMPNAME EMP.ENAME%TYPE;
BEGIN
V_ENO := &EMPNO;
SELECT ENAME, SAL INTO V_EMPNAME, V_EMPSAL FROM EMP WHERE EMPNO = V_ENO;
IF V_EMPSAL > 3000 THEN
DBMS_OUTPUT.PUT_LINE(V_EMPNAME || '工资是高工资');
ELSIF V_EMPSAL > 2000 THEN
DBMS_OUTPUT.PUT_LINE(V_EMPNAME || '工资是中等工资');
ELSE
DBMS_OUTPUT.PUT_LINE(V_EMPNAME || '工资是低工资');
END IF;
END;
--用户输入 一个员工编号,根据它所在的部门给上涨工资
--10部门上涨10%,20部门20%,30上涨30%
--要求最高不能超过5000元,起过5000元就停留在5000;
DECLARE
v_id emp.empno%TYPE:=&empno; --用户输入编号
v_deptno emp.deptno%TYPE; --变量部门编号
v_sal emp.sal%TYPE ; --变量工资
BEGIN
SELECT deptno ,sal INTO v_deptno,v_sal FROM emp WHERE empno=v_id;
IF v_deptno=10 THEN
IF v_sal*1.1>5000 THEN
dbms_output.put_line(v_id||'涨工资后'|| 5000||'元');
ELSE
dbms_output.put_line(v_id||'涨工资后'||v_sal*1.1);
END IF;
ELSIF v_deptno=20 THEN
IF v_sal*1.2>5000 THEN
dbms_output.put_line(v_id||'涨工资后'|| 5000||'元');
ELSE
dbms_output.put_line(v_id||'涨工资后'||v_sal*1.2);
END IF;
ELSIF v_deptno=30 THEN
IF v_sal*1.3>5000 THEN
dbms_output.put_line(v_id||'涨工资后'|| 5000||'元');
ELSE
dbms_output.put_line(v_id||'涨工资后'||v_sal*1.3);
END IF;
ELSE
NULL;
END IF;
END;
--循环
--loop循环
DECLARE
v_i NUMBER:=1;
BEGIN
LOOP
dbms_output.put_line(v_i);
v_i:=v_i+1;
EXIT WHEN v_i>8;
END LOOP;
END;
--WHILE..loop
DECLARE
v_i NUMBER:=1;
BEGIN
WHILE v_i<15 LOOP
dbms_output.put_line(v_i);
v_i:=v_i+1;
END LOOP;
END;
---for 循环
DECLARE
v_i NUMBER;
BEGIN
FOR v_i IN 1..18 LOOP
dbms_output.put_line(v_i);
END LOOP;
END;
--使用REVERSE递减
DECLARE
v_i NUMBER;
BEGIN
FOR v_i IN REVERSE 1..18 LOOP
dbms_output.put_line(v_i);
END LOOP;
END;
--循环控制
--使用EXIT退出
DECLARE
v_i NUMBER;
BEGIN
FOR v_i IN 1..10 LOOP
IF v_i=6 THEN
EXIT;
END IF;
dbms_output.put_line(v_i);
END LOOP;
END;
--使用contiune结束当次循环
DECLARE
v_i NUMBER;
BEGIN
FOR v_i IN 1..10 LOOP
IF mod(v_i,2)=0 THEN
CONTINUE;
END IF;
dbms_output.put_line(v_i);
END LOOP;
END;
---嵌套语法
DECLARE
声明部分
BEGIN
程序执行部分,
DECLARE
声明部分
BEGIN
程序执行部分,
EXECPTION
异常处理部分
END;
EXECPTION
异常处理部分
END;
--定义内部程序块
DECLARE
v_x NUMBER:=30;
BEGIN
DECLARE
v_x VARCHAR2(40):='JAVA 学习';
v_y NUMBER:=20;
BEGIN
dbms_output.put_line('内部程序块输出v_x= '||v_x);
dbms_output.put_line('内部程序块输出v_y= '||v_y);
END;
dbms_output.put_line('外部程序块输出v_x= '||v_x);
END;
--异常
DECLARE
v_dno dept.deptno%TYPE:=&deptno; --部门编号
v_dna dept.dname%TYPE:='&dname'; ---部门名称
v_dloc dept.loc%TYPE:='&loc'; -- 部门位置
v_deptCount NUMBER; --保存count()函数的结果
BEGIN
SELECT COUNT(deptno) INTO v_deptCount FROM dept WHERE deptno=v_dno;
IF v_deptCount > 0 THEN
raise_application_error(-20888,'此部门编号已经存在,请重新输入 ');
ELSE
INSERT INTO dept(deptno,dname,loc)VALUES(v_dno,v_dna,v_dloc);
dbms_output.put_line('新增加部门成功');
COMMIT;
END IF;
EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line(SQLERRM);
ROLLBACK;
END;
PL/SQL基础2(笔记)的更多相关文章
- Oracle PL/SQL随堂笔记总结
1.pl/sql编程 2.存储过程 3.函数 4.触发器 5.包 6.pl/sql基础 -定义并使用变量 7.pl/sql的进阶 8.oracle的视图 1.pl/sql编程 1.理解oracle的p ...
- Oracle实战笔记(第六天)之PL/SQL基础
一.PL/SQL介绍 1.概念 PL/SQL也是一种程序语言,叫做过程化SQL语言(Procedural Language/SQL).PL/SQL是Oracle数据库对SQL语句的扩展.在普通SQL语 ...
- PL/SQL基础1(笔记)
--基本结构DECLARE--变量声明部分:在此声明PL/SQL用到的变量,类型,游标,以及局部的存储过程和函数BEGIN --执行部分:过程及SQL语句,即程序的主要部分 EXCEPTION --执 ...
- 慕课网笔记之oracle开发利器-PL/SQL基础
实例1--if语句 /* 慕课网Oracle数据库开发必备之PL/SQL_2-3 判断用户从键盘输入的数字 1.如何使用if语句 2.接收一个键盘的输入(字符串) */ set serveroutpu ...
- Oracle442个应用场景---------PL/SQL基础
----------------------------------------------------------------------------------- 备份和恢复数据库略过.在后面解说 ...
- Oracle数据库之PL/SQL基础
介绍PL/SQL之前,先介绍一个图像化工具:Oracle SQL Developer 在oracle的开发过程中, 我们难免会使用第三方开发的软件来辅助我们书写SQL, pl/sql是一个不错的sql ...
- PL\SQL 随学笔记
一.在PL\SQL语句块begin...end;中,不能直接使用select,必须与into结合查询. 例如: declare aa:=22; id2 integer; begin select * ...
- PL SQL 基础
Oracle之PL/SQL学习笔记 自己在学习Oracle是做的笔记及实验代码记录,内容挺全的,也挺详细,发篇博文分享给需要的朋友,共有1w多字的学习笔记吧.是以前做的,一直在压箱底,今天拿出来整 ...
- PL/SQL基础知识
Oracle之PL/SQL学习笔记 自己在学习Oracle是做的笔记及实验代码记录,内容挺全的,也挺详细,发篇博文分享给需要的朋友,共有1w多字的学习笔记吧.是以前做的,一直在压箱底,今天拿出来整理了 ...
随机推荐
- 使用JavaScript判断用户是否为手机设备
最近在做微信服务号开发,其中遇到一个问题是微信服务号查看的个人的消息,如果点击在浏览器中查看(iOS中是在Safari中打开)应该是跳转到登录页面,因为页面需要从后台获取,因为需要服务端判断,如果是存 ...
- [Git] 快速签出与更新所有远程分支.md
git-fetch 命令从远程仓库复制 heads 和 tags 信息到本地,保存在临时文件 .git/FETCH_HEAD 中以备 git-merge 命令使用. 你可以使用 git fetch 命 ...
- STL中vector小结
()使用vector之前必须包含头文件<vector>:#include<vector> ()namespace std{ template <class T, clas ...
- codeforces C. Diverse Permutation(构造)
题意:1...n 的全排列中 p1, p2, p3....pn中,找到至少有k个 |p1-p2| , |p2-p3|, ...|pn-1 - pn| 互不相同的元素! 思路: 保证相邻的两个数的差值的 ...
- 2014 网选 5007 Post Robot(暴力或者AC_自动机(有点小题大作了))
//暴力,从每一行的开始处开始寻找要查询的字符 #include<iostream> #include<cstdio> #include<cstring> #inc ...
- 【原创】C#搭建足球赛事资料库与预测平台(5) 赔率数据表设计1
本博客所有文章分类的总目录:http://www.cnblogs.com/asxinyu/p/4288836.html 开源C#彩票数据资料库系列文章总目录:http://www.cn ...
- 在腾讯开发应用中心上架apk所遇到的问题
这篇只是为了记录我走过的弯路,和判断错误的方法 首先当我用 keyStore打包apk的时候,程序没有报任何错误,当然也可以运行: 接下来就是上传该apk吧: 等上传完了,就报解析错误.如下.: aa ...
- 自定义UICollectionViewController之后 如何设置UICollectionView的布局方式
我们很多时候使用UICollectionView 可能都是直接创建 UICollectionView 通过初始化的时候 传入一个布局对象的方式来使用UICollectionView 比如我们之前 ...
- Spring基础——在 IOC 容器中 Bean 之间的关系
一.在 Spring IOC 容器中 Bean 之间存在继承和依赖关系. 需要注意的是,这个继承和依赖指的是 bean 的配置之间的关系,而不是指实际意义上类与类之间的继承与依赖,它们不是一个概念. ...
- 订餐APP第一次sprint+燃尽图
MY-HR 成员: 角色分配 学号 博客园 团队贡献分 丘惠敏 PM项目经理 201406114203 http://www.cnblogs.com/qiuhuimin/ 19 郭明茵 用户 2014 ...