文档视界 最新最全的文档下载
当前位置:文档视界 › 第三章 PLSQL编程(上机操作)

第三章 PLSQL编程(上机操作)

第三章 PLSQL编程(上机操作)
第三章 PLSQL编程(上机操作)

第三章PL/SQL编程(技能训练)

上机练习1

1.计算某雇员应缴纳的所得税

declare

shuilu NUMBER(2);

susuankouchulu NUMBER(5);

v_tax NUMBER(10,2);

gongzi NUMBER(10,2);

gongziqizhengdian CONSTANTNUMBER(10):=3500;

begin

select sal into gongzi

from emp

where ename='KING';

v_tax:=0;

if(gongzi>=3500)then

gongzi:=gongzi-gongziqizhengdian;

case

when gongzi<1500then shuilu:=3;susuankouchulu:=0;

when gongzi<4500and gongzi>=1500then shuilu:=10;susuankouchulu:=105; when gongzi<9000and gongzi>=4500then shuilu:=20;susuankouchulu:=555; when gongzi<35000and gongzi>=9000then shuilu:=25;susuankouchulu:=1005; when gongzi<55000and gongzi>=35000then shuilu:=30;susuankouchulu:=2755; when gongzi<80000and gongzi>=55000then shuilu:=35;susuankouchulu:=5505; else shuilu:=45;susuankouchulu:=13505;

endcase;

v_tax:=gongzi*shuilu/100-susuankouchulu;

endif;

dbms_output.put_line('king应缴纳的所得税是'||v_tax);

end;

2.更新某雇员的薪水

declare

nianxianjiangjin NUMBER(10,2);

ruzhishijianemp.hiredate%TYPE;

begin

select hiredate into ruzhishijian

from emp

where ename='SCOTT';

if(sysdate-ruzhishijian>=356*6)then

nianxianjiangjin:=2000;

else

nianxianjiangjin:=1500;

endif;

update emp

set sal=nianxianjiangjin

where ename='SCOTT';

end;

修改后

3.显示某雇员相应的工资级别并显示所在部门名称、薪水和所在级别

declare

jibie NUMBER(1);

bumenNamedept.dname%TYPE;

xinshuiemp.sal%TYPE;

begin

select dname,sal into bumenName,xinshui

from emp e innerjoin dept d

on e.deptno=d.deptno

where ename='SCOTT';

case

when xinshui<=3200and xinshui>=700then jibie:=1;

when xinshui<=4400and xinshui>=3201then jibie:=2;

when xinshui<=5000and xinshui>=4401then jibie:=3;

when xinshui<=7000and xinshui>=5001then jibie:=4;

when xinshui<=9999and xinshui>=7001then jibie:=5;

endcase;

dbms_output.put_line('SCOTT所在部门是'||bumenName||'薪水'||xinshui||'级别'||jibie); end;

4.为某雇员增加工资,每次增加100元,直到10000元停止declare

gongziemp.sal%TYPE;

begin

select sal into gongzi

from emp

where ename='SCOTT';

loop

gongzi:=gongzi+100;

exitwhen gongzi=10000;

endloop;

update emp

set sal=gongzi

where ename='SCOTT';

end;

PL/Sql语句执行后,修改后的数据

上机练习2

DECLARE

v_ename varchar2(4);

BEGIN

SELECT ename INTO v_ename

FROM emp

WHERE empno=1234;

dbms_output.put_line('雇员名:'||v_ename);

EXCEPTION

WHEN NO_DATA_FOUND THEN

dbms_output.put_line('雇员号不存在');

WHEN value_error THEN

dbms_output.put_line('姓名长度超过4位');

WHENOTHERSTHEN

dbms_output.put_line('错误号:'||SQLCODE||'错误描述:'||SQLERRM);

END;

DECLARE

v_ename varchar2(4);

BEGIN

SELECT ename INTO v_ename

FROM emp

WHERE empno=7654;

dbms_output.put_line('雇员名:'||v_ename);

EXCEPTION

WHEN NO_DATA_FOUND THEN

dbms_output.put_line('雇员号不存在');

WHEN value_error THEN

dbms_output.put_line('姓名长度超过4位');

WHENOTHERSTHEN

dbms_output.put_line('错误号:'||SQLCODE||'错误描述:'||SQLERRM); END;

上机练习3

DECLARE

v_salemp.sal%TYPE;

v_deptnoemp.deptno%TYPE;

e_comm_is_null EXCEPTION;--定义异常类型变量

BEGIN

SELECT sal,deptno INTO v_sal,v_deptno

FROM emp

WHERE empno=7788;

IF v_deptno=10THEN

IF v_sal<10000THEN

UPDATE emp

SET sal=10000

WHERE empno=7788;

ELSE

RAISE e_comm_is_null;

ENDIF;

ENDIF;

EXCEPTION

WHEN NO_DATA_FOUND THEN

dbms_output.put_line('雇员不存在!错误为:'||SQLCODE||SQLERRM); WHEN e_comm_is_null THEN

