pl/sql程序段
18.语法
declare --说明部分(变量声明,游标申明,例外(异常)说明) begin --语句序列(DML语句) exception --例外处理语句 end;
简单的输出语句
begin dbms_output.put_line('hello world'); end;
18.3.常量和变量的声明
变量的基本类型和Oracle建表时的类型一致
定义语法:
varl char(25);
ass number(9,2);
常量定义:
cl boolean:=true;
18.4.引用表中的数据
myname emp.ename%type;
例:
declare myname emp.ename%type; begin select t.ename into myname from emp t where t.empno=1001; end;
18.5.记录型变量,可以理解为java中的对象
declare myname emp%rowtype; begin select * into myname from emp t where t.empno=1001; dbms_output.put_line(myname. ||' '||myname. ||' '|| ...)--注:myname.后填emp表中的列名 end;
19.if语句
19.1语法:
1.
if 条件 then 语句1; 语句2;... --注:if在遇到else elsif或end if 才算结束 end if;
2.
if 条件 then 语句1; else 语句2; end if;
3.
if 条件 then 语句1; elsif then 语句2; else 语句3 end if;
20.loop
20.1.语法
1.
WHILE 表达式 LOOP ... END LOOP;
2.(较为常用)
LOOP EXIT [WHEN 条件] ... END LOOP;
3.适用于连续的数字遍历
FOR I(变量) IN 1..3 LOOP ... END LOOP;
21.游标 Cursor(相当于java中的集合)
21.1.定义语法
CURSOR 游标名 [(参数名 参数类型,参数名 参数类型,...)] IS SELECT 语句
例:
cursor c1 is select * from test 在declare段定义
21.2.使用步骤
1.打开游标 open c1;(打开游标进行查询)
2.取一行游标的值 fetch c1 into pno;(pno是变量)
3.关闭游标 close c1;(关闭游标释放资源)
4.游标结束方式 exit when c1%notfound
注: 上述的n必须与表中列的参数类型一致 pno emp.eno%type;
例:用游标方式输出emp表中的员工编号和姓名
declare prec emp%rowtype; cursor c1 is select * from emp; begin open c1; loop fetch c1 into prec;--从游标中取值,取完值后游标会自动向下移动一步 exit when c1%notfound; end loop; close c1; end;
例:涨工资:
declare prec emp%rowtype; cursor c1 is select * from emp; addsal number(4); begin open c1; loop fetch c1 into prec;--从游标中取值,取完值后游标会自动向下移动一步 exit when c1%notfound; if prec.job='president' then addsal:=800; elsif prec.job='manager' then addsal:=400; else addsal:=100; end if; update emp set sal = prec.sal+addsal where id=prec.id; end loop; close c1; commit;--更新完数据后要提交 end;
含参的例子:
declare prec emp%rowtype; cursor c1(dno emp.id%type) is select * from emp where id=dno; begin open c1(4); loop fetch c1 into prec; exit when c1%notfound; update emp set sal = prec.sal+100 where id=prec.id; end loop; close c1; commit; end;
22.例外(类似于java中的异常)
22.1.Oracle自带例外:
1.no_data_found (未找到数据)
2.too_many_rows (查询到的结果多于要存储的变量能存储的值,比如行记录语句只能一行数据,而select查到了多行数据)
3.zore_divide (被0除)
4.value_error (算术或转化错误)
5.timeout_on_resource (请求资源时超时)
22.2.异常处理:
在exception中
when value_error then ...;
when zore_divide then ...;
when others then ...;
22.3.异常声明:
在declare中
异常名 exception;
22.4.抛出异常:
raise 异常名;
22.5.例:
declare prec emp%rowtype; cursor c1 is select * from emp where id=70; no_emp exception; begin open c1; loop fetch c1 into prec; if c1%notfound then raise no_emp; update emp set sal = prec.sal+100 where id=prec.id; end loop; close c1; commit; exception when no_emp then dbms_output.output_line('未找到该员工'); when others then dbms_output.output_line('其他异常'); end;
23.存储过程
23.1定义
create or replace procedure 存储过程名 [(参数 in/out 参数类型)]--输入参数(in)和输出参数(out) as begin plsql程序体; end;
或者
create or replace procedure 存储过程名 [(参数 in/out 参数类型)]--输入参数(in)和输出参数(out) is begin plsql程序体; end 存储过程名;
如果在存储过程中遇到数据库更新等操作,一般在调用该存储过程时才会执行commit操作,不会在存储过程内部进行commit操作。
23.2.调用(假设存储过程有输入输出参数,第一个参数为输入,第二位输出)
declare
begin
存储过程名(参数1,参数2);
end;
24.存储函数
24.1.语法
create or replace function 函数名 [(参数 in 参数类型)] return 数据类型 is 结果变量 数据类型 begin plsql程序体; return 结果变量 end 函数名;
24.2.与存储过程的区别
1.存储过程无返回值,存储函数有返回值,但是存储过程可以通过out来传出多个值。因此一般推荐使用存储过程25.java调用
25.java调用
1.存储过程
public static void test(){ String driver="Oracle.jdbc.OracleDriver"; String conStr="jdbc:Oracle:thin:@127.0.0.1:1521:orcl"; Connection conn=null; CallableStatement cs=null; try { Class.forName(driver); conn= DriverManager.getConnection(conStr,"sys","sys"); cs=conn.prepareCall("{call countysal(?,?)}"); cs.setInt(1,7390); //注册Oracle输出参数的类型 cs.registerOutParameter(2,OracleTypes.NUMBER); //执行存储过程 cs.execute(); int y=cs.getInt(2); } catch (Exception e) { e.printStackTrace(); }finally { try { if(cs!= null){ cs.close(); } if(conn!= null){ conn.close(); } } catch (SQLException throwables) { throwables.printStackTrace(); } } }
2.存储函数:
public static void test(){ String driver="Oracle.jdbc.OracleDriver"; String conStr="jdbc:Oracle:thin:@127.0.0.1:1521:orcl"; Connection conn=null; CallableStatement cs=null; try { Class.forName(driver); conn= DriverManager.getConnection(conStr,"sys","sys"); cs=conn.prepareCall("{?=call countysal(?)}"); cs.setInt(2,7390); //注册Oracle输出参数的类型 cs.registerOutParameter(1,OracleTypes.NUMBER); //执行存储过程 cs.execute(); int y=cs.getInt(2); } catch (Exception e) { e.printStackTrace(); }finally { try { if(cs!= null){ cs.close(); } if(conn!= null){ conn.close(); } } catch (SQLException throwables) { throwables.printStackTrace(); } } }
学习资料来源:过会标