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;

SELECT * FROM dept;

 

时间: 2024-12-08 18:25:24

PL/SQL基础2(笔记)的相关文章

Oracle PL/SQL随堂笔记总结

1.pl/sql编程 1.理解oracle的pl/sql的概念    2.掌握pl/sql编程技术(过程.函数.触发器)    pl/sql是标准sql语句的扩展    简介        1.过程.函数.触发器都是由pl/sql编写        2.过程.函数.触发器是在oracle中        3.pl/sql是非常强大的过程语言        4.过程.函数等可以在java程序被调用    学习必要性:        1.提高应用程序的性能        2.模块化的设计思想    

Oracle实践--PL/SQL基础之同义词和序列

PL/SQL基础入门之同义词和序列             PL/SQL:过程语言(Procedure  Language)和结构化语言(Structured Query Language)结合而成的编程语言,是对SQL的扩展,支持多种数据类型,如大对象和集合类型,可使用条件和循环等控制语句,可创建存储过程,程序包和触发器等,给sql语句的执行添加程序逻辑,与Oracle服务器和Oracle工具紧密集成,具有可移植性,灵活性和安全性. 同义词: /*     同义词:现有对象的一个别名:    

Oracle实践--PL/SQL基础之表分区

PL/SQL基础入门之表分区 PL/SQL:过程语言(Procedure  Language)和结构化语言(Structured Query Language)结合而成的编程语言,是对SQL的扩展,支持多种数据类型,如大对象和集合类型,可使用条件和循环等控制语句,可创建存储过程,程序包和触发器等,给sql语句的执行添加程序逻辑,与Oracle服务器和Oracle工具紧密集成,具有可移植性,灵活性和安全性. ---------------------------------------------

Oracle实践--PL/SQL基础之代码块

PL/SQL基础入门之代码块 PL/SQL:过程语言(Procedure  Language)和结构化语言(Structured Query Language)结合而成的编程语言,是对SQL的扩展,支持多种数据类型,如大对象和集合类型,可使用条件和循环等控制语句,可创建存储过程,程序包和触发器等,给sql语句的执行添加程序逻辑,与Oracle服务器和Oracle工具紧密集成,具有可移植性,灵活性和安全性. 优点: 1.       支持SQL,可以使用:DML,DCL,游标控制和SQL运算符 2

Oracle实践--PL/SQL基础之游标

PL/SQL基础入门之游标 PL/SQL:过程语言(Procedure  Language)和结构化语言(Structured Query Language)结合而成的编程语言,是对SQL的扩展,支持多种数据类型,如大对象和集合类型,可使用条件和循环等控制语句,可创建存储过程,程序包和触发器等,给sql语句的执行添加程序逻辑,与Oracle服务器和Oracle工具紧密集成,具有可移植性,灵活性和安全性. ----------------------------------------------

Oracle实践--PL/SQL基础之视图和索引

PL/SQL基础入门之视图和索引         PL/SQL:过程语言(Procedure  Language)和结构化语言(Structured Query Language)结合而成的编程语言,是对SQL的扩展,支持多种数据类型,如大对象和集合类型,可使用条件和循环等控制语句,可创建存储过程,程序包和触发器等,给sql语句的执行添加程序逻辑,与Oracle服务器和Oracle工具紧密集成,具有可移植性,灵活性和安全性. -----------------------------------

PL/SQL 基础知识简介

1.PL/SQL代码块 PL/SQL 代码块是指令的集合,支持所有的DML,NDS,DBMS_SQL,DDL. :DML 是数据操纵语言(Data Manipulation Language)包括,Insert ,update,delete : DDL是数据定义语言(Data Definition Language ),包括,Alter,create,drop,truncate,Grant,revoke : NDS本地动态SQL(Native Dynamic SQL) 2.PL/SQL代码块结构

Oracle实践--PL/SQL基础之存储过程

PL/SQL基础之存储过程 存储过程:过程是用于完成特定任务的子程序(代码的集合) /* 子程序的优点:1.模块化,将程序分解为逻辑模块: 2.可重用性,可以被任意数目的程序调用: 3,可维护性,简化维护操作: 4.安全性:通过设置权限,使数据更安全 */ --存储过程1,打印HelloWorld create or replace procedure my_pro is --用于声明一些变量 v_string varchar2(20) :='helloworld!'; begin dbms_o

Oracle实践--PL/SQL基础之函数

PL/SQL基础之函数 /* 函数:可以有返回值得命名的PL/SQL子程序,必须有返回值 关键字:function return */ --函数1 create or replace function helloworld return varchar2--指定返回类型,不能给定长度 as v_hello varchar2(50); begin v_hello :='helloworld!'; return v_hello;--不可少的return end; --函数调用方式: select h

Oracle实践--PL/SQL基础之触发器和程序包

PL/SQL基础之触发器和程序包  程序包 /* 程序包:对相关存储过程,函数,变量,游标和异常等对象的封装 有声明和主体组成 优点:1.模块化:2.更轻松的应用程序设计;3.信息隐藏;4.性能更佳 */ --程序包的声明:关键字:package is end create or replace package my_pack as procedure packageTest(v_num number); end my_pack;--也可以是 end; --程序包的主体 create or re