dbms_output.put_line('工资不低于10000元');

WHENothersTHEN

dbms_output.put_line('出现其他异常');

END;

解释1:

以empno为7788为例,因为部门是“20”,则不显示

解释2:

修改代码:

DECLARE

BEGIN

SELECT sal,deptno INTO v_sal,v_deptno

FROM emp

WHERE empno=7782;

IF v_deptno=10THEN

IF v_sal<10000THEN

UPDATE emp

SET sal=10000

WHERE empno=7782;

ELSE

RAISE e_comm_is_null;

ENDIF;

ENDIF

EXCEPTION

END;

以empno为7782为例,因为部门是“10”,sal〈10000,做更新处理,不抛异常。

解释3:

再次执行以上的代码,因为部门是“10”,sal=10000,抛出异常,显示消息“工资不低于10000元”

解释4:

修改代码:

DECLARE

BEGIN

SELECT sal,deptno INTO v_sal,v_deptno

FROM emp

WHERE empno=3782;

IF v_deptno=10THEN

IF v_sal<10000THEN

UPDATE emp

SET sal=10000

WHERE empno=3782;

ELSE

RAISE e_comm_is_null;

ENDIF;

ENDIF

EXCEPTION

END;

再次执行以上的代码,因为empno为3782的雇员不存在,抛出异常

上机练习4

1.使用游标计算所有雇员应缴纳的所得税

declare

shuilu NUMBER(2);

susuankouchulu NUMBER(5);

v_tax NUMBER(10,2);

gongzi NUMBER(10,2);

v_sum NUMBER(10,2):=0;

gongziqizhengdian CONSTANTNUMBER(10):=3500;

CURSOR emp_cursor IS

SELECT sal

FROM emp;

begin

OPEN emp_cursor;

loop

fetch emp_cursor into gongzi;

EXITWHEN emp_cursor%NOTFOUND;

v_tax:=0;

if(gongzi>=3500)then

gongzi:=gongzi-gongziqizhengdian;

case

when gongzi<1500then shuilu:=3;susuankouchulu:=0;

when gongzi<4500and gongzi>=1500then shuilu:=10;susuankouchulu:=105; when gongzi<9000and gongzi>=4500then shuilu:=20;susuankouchulu:=555; when gongzi<35000and gongzi>=9000then shuilu:=25;susuankouchulu:=1005; when gongzi<55000and gongzi>=35000then shuilu:=30;susuankouchulu:=2755; when gongzi<80000and gongzi>=55000then shuilu:=35;susuankouchulu:=5505; else shuilu:=45;susuankouchulu:=13505;

endcase;

v_tax:=gongzi*shuilu/100-susuankouchulu;

endif;

v_sum:=gongzi+v_tax;

endloop;

close emp_cursor;

dbms_output.put_line(v_sum);

end;

2.使用游标更新所有雇员的薪水

declare

nianxianjiangjin NUMBER(10,2);

ruzhishijianemp.hiredate%TYPE;

CURSOR emp_cursor IS

SELECT hiredate

FROM emp

FORUPDATE;

begin

for cur1 in emp_cursor loop

if(sysdate-ruzhishijian>=356*6)then

nianxianjiangjin:=2000;

else

nianxianjiangjin:=1500;

endif;

update emp

set sal=nianxianjiangjin

wherecurrentof emp_cursor;

endloop;

end;

执行代码后,数据变化如下:因为入职年限都大于6年,所以都修改成了1500

3.使用游标查询并显示部门为“销售部”所有雇员相应的工资级别并显示所在部门名称、薪水和所在级别

declare

jibie NUMBER(1);

bumenNamedept.dname%TYPE;

xinshuiemp.sal%TYPE;

CURSOR emp_cursor IS

SELECT ename,sal,dname

FROM emp e INNERjoin dept d

ON e.deptno=d.deptno

WHERE dname='SALES';

begin

for cur1 in emp_cursor Loop

case

when cur1.sal<=3200and cur1.sal>=700then jibie:=1;

when cur1.sal<=4400and cur1.sal>=3201then jibie:=2;

when cur1.sal<=5000and cur1.sal>=4401then jibie:=3;

when cur1.sal<=7000and cur1.sal>=5001then jibie:=4;

when cur1.sal<=9999and cur1.sal>=7001then jibie:=5;

endcase;

dbms_output.put_line('雇员姓名:'||cur1.ename||';薪水'||cur1.sal||';级别'||jibie); endloop;

end;

上机练习5

CREATEORREPLACEPROCEDURE fire_employee(

eno in emp.empno%type,--输入参数,雇员编号

on_Flag OUTnumber,--执行状态

os_Msg OUTVARCHAR2--提示信息

)

is

BEGIN

delete

from emp

where empno=eno;

on_Flag:=1;

os_Msg:='成功';

EXCEPTION

WHEN NO_DATA_FOUND THEN

on_Flag:=-1;

os_Msg:='该雇员不存在。';

WHENOTHERSTHEN

on_Flag:=SQLCODE;

