PLSQL小例子

 

1、 编写一个程序块,从emp表中显示名为’SMITH’的雇员的薪水和职位。
 SET SERVEROUTPUT ON
 declare
 v_sal emp.sal%type;
 v_job emp.job%type;

 begin
 select sal,job into v_sal,v_job from emp where ename = 'SMITH';
 DBMS_OUTPUT.put_line(v_sal||' '||v_job);
 END;

提示用户输入'SMITH'
 SET SERVEROUTPUT ON
 declare
 v_sal emp.sal%type;
 v_job emp.job%type;
 v_name emp.ename%type:='&v_name';--此处在外面加入单引号,这样在输入的时候就直接可以输入字符串了

 begin
 select sal,job into v_sal,v_job from emp where ename = v_name;
 DBMS_OUTPUT.put_line(v_sal||' '||v_job);
 END;

2、 编写一个程序块,接受用户输入的一个部门号,从dept表中显示该部门的名称与所在的位置。
 SET SERVEROUTPUT ON
 declare
 v_dname  dept.dname%type;
 v_loc  dept.loc%type;
 v_deptno  dept.deptno%type:=&v_deptno;

 begin
 select dname,loc into v_dname,v_loc from dept where deptno = v_deptno;
 DBMS_OUTPUT.put_line(v_dname||'+'||v_loc);

 EXCEPTION
 WHEN no_data_found THEN
 DBMS_OUTPUT.put_line('您输入的部门号不存在!');

  end;

3、 接受两个数相除并且显示结果,如果第二个数为0,则显示消息“除数不能为0”。

 SET SERVEROUTPUT ON
 DECLARE
 v_divsor REAL:=&v_divsor;--除数
 v_dividend REAL:=&v_dividend;--被除数
 v_result REAL;
 
 BEGIN
 v_result := v_dividend/v_divsor;
 DBMS_OUTPUT.put_line('结果为'||v_result);

 EXCEPTION
 WHEN ZERO_DIVIDE THEN
 DBMS_OUTPUT.put_line('除数不能为零');
 END;

4、 编写一个程序块,接受一个雇员名,从emp表中显示该雇员的工作岗位与薪水,若输入的雇员名不存在,显示“该雇员不存在”信息。

 SET SERVEROUTPUT ON
 DECLARE
 v_job emp.job%type;
 v_sal emp.sal%type;
 v_ename emp.ename%type:='&v_ename';--输入员工姓名

 BEGIN
 select job,sal into v_job,v_sal from emp where ename = v_ename;
 DBMS_OUTPUT.put_line('员工工作'||v_job||'员工薪水'||v_sal);

 EXCEPTION
 WHEN NO_DATA_FOUND THEN
 DBMS_OUTPUT.put_line('您要查找的员工不存在.'); 

 END; 

5、 编写一个程序块,利用%type属性,接受一个雇员号,从emp表中显示该雇员的整体薪水(即,薪水+佣金)

 SET SERVEROUTPUT ON
 DECLARE
 v_empno emp.empno%type:=&v_empno;--输入员工编号
 v_saladdcomm emp.sal%type;
 v_sal emp.sal%type;
 v_comm emp.comm%type;
 
 BEGIN
 select sal,comm into v_sal,v_comm from emp where empno = v_empno;

 v_saladdcomm := v_sal + NVL(v_comm,0);--这里需要用到NVL函数,如果v_comm为NULL的话则设为0
                                                                    --否则如果v_comm为空的话,计算出来的值则为空                           

 DBMS_OUTPUT.put_line(v_empno||'的整体薪水是:'||v_saladdcomm);

 EXCEPTION
 WHEN NO_DATA_FOUND THEN
 DBMS_OUTPUT.put_line('您要查找的员工编号不存在!');

 END;

 

6、 编写一个程序块,将emp表中前5人的名字显示出来。

不知道不使用游标的方法能否做出来

以下为使用游标的方法

1>使用for 循环实现
DECLARE
CURSOR c_emp IS select ename from emp where rownum < 6;

BEGIN

FOR v_emp IN c_emp LOOP
DBMS_OUTPUT.put_line(v_emp.ename);
END LOOP;

END;

2>使用while方法
DECLARE
CURSOR c_emp IS select ename from emp where rownum < 6;
v_ename emp.ename%type;
v_count number:=1;

BEGIN
OPEN c_emp;
while v_count < 6 loop

fetch c_emp into v_ename;
DBMS_OUTPUT.put_line(v_ename);
v_count := v_count+1;

end loop;
close c_emp;
end;

使用while的第二种用法

DECLARE
CURSOR c_emp IS select ename from emp where rownum < 6;
v_ename emp.ename%type;

BEGIN
OPEN c_emp;
fetch c_emp into v_ename;

--刚开始要让游标向下移动一行接下来才能判断是否已经
--取道到一行纪录

while c_emp%found loop

DBMS_OUTPUT.put_line(v_ename);
fetch c_emp into v_ename;

end loop;

close c_emp;
end;
3>使用LOOP循环的方法
set serveroutput on
DECLARE
CURSOR c_emp IS select ename from emp where rownum < 6;
v_ename emp.ename%type;

BEGIN
OPEN c_emp;

LOOP
fetch c_emp into v_ename;
DBMS_OUTPUT.put_line(v_ename);
EXIT WHEN c_emp%notfound;
END LOOP;

CLOSE c_emp;
END;

