热门搜索 :
考研考公
您的当前位置:首页正文

oracle_PLSQL

来源:东饰资讯网
--PL/SQL--

/*

注意:声明一个变量 变量名 类型 赋值:变量名 类型

控制台输出命令: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;

因篇幅问题不能全部显示,请点此查看更多更全内容

Top