os_Msg:=SQLERRM;

END;

DECLARE

v_noemp.empno%TYPE;

on_Flag number(1);--执行状态

os_Msg VARCHAR2(200);--提示信息

BEGIN

v_no:=7788;

fire_employee(v_no,on_flag,os_Msg);

dbms_output.put_line(on_flag);

dbms_output.put_line(os_Msg);

END;

END;

存储过程建立完毕

DECLARE

v_noemployee.empno%TYPE;

on_Flag number(1); --执行状态

os_Msg VARCHAR2(200); --提示信息BEGIN

v_no:=7788;

fire_employee(v_no,on_flag,os_Msg);

dbms_output.put_line(on_flag);

dbms_output.put_line(os_Msg);

END;

--调用get_sals存储过程,显示员工薪水

CREATE OR REPLACE PROCEDURE get_sals(

cur_salary OUT SYS_REFCURSOR,

on_Flag OUT number, --执行状态

os_Msg OUT VARCHAR2 --提示信息

)

AS

BEGIN

OPEN cur_salary FOR

SELECT empno,sal FROM employee; on_Flag:=1;

os_Msg:='成功';

EXCEPTION

WHEN OTHERS THEN

on_Flag:=-1;

os_Msg:='其他错误,与管理员联系。'; END;

DECLARE

v_empnoemployee.empno%type;

v_salemployee.sal%type;

emp_salary SYS_REFCURSOR;

on_Flag number(1); --执行状态

os_Msg VARCHAR2(200); --提示信息

BEGIN

get_sals(emp_salary,on_Flag,os_Msg);

IF on_flag=1 THEN

LOOP

FETCH emp_salary INTO v_empno, v_sal;

EXIT WHEN emp_salary%notfound;

DBMS_OUTPUT.PUT_LINE(v_empno||'的薪水是' ||v_sal);

END LOOP;

ELSE

dbms_output.put_line(os_Msg);

END IF;

IF emp_salary%ISOPEN THEN

CLOSE emp_salary;

END IF;

END;

PLSQL程序设计语言

PL/SQL:是过程化/sql的缩写,是Oracle在sql的基础之上扩展来的一种数据库编程语言,在兼容sql的基础之上,扩充了许多新功能,是面向过程化语言和sql的结合。 PL/SQL特点: ·除了基本的sql之外,包含了控制结构和异常处理,从而具有了sql语句的简洁性和过程性。 ·每个sql语句的请求处理,都会引起一次网络的传输,用户量一旦大量增加,可能会导致网络堵塞,而PLSQL是将整个语句块发送给数据库服务器,减少了网络通信的数量,提高了应用程序的运行效率。 ·PLSQL语句是存储在Oracle服务器上,可以被其他的PLSQL程序或者sql调用。具有很高的重用性。 ·PLSQL程序语言是一种块结构语言,PLSQL的基本代为是块。 PLSQL程序块有两种: ·匿名块:没有名称,只用一次,不能存储在数据库中 ·命名块:指的是保存在数据库中的PLSQL程序块,比如我们的存储过程、函数和触发器 块的基本结构: ·匿名块的基本结果

declare:声明部分,用来声明程序中的变量、类型、游标等等。 begin:是PLSQL程序的主体部分,一般使用sql语句或者过程化语言来处理特定的操作。 exception:异常的处理部分,用来检查和处理异常或者错误。 块中的每一条语句都需要以分号结束,一条sql可以分成多行来写,但是最终只需要一个分号。 注释:在PLSQL中,注释分为两种,一种单行注释“--”,两外就是多行注释”/* 需要注释的内容*/” 范例:向表中插入一笔数据并且提交。

声明常量和变量 ·声明常量:常量名constant 类型(长度) := 值 constant:表示的就是固定不变的,就是我们说的常量。声明之后不允许改变。 ·声明变量:变量名类型(长度) (not null)(default | := ) 声明变量和常量中一些规则: ·一行只能声明一个变量或者常量 ·变量时存储值的内存区域,用来处理程序中的值,变量名称不能重复,也不能使用系统关键字。 ·变量名称以字母开头(不区分大小写),可以由字母,数字,下划线组成。 ·变量名称的长度不能超过30个字符

精通 oracle 10g plsql 编程-学习笔记

1.PL/SQL综述 本章学习目标,了解如下内容: PL/SQL的功能和作用 PL/SQL 的优点和特征; Oracle 10g、Oracle9i 的PL/SQL新特征 1.1.SQL简介 1.1.1.SQL语言特点 SQL语言采用集合操作方式 1.1. 2.SQL语言分类 ●数据查询语言(SELECT语句):检索数据库数据。 ●数据操纵语言(DML):用于改变数据库数据。包括insert,update和delete三条语句。 ●事务控制语言(TCL):用于维护数据库的一致性,包括commit,rollback和savepoint 三 条语句 ●数据定义语言(DDL):用户建立、修改和删除数据库对象。 ●数据控制语言(DDL):用于执行权限授予和收回操作。包括grant 和revoke两条命令。 1.1.3.SQL 语句编写规则 ●SQL关键字不区分大小写 ●对象名和列名不区分大小写 ●字符值和日期值区分大小写 ●书写格式随意 1.2.PL/SQL简介 1.3.Oracle 10G PL/SQL 新特征 2.PL/SQL开发工具 本章学习目标: 学会使用SQL*PLUS 学会使用PL/SQL developer; 学会使用Procedure Builder。 2.1.SQL*PLUS 在命令行运行SQL*Plus