7、 某公司要根据雇员的职位来加薪,公司决定按如下列加薪结构处理:
Designation Raise
Clerk 500
Salesman 1000
Analyst 1500
Otherwise 2000
编写一个程序块,接受一个雇员名,从emp表中实现上述加薪处理。
set serveroutput on
DECLARE
v_ename emp.ename%type:='&v_ename';
v_job emp.job%type;
v_addSal emp.sal%type;--额外增加的工资
v_sal emp.sal%type;

BEGIN
select job into v_job from emp where ename = v_ename;
select sal into v_sal from emp where ename = v_ename;

IF v_job = 'Clerk' then

v_addSal := 500;
elsif v_job = 'Salesman' then
v_addSal := 1000;
elsif v_job = 'Analyst' then
v_addSal := 1500;
else
v_addSal := 2000;

END IF;

v_addSal := v_addSal + v_sal;
UPDATE emp SET sal = v_addSal where ename = v_ename;
END;

8、 使用For循环游标,接受一个部门号,从emp表中显示该部门的所有雇员的姓名,工作和薪水。
set serveroutput on
DECLARE
v_deptno emp.deptno%type:=&v_deptno;
v_ename emp.ename%type;
v_job emp.job%type;
v_sal emp.sal%type;

CURSOR c_emp IS select ename,job,sal from emp where deptno = v_deptno;


BEGIN
DBMS_OUTPUT.put_line('deptno'||' '||'ename'||' '||'job'||' '||'sal');
for v_emp IN c_emp LOOP
DBMS_OUTPUT.put_line(v_deptno||' '||v_emp.ename||' '||v_emp.job||' '||v_emp.sal);
END LOOP;

END; 

转载于:https://www.cnblogs.com/tjy_una/archive/2009/06/30/1514156.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PL/SQL编程 pl/sql(procedural language/sql)是Oracle在标准的sql语言上的扩展。pl/sql不仅允许嵌入式sql语言,还可以定义变量和常量,允许使用条件语句和循环语句,允许使用例外处理各种错误。这样使得他的功能变的更强大。缺点是移植性不好。 编写一个存储过程,向表中添加数据。 1. create table mytest (name varchar2(30),passwd varchar2(30)); 2. create or replace procedure xxc_pro1 is begin insert into mytest values ('小红','m123'); end; 3. 调用过程 exec 过程名(参数1,参数2…)或call 过程名参数1,参数2…) ① exec xxc_pro1; 或者是 ② call xxc_pro1; pl/sql可以做什么? 块:包括过程、函数、触发器、包。 编写规范: 1. 注释 --:单行注释 eg:select * from emp where empno=7788;--取得员工信息 /*……*/多行注释 2. 表示符号(变量)的命名规范: ① 当定义变量时,建议用v_作为前缀:v_ename ② 当定义常量时,建议用c_作为前缀:c_rate ③ 当定义游标时,建议用_cursor作为后缀:emp_cursor ④ 当定义例外时,建议用e_作为前缀:e_error 块(block)是pl/sql的今本程序单元,编写pl/sql程序实际上就是在编写pl/sql块;pl/sql块由三部分组成:定义部分,执行部分,例外处理部分。 declare --可选部分 /*定义部分:定义常量,变量,游标,例外,复杂数据类型*/ begin --必选部分 /*执行部分:要执行的pl/sql语句和sql语句*/ exception --可选部分 /*例外处理部分:处理运行的各种错误*/ 实例1:只包含执行部分的pl/sql块 SQL> set serveroutput on --打开输出 SQL> begin 2 dbms_output.put_line('hello'); 3 end; 4 / 说明:dbms_output是oracle提供的包,该包包含一些过程,put_line就是其中之一。 实例2:包含定义部分和执行部分 SQL> declare 2 v_ename varchar2(5); 3 begin 4 select ename into v_ename from emp where empno = &no; 5 dbms_output.put_line('雇员名'||v_ename); 6 end; 7 / 说明:&:从控制台输入变量,会弹出一个对话框。 实例3.同时输出雇员名和工资 SQL> declare 2 v_ename varchar2(20); 3 v_sal number(10,2); 4 begin 5 select ename,sal into v_ename,v_sal from emp where empno=&no; 6 dbms_output.put_line('雇员名:'||v_ename||' 工资:'||v_sal); 7 end; 8 / 包含定义,执行,和例外处理的pl/sql块。 实例4.当输入的员工号不存在时 SQL> declare 2 v_ename varchar2(20); 3 v_sal number(10,2); 4 begin 5 select ename,sal into v_ename,v_sal from emp where empno =&no; 6 dbms_output.put_line('雇员名:'||v_ename||' 工资:'||v_sal); 7 exception --异常处理部分 8 when no_data_found then 9 dbms_output.put_line('请输入正确的员工号!'); 10 end; 11 / 以上为块的基础,下面来介绍块的各个组成:过程,函数,触发器,包。 过程 过程用于执行特定的操作,当执行过程的时候,可以指定输入参数(in),也可以指定输出参数(out)。通过在过程中使用输入参数,可以讲数据输入到执行部分,通过使用输出参数,可以将执行部分的数据输出到应用环境,在pl/sql中可以使用create procedure命令来创建过程。 编写一个存储过程,可以输入雇员名和新工资来改变员工工资。 --案例 create or replace procedure xxc_pro3(newname in varchar2,newsal in number) is begin update emp set sal=newsal where ename=newname; end;

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值