/*
注意:声明一个变量 变量名 类型 赋值:变量名 类型
控制台输出命令:dbms_output.put_line();
如果想在控制台看到打印结果,需要打开输出显示标志:set serveroutput on; */ --
set serveroutput on --
declare
val number:=20;
begin
dbms_output.put_line('val的值是:'||val);
end; /*
在PL/SQL中的SELECT语句中,必须有into自居来获取查询的结果
在PL/SQL中可以定义输入对话框;对话框用来接收一个值,当这个値是数值:&提示信息 当对话框需要接受字符串:'&提示信息'
异常:异常处理是PL/SQL块的最后的执行语句,之后不能有任何的正常 代码(可以嵌套语句块来实现异常处理后的正常语句) */
declare
v_ename varchar2(20); v_sal number;
begin
select ename,sal into v_ename,v_sal from emp where empno=&员工编号; dbms_output.put_line('员工姓名'||v_ename||' 工资:'||v_sal); exception
when no_data_found then
dbms_output.put_line('没有找到员工信息'); when others then
dbms_output.put_line('出现异常'); end
--使用嵌套语句 declare
v_ename varchar2(20); v_sal number; begin
begin
select ename,sal into v_ename,v_sal from emp where empno=&员工编号; dbms_output.put_line('员工姓名:'||v_ename||'工资:'||v_sal); exception
when no_data_found then
dbms_output.put_line('没有找到员工信息'); when others then
dbms_output.put_line('出现异常'); end;
dbms_output.put_line('程序正常结束');
end;
--变量生命周期:在declare后边跟的 begin end之间 declare
v_val1 number:=10; begin
declare
v_val2 number:=20;
begin
dbms_output.put_line('变量值'||v_val1||' '||v_val2);
end;
--错误:v_val2失效。 dbms_output.put_line('变量值'||v_val1||' '||v_val2); end;
--常量constant 常量定义时必须赋予初值 declare
c_con constant number:=10; begin
dbms_output.put_line(c_con); end;
--使用%TYPE(万能类型、列类型)和%ROWTYPE类型(万能行类型、行类型) declare
v_empno emp.empno %type; v_ename emp.ename%type; v_hiredate emp.hiredate % type; begin
select empno,ename,hiredate into v_empno,v_ename,v_hiredate from emp where empno=&员工编号;
dbms_output.put_line(v_empno||' '||v_ename||' '||to_char(v_hiredate,'yyyy\"年\"mm\"月\"dd\"日\"'));
exception
when no_data_found then dbms_output.put_line('找不到员工'); end;
--定义emp表的全列类型 declare
v_row emp %rowtype;
begin
select * into v_row from emp where empno=&inputempno; dbms_output.put_line(v_row.ename||' '||v_row.job);
exception when no_data_found then dbms_output.put_line('找不到员工'); end;
--条件控制 IF
--注意:else if的写法:elsif declare
v_val1 number:=&数值1; v_val2 number:=&数值2; begin
if v_val1>v_val2 then
dbms_output.put_line('数值1>数值2'); elsif v_val1=v_val2 then
dbms_output.put_line('数值1=数值2'); else
dbms_output.put_line('数值1<数值2'); end if;
end;
--多条件的分支:CASE --形式一:
declare
v_val number:=&数值; v_info varchar2(10);
begin
case v_val
when 1 then v_info:='数值1'; when 2 then v_info:='数值2'; when 3 then v_info:='数值3'; else v_info:='其他数值'; end case;
dbms_output.put_line(v_info); end;
--形式二:
declare
v_val number:=&数值; v_info varchar2(10); begin
case
when v_val=1 then v_info:='数值1'; when v_val=2 then v_info:='数值2'; when v_val=3 then v_info:='数值3'; else v_info:='其他数值';
end case;
dbms_output.put_line(v_info); end;
--形式三:
declare
v_val number:=&数值; v_info varchar2(10);
begin
case
when v_val=1 then v_info:='数值1'; when 2=2 then v_info:='2=2';
when v_val=3 then v_info:='数值3'; else v_info:='其他数值'; end case;
dbms_output.put_line(v_info); end;
--case表达式
--注意:case表达式的每一条when语句后没有符号
--形式四:
declare
v_val number:=&数值; v_info varchar2(10); begin
v_info:=case v_val
when 1 then '数值1' when 2 then '数值2' when 3 then '数值3' else '其他数值' end;
dbms_output.put_line(v_info); end;
--给值起别名
select losal,hisal,grade from salgrade; --
select losal 工资下限,hisal 工资上限, case grade
when 1 then '工资1级' when 2 then '工资2级' when 3 then '工资3级' when 4 then '工资4级' else '工资高级' end 工资等级
; from salgrade; --循环
--LOOP
--注意:退出循环的关键字:exit;退出语句简写:exit when 退出条件 declare
v_i number:=1; v_sum number:=0; begin
loop
v_sum:=v_sum+v_i; v_i:=v_i+1;
exit when v_i>100; end loop;
dbms_output.put_line(v_sum); end;
--等同于如下代码: declare
v_i number:=1; v_sum number:=0; begin loop
v_sum:=v_sum+v_i; v_i:=v_i+1; if v_i>100 then exit;
end if; end loop;
dbms_output.put_line(v_sum); end; --while declare
v_i number:=1; v_sum number:=0; begin
while v_i<=100 loop v_sum:=v_sum+v_i; v_i:=v_i+1; end loop;
dbms_output.put_line(v_sum); end; --for in
--注意:in表达式后面的数值必须从小到大
declare
v_sum number:=0; begin
for v_i in 1..100 loop v_sum:=v_sum+v_i; end loop;
dbms_output.put_line(v_sum); end;
--翻转需要in reverse begin
for v_i in reverse 1..100 loop dbms_output.put_line(v_i);
end loop; end;
--异常-------------------------------------
--异常的分类:ORAcle运行时异常 PLS 编译时异常
--异常代号:一个负值; 注意:如果需要自定义异常代号,需要在-20000以后。 --获取系统的异常代号的关键字:sqlcode
--异常消息文本:以一段异常消息的提示信息,也包括错误代码 --获取系统异常消息的关键字:sqlerrm declare
v_empno emp.empno%type; v_ename emp.ename%type; v_hiredate emp.hiredate%type; begin
select empno,ename,hiredate into v_empno,v_ename,v_hiredate from emp where empno=&员工编号;
dbms_output.put_line(v_empno||' '||v_ename||' '||to_char(v_hiredate,'yyyy\"年\"mm\"月\"dd\"日\"'));
exception when no_data_found
then
dbms_output.put_line('异常代码:'||sqlcode||'异常消息'||sqlerrm); end;
--自定义异常:自定义异常名称来捆绑一个异常代号
/*
意义:系统定义了几乎所有异常的编号,但不是每个异常都有实名,我们需要自定义实名 捆绑错误代码才能使用实名捕获异常 */
declare
my_exception exception;
pragma exception_init(my_exception,-22222); begin
insert into emp(empno,deptno) values(1,'50'); commit;
exception when my_exception then
dbms_output.put_line('没有找到主表中的部门编号'||sqlerrm); end;
--raise application_error(错误代号,错误信息) --是自定义异常和手动抛出异常的组合语句 declare
v_sex varchar2(10):='&输入性别'; begin
if not(v_sex='男' or v_sex='女') then
raise_application_error(-20000,'性别只能是男或者女'); end if;
dbms_output.put_line('性别'||v_sex); exception
when others then
dbms_output.put_line(sqlcode||' '||sqlerrm); end; --作业
--输出乘法表 declare
v_sum number; begin
for v_i in 1..9 loop begin
for v_j in 1..9 loop
v_sum:=v_i*v_j;
dbms_output.put_line(v_sum); end loop; end; end loop;
end;
--作业2:输入员工姓名,查找员工工资,员工编号,要求首先判断姓名 --字符串部门超过10个字符,否则报名字过长的异常 --(使用raise_application_error(-20001,' 错误消息 '));
--使用 others 捕获异常并sqlerrm提示输出( length(变量));
declare
v_ename varchar2(20); v_sal number; v_empno number;
begin
select empno,ename,sal into v_empno,v_ename,v_sal from emp where length(deptno)>10; dbms_output.put_line('员工姓名:'||v_ename||' 工资:'||v_sal);
end;
--作业3: 通过PL/SQL匿名块输出指定员工编号的员工姓名、入职日期、 --部门名称、部门位置的信息,当出现输出没有的员工编号时,处理异常 --并提示没有找到员工。(注意,在定义输出变量时使用 %TYPE ) declare
v_ename emp.ename % type; v_sal emp.sal % type;
v_hiredate emp.hiredate % type; v_deptno emp.deptno % type; begin
select ename,sal,hiredate,deptno into v_ename,v_sal,v_hiredate,v_deptno from emp where empno=&员工编号;
dbms_output.put_line('员工姓名:'||v_ename||' 工资:'||v_sal||' 入职日期'||to_char(v_hiredate,'yyyy\"年\"mm\"月\"dd\"日\"')||' 部门编号'||v_deptno); exception when no_data_found then dbms_output.put_line('找不到员工'); end;
因篇幅问题不能全部显示,请点此查看更多更全内容