Sqlplus [username]/[password] [@server] 3.PL/SQL 基础 学习目标: ●了解PL/SQL块的基本结构以及PL/SQL块的分类; ●学会在PL/SQL块中定义和使用变量 ●学会在PL/SQL块中编写可执行语句; ●了解编写PL/SQL代码的指导方针; ●了解Oracle 10g的新特征——新数据类型BINARY_FLOAT 和 BINARY_DOUBLE,以及指定字符串文本的新方法。 3.1.PL/SQL 块简介 3.1.1.PL/SQL块结构 3.1.2.PL/SQL 块分类 匿名块 命名块 子程序 触发器 3.2. 定义并使用变量 3.2.1.标量变量 3.2.2.复合变量 3.2.3.参照变量 3.2. 4.LOB 变量 3.2.5.非PL/SQL 变量

oracle-database-11g-plsql-编程实战笔记

Chap1 DML语句是select 、insert、update、delete和merge DDL语句是create、alter、drop、rename、truncate、comment DCL语句是grant、revoke TCL语句是commit、rollback和savepoint sql16个基本命令——参考书《OCA认证考试指南(IZ0-051)》清华大学出版社 《oracle database sql language reference 11g》有非遵循格式字符串依赖于格式掩码 chap2 2.1.3 关于语句中有多个单引号时处理: 1、 select'It''s a bird,no plan can''t be 'as pharse from dual; 此处两个单引号即为一个单引号 2、只能用q 再加’(语句)’ select q'(It's a bird,no plan can't be)'as pharse from dual; 均输出 PHARSE ---------------------------- It's a bird,no plan can't be 2.1.4 定义变量与申明变量的区别: 定义变量即为变量分配名称并指定数据类型;申明变量首先需要定义变量,然后为其赋值。(赋值也称为初始化) 替代变量前面要加&前缀且若替代变量为字符型时要加两个单引号如’&a’ declare lv_whom varchar2(20);/*lv-whom为申明变量,a为替代变量,a没有变量类型*/ begin lv_whom := '&a'; end; 或者 declare lv_whom varchar2(20); begin lv_whom := &a; end;但是要在输入框中字符加两个单引号 替代变量用define申明,且定义时不可以指定类型,默认为char型 ①Define x=emp; Select * from &x; /*调用要用&,此处不加单引号,解析后即为emp表*/

实验6plsql程序设计

实验6 PL/SQL程序设计 1 实验目的 (1)掌握PL/SQL程序开发方法。 (2)掌握存储过程、函数、触发器、包的创建于调用。 2 实验要求 (1)根据图书销售系统业务要求创建特定的存储过程、函数、触发器。 (2)根据图书销售系统业务要求将图书销售系统相关的函数、存储过程封装到包里。 3 实验步骤 以bs用户登录BOOKSALES数据库,利用PL/SQL程序编写下列功能模块。 (1)创建一个存储过程,输出不同类型图书的数量、平均价格。

SQL> create or replace procedure proc_category_static 2 as 3 --定义游标,获取当前有哪些图书种类 4 cursor c_all_category is select distinct category from books; 5 --图书的平均价格 6 v_avg_cost number; 7 begin 8 --保存图书种类 9 for v_each_category in c_all_category LOOP 10 select avg(retail) into v_avg_cost from books where category= group by category; 11 ('种类为:'||||',平均价格为:'|| v_avg_cost); 12 END LOOP; 13 end proc_category_static; 14 /

(2)创建一个存储过程,以客户号为参数,输出该客户订购的所有图书的名称与数量。create or replace procedure proc_get_orderinfo( 2 p_customer_id %type) 3 as 4 --声明游标存储客户的订单号 5 cursor c_orderid is select order_id from orders where customer_id=p_customer_id; 6 v_orderid %type; 7 --声明游标存储订单信息 8 cursor c_orderitem is select ISBN, sum(quantity) totalnum from orderitem where order_id=v_orderid group by ISBN;

PLSQL编程基础

淮海工学院计算机工程学院实验报告书 课程名:《大型数据库概论》 题目:PL/SQL编程基础 班级:********* 学号:*********** 姓名:**********

实验2 PL/SQL编程基础 实验目的 1.掌握PL/SQL基础,包括PL/SQL语句块、变量、常用数据类型、运算符和表达式。 2. 掌握PL/SQL控制结构,包括顺序、选择、NULL和循环四种结构及GOTO语句。 3. 掌握PL/SQL中游标的使用方法。 4. 掌握SQL *Plus和Worksheet开发环境的使用方法。 实验环境 局域网,windows 2003 实验学时 2学时,必做实验。 实验内容 1. 编写一个PL/SQL程序块,计算100以内的奇数和。 2. 编写PL/SQL块计算并输出S=1!+2!+…+10!。 3.编写一个PL/SQL块用于计算两个正整数的最大公约数。 4.编写一个PL/SQL程序块,使用游标对一个数据库表中的数据进行查询。 实验步骤 1、选择“开始”→“所有程序”→Oracle-OraHome92→Application Development→SQL Plus 2、系统出现“登录”对话框。输入用户名为“scott”、口令为“tiger”、主机字符串 为“school”。 3、单击“确定”按钮,出现“SQL *Plus的工作窗口”。 4、编写PL/SQL程序。 4.1、编写一个PL/SQL程序块,计算100以内的奇数和。 set serveroutput on; declare p integer; m integer; n integer; begin m:=2; n:=0; for p in 1..100 loop if p mod m<>0 then n:=n+p; end if; end loop;

实验6 PLSQL程序设计

课程:Oracle 同组者:实验日期:2017.5.16 实验6 PL/SQL程序设计 1 实验目的 (1)掌握PL/SQL程序开发方法。 (2)掌握存储过程、函数、触发器、包的创建于调用。 2 实验要求 (1)根据图书销售系统业务要求创建特定的存储过程、函数、触发器。 (2)根据图书销售系统业务要求将图书销售系统相关的函数、存储过程封装到包里。 3 实验步骤 以bs用户登录BOOKSALES数据库,利用PL/SQL程序编写下列功能模块。 (1)创建一个存储过程,输出不同类型图书的数量、平均价格。 SQL> create or replace procedure proc_category_static 2 as 3 --定义游标,获取当前有哪些图书种类 4 cursor c_all_category is select distinct category from books; 5 --图书的平均价格 6 v_avg_cost number; 7 begin 8 --保存图书种类 9 for v_each_category in c_all_category LOOP 10 select avg(retail) into v_avg_cost from books where

课程:Oracle 同组者:实验日期:2017.5.16 category=v_each_category.category group by category; 11 dbms_output.put_line('种类为:'||v_each_category.category||',平均价格为:'|| v_avg_cost); 12 END LOOP; 13 end proc_category_static; 14 / (2)创建一个存储过程,以客户号为参数,输出该客户订购的所有图书的名称与数量。create or replace procedure proc_get_orderinfo( 2 p_customer_id customers.customer_id%type) 3 as 4 --声明游标存储客户的订单号 5 cursor c_orderid is select order_id from orders where customer_id=p_customer_id; 6 v_orderid orders.order_id%type; 7 --声明游标存储订单信息 8 cursor c_orderitem is select ISBN, sum(quantity) totalnum from orderitem where order_id=v_orderid group by ISBN; 9 --保存图书的书名 10 v_title books.title%type; 11 12 begin 13 open c_orderid; 14 LOOP 15 fetch c_orderid into v_orderid;

实验三 PLSQL编程

实验三PL/SQL编程 一、实验目的及要求 (1) 掌握PL/SQL块结构、PL/SQL的基本语法、PL/SQL的控制结构。 (2) 掌握PL/SQL块中使用复合数据类型和游标的方法。 (3) 掌握PL/SQL异常处理技术。 二、实验主要内容 (1) 记录执行命令和操作过程中遇到的问题及解决方法,注意从原理上解释原因。 (2) 记录利用SQL*Plus或iSQL*Plus编写、执行PL/SQL程序的命令。 (3) 记录执行命令和操作过程中遇到的问题及解决方法,注意从原理上解释原因。 三、实验仪器设备 在局域网环境下,有一台服务器和若干台客户机。服务器成功安装Oracle 11g数据库服务器(企业版),客户机成功安装Oracle 11g客户端软件,网络服务配置正确,数据库和客户端正常工作。 四、实验步骤 1.在SQL*Plus中使用PL/SQL块处理EMP表中职工号7788的职工,如果工资小于3000那么把工资更改为3000: 2.declare 3.num_sal emp.sal%type; 4.begin 5.select sal into num_sal from emp where empno=7788; 查询EMP表中职工号7788的工资 6.if(num_sal<3000) then 判断工资是否小于3000 7.update emp set sal=3000 where empno=7788; 把小于3000的工资改为3000 8.end if; 9.dbms_output.put_line('更新'||sql%rowcount||'条记录'); 10.dbms_output.put_line('工资是:'||num_sal); 11.end; 12. 2.编写一个程序块,将emp表中前5人的名字显示出来。 declare 创建一个记录类型v_record,类型包含name,salary,job,deptno分量 type v_record is record( name emp.ename%type, salary emp.sal%type, job emp.job%type, deptno emp.deptno%type 记录类型的分量的数据类型和emp表中列的数据类型一致(%type实现) ); t_record v_record;

oracle_plsql_编程语法详解

PL/SQL程序设计

目录 第一章PL/SQL 程序设计简介 (4) §1.2SQL与PL/SQL (4) §1.2.1 什么是PL/SQL? (4) §1.2.1 PL/SQL的好处 (4) §1.2.2 PL/SQL 可用的SQL语句 (5) §1.3运行PL/SQL程序 (5) 第二章PL/SQL块结构和组成元素 (6) §2.1PL/SQL块 (6) §2.2PL/SQL结构 (6) §2.3标识符 (6) §2.4PL/SQL变量类型 (7) §2.4.1 变量类型 (7) §2.4.2 复合类型 (9) §2.4.3 使用%ROWTYPE (11) §2.4.4 LOB类型* (11) §2.4.5 BIND 变量 (12) §2.4.6 INDEX BY TABLES (12) §2.4.7 数据类型的转换* (13) §2.5运算符和表达式(数据定义) (14) §2.5.1 关系运算符 (14) §2.5.2 一般运算符 (14) §2.5.3 逻辑运算符 (14) §2.6变量赋值 (14) §2.6.1 字符及数字运算特点 (15) §2.6.2 BOOLEAN 赋值 (15) §2.6.3 数据库赋值 (15) §2.6.4 可转换的类型赋值 (15) §2.7变量作用范围及可见性 (16) §2.8注释 (17) §2.9简单例子 (17) §2.9.1 简单数据插入例子 (17) §2.9.2 简单数据删除例子 (18) 第三章PL/SQL流程控制语句 (19) §3.1条件语句 (19) §3.2CASE表达式 (20) §3.3循环 (20) §3.3标号和GOTO (22) §3.4NULL语句 (22) 第四章游标的使用 (24)

实验3PLSQL编程

实验三PL/SQL编程 1.PL/SQL块处理 定义一个包含声明、执行和异常处理的块 查询EMP表中职工号7788的工资,输出工资的值并且如果工资小于3000那么把工资更改为3000,异常部分对NO_DATA_FOUND异常进行处理,输出没有该员工。 如果想运行缓冲区的内容,那么可以用RUN命令或者/命令;serveroutput需要设置为on 2.记录类型的使用 创建一个记录类型v_record,类型包含name,salary,job,deptno等分量,要求记录类型的分量的数据类型和emp表中列的数据类型一致(%type实现)。创建一个变量,变量类型为v_ record,读取EMP表中职工号为7788的ename,sal,job,deptno为该变量赋值,输出变量的分量。 3.条件语句的使用 分别用IF语句和CASE语句实现以下要求:输入一个员工号,修改该员工的工资,如果该员工职位是CLERK,工资增加100;若为SALESMAN,工资增加160;若为ANALYST,工资增加200;否则增加300。 4. 循环和显示游标的使用 分别用简单循环、WHILE循环、FOR循环以及显示游标统计并输出各个部门的人数以及平均工资 5.用隐式游标实现以下要求:修改部门号为50的部门地址为‘BEIJING’。如果该部门不存在,则向dept表中插入一个部门号为50,地址为‘BEIJING’的记录。 6.创建一个显示雇员总人数的存储过程emp_count,并执行该存储过程 7. 编写显示雇员信息的存储过程EMP_LIST,并引用EMP_COUNT存储过程 8. 创建函数,实现功能为:在scott.emp表和scott.dept表中查询出任意给定职工号的职工姓名及职工所在部门的名称。 9. 创建触发器,实现更新dept表中的deptno值,级联更新emp表中相应值。 10. 对存储过程、函数及触发器实现查看、修改、删除等基本操作。 主要算法和程序清单: 1. DECLARE v_empno emp.empno%TYPE:=7788; v_sal emp.sal%TYPE; v_add emp.sal%TYPE; BEGIN SELECT sal INTO v_sal FROM emp WHERE empno=v_empno; IF v_sal<3000 THEN v_add:=3000;

ORACLE PLSQL编程详解 全8篇

ORACLE PL/SQL编程详解 第一章:PL/SQL 程序设计简介 SQL语言只是访问、操作数据库的语言,并不是一种具有流程控制的程序设计语言,而只有程序设计语言才能用于应用软件的开发。PL /SQL是一种高级数据库程序设计语言,该语言专门用于在各种环境下对ORACLE数据库进行访问。由于该语言集成于数据库服务器中,所以PL/SQL代码可以对数据进行快速高效的处理。除此之外,可以在ORACLE数据库的某些客户端工具中,使用PL/SQL语言也是该语言的一个特点。本章的主要内容是讨论引入PL/SQL 语言的必要性和该语言的主要特点,以及了解PL/SQL语言的重要性和数据库版本问题。还要介绍一些贯穿全书的更详细的高级概念,并在本章的最后就我们在本书案例中使用的数据库表的若干约定做一说明。 1.1 SQL与PL/SQL 1.1.1 什么是PL/SQL? PL/SQL是Procedure Language & Structured Query Language 的缩写。ORACLE的SQL是支持ANSI(American national Standards Institute)和ISO92 (International Standards Organization)标准的产品。PL/SQL是对SQL语言存储过程语言的扩展。从ORACLE6以后,ORACLE的RDBMS 附带了PL/SQL。它现在已经成为一种过程处理语言,简称PL/SQL。目前的PL/SQL包括两部分,一部分是数据库引擎部分;另一部分是可嵌入到许多产品(如C语言,JAVA语言等)工具中的独立引擎。可以将这两部分称为:数据库PL/SQL和工具PL/SQL。两者的编程非常相似。都具有编程结构、语法和逻辑机制。工具PL/SQL另外还增加了用于支持工具(如ORACLE Forms)的句法,如:在窗体上设置按钮等。本章主要介绍数据库PL/SQL内容。 1.2 PL/SQL的优点或特征 1.2.1 有利于客户/服务器环境应用的运行 对于客户/服务器环境来说,真正的瓶颈是网络上。无论网络多快,只要客户端与服务器进行大量的数据交换。应用运行的效率自然就回受到影响。如果使用PL/SQL进行编程,将这种具有大量数据处理的应用放在服务器端来执行。自然就省去了数据在网上的传输时间。 1.2.2 适合于客户环境 PL/SQL由于分为数据库PL/SQL部分和工具PL/SQL。对于客户端来说,PL/SQL可以嵌套到相

实验PLSQL程序设计

实验6P L/S Q L程序设计1 实验目的 (1)掌握PL/SQL程序开发方法。 (2)掌握存储过程、函数、触发器、包的创建于调用。 2 实验要求 (1)根据图书销售系统业务要求创建特定的存储过程、函数、触发器。 (2)根据图书销售系统业务要求将图书销售系统相关的函数、存储过程封装到包里。 3 实验步骤 以bs用户登录BOOKSALES数据库,利用PL/SQL程序编写下列功能模块。 (1)创建一个存储过程,输出不同类型图书的数量、平均价格。 SQL> create or replace procedure proc_category_static 2 as 3 --定义游标,获取当前有哪些图书种类 4 cursor c_all_category is select distinct category from books; 5 --图书的平均价格 6 v_avg_cost number; 7 begin 8 --保存图书种类 9 for v_each_category in c_all_category LOOP 10 select avg(retail) into v_avg_cost from books where category= group by category; 11 ('种类为:'||||',平均价格为:'|| v_avg_cost); 12 END LOOP; 13 end proc_category_static; 14 / (2)创建一个存储过程,以客户号为参数,输出该客户订购的所有图书的名称与数量。 create or replace procedure proc_get_orderinfo( 2 p_customer_id %type) 3 as 4 --声明游标存储客户的订单号 5 cursor c_orderid is select order_id from orders where customer_id=p_customer_id; 6 v_orderid %type; 7 --声明游标存储订单信息 8 cursor c_orderitem is select ISBN, sum(quantity) totalnum from orderitem where order_id=v_orderid group by ISBN; 9 --保存图书的书名 10 v_title %type; 11 12 begin 13 open c_orderid; 14 LOOP 15 fetch c_orderid into v_orderid; 16 exit when c_orderid%NOTFOUND; 17 for v_orderitem in c_orderitem LOOP

PLSQL编程实例

-------------------------PL/SQL-------------------------------------------------CREATE PROCEDURE------------------------CREATE OR REPLACE PROCEDURE PRO_003(PARAMS) IS --内部使用变量或自定义错误异常 EXCEPTION EXP_NAME; BEGIN EXCEPTION --出现异常会跳到此处 END PRO_003; --------------------CREATE FUNCTION-------------------------CREATE OR REPLACE FUNCTION FUN_003(PARAMS) RETURN NUMBER IS --内部使用变量 BEGIN RETUNE EXCEPTION --出现异常会跳到此处 RETUNE END PRO_003; SET SERVEROUTPUT ON; --开启DBMS_OUTPUT --------------------调用示例--------------------------------DECLARE R NUMBER(1); BEGIN R := USER_ADD('baskball') ; DBMS_OUTPUT.PUT_LINE(R); END; --------------------CREATE SEQUENCE-------------------------CREATE SEQUENCE DATA_SEQ_003 START WITH0 INCREMENT BY1 MAXVALUE99 MINVALUE0 NOCACHE NOCYCLE; --------------------CREATE FUNCTION-------------------------

[英]编程快参 oracle plsql cheatsheet

Oracle PL/SQL Cheatsheet Symbols ; Semicolon.Statement terminator % Percent sign Attribute indicator (cursor attributes like %ISOPEN and indirect declaration attributes like %ROWTYPE). Also used as multibyte wildcard symbol, as in SQL. _ Single underscore Single-byte wildcard symbol, as in SQL : Colon Host variable indicator, such as :block.item in Oracle Forms ** Double asterisk Exponentiation operator < > and !=Not equals" || Double vertical bar Concatenation operator << and >>Label delimiters :=Assignment operator =>Association operator for positional notation --Double dash: single-line comment indicator /* and */Beginning and ending multiline comment block delimiters

Data Types. Database types NUMBER CHAR(N), VARCHAR2(N) DATE LONG LONG RAW ROWID MLSLABEL Definition Used to store any number Used for storing text Oracle system date Stores large blocks of text Stores large blocks of binary data Smaller binary data store Uesd for row identifier Security label Non database types.DEC, DECIMAL, REAL, DOUBLE-PRECISION, INTEGER, INT, SMALLINT, NATURAL, POSITIVE, NUMERIC, BINARY-INTEGER, CHARACTER, VARCHAR, BOOLEAN, TABLE, RECORD

PLSQL编程语言的使用与程序设计

实验五PL/SQL编程语言的使用与程序设计 【开发语言及实现平台或实验环境】 Oracle10g 【实验目的】 (1)了解PL/SQL在Oracle中的基本概念; (2)掌握PL/SQL的各组成部分; (3)PL/SQL的运用。 【实验原理】 1.PL/SQL字符集 和所有其他程序设计语言一样,PL/SQL也有一字符集。读者能从键盘上输入的字符集是PL/SQL的字符。此外,在某些场合,还有使用某些字符的规定。我们将要详细介绍: ●用PL/SQL编程时可能使用的字符 ●算术运算符 ●关系运算符 ●杂符号 1)合法字符 用PL/SQL程序时,允许使用下列字符: ●所有大、小写字母 ●数字0到9 ●符号:()+-*/〈〉=!~;:.‘@ %,“# $ ^ & _ | { } ?[ ] 2)算术运算符 下面列出了PL/SQL中常用的算术运算符。如果读者使用过其他高级程序设计语言,想必不会陌生: 表6 算术运算符 运算符意义 + 加法 - 减法 * 乘法 / 除法 ** 幂 关系运算符 下面列出了PL/SQL中常用的关系运算符。如果读者有使用其他程序设计语言的经验,一定见过这些符号: 表7 关系运算符 运算符意义 <> 不等于 != 不等于 ^= 不等于 < 小于 > 大于 = 等于

3)杂符号 PL/SQL为支持编程,还使用下述符号。下面列出了部分符号,它们是最常用的,也是使用PL/SQL的所有读者都必须了解的。 表8 杂符号 4)变量 变量是PL/SQL中用来处理数据项所用的名字。读者根据下列规则选择变量名称: ●变量必须以字母(A~Z)开头。 ●其后跟可选的一个或多个字母,数字(0~9)或特殊字符$、# 或_。 ●变量长度不超过30个字符。 ●变量名中不能有空格。 5)保留字 保留字可视为PL/SQL版权所有的字符串。在定义变量名时,读者不能使用这些保留字。例如,词“loop”在PL/SQL中有特殊含义,因此下列代码是非法的: declare employee varchar2(30); loop number; 保留字不能用作变量名。尽管我们不推荐,但如果读者坚持,也可以连接两个保留字形成变量名(如loop_varchar2)。完整的PL/SQL保留字表可以在Oracle8文档中找到。 2、常用数据类型 到目前为止,我们讨论了在PL/SQL中编程时允许使用的字符,变量的命名和保留字。下面着重讨论数据类型。PL/SQL程序用于处理和显示多种类型的数据。和所有计算机软件一样,Oracle也将数据类型分成大量的子类。例如:数可分为整型(不允许有小数)和小数(有一位小数或多位小数)类。PL/SQL支持多种数据类型,此处讨论代码中最常用并且最实用的数据类型。 ●Varchar2 ●Number ●Date ●Boolean 3.PL/SQL的组件 1)块结构(Block structure) PL/SQL程序是由独立的变量声明、执行代码和异常处理等部分代码块写成的。PL/SQL 可以作为一个命名的子程序存放在数据库中,或直接在SQL*Plus窗口中作为一个匿名的块

实验四PLSQL程序设计

《数据库开发技术》课程之实践三 PL/SQL程序设计 一、实践目的 1.掌握PL/SQL程序设计的基本知识。 2.掌握PL/SQL中控制结构的使用。具体包括: 选择结构(IF语句和CASE语句); 循环结构(三种循环语句): 3.掌握PL/SQL中SELECT语句和DML语句的正确使用方法。 二、实践内容和要求 1.编写匿名块,查询指定条件(如员工编号、姓名、部门、工作、工资、工资等级等)的记录并输出 declare e_name varchar(20); begin select ename into e_name from emp where empno='7902'; dbms_output.put_line(e_name); exception when no_data_found then dbms_output.put_line('ni shi sb'); end; / 2.修改1,增加异常处理 3.编写匿名块,向表中插入一条记录,数据由键盘输入 declare d_no dept.deptno%type; d_name dept.dname%type; d_loc dept.loc%type; begin insert into dept values(&d_no,&d_name,&d_loc); dbms_output.put_line('插入成功'); end; / 4.修改3,数据由键盘输入,加入异常处理 5.编写匿名块,修改表中的某些数据 declare d_no dept.deptno%type; d_name dept.dname%type; d_loc dept.loc%type;

相关文档