oracle第四天总结
(1)plsql
1.基本结构:
declare
--声明变量
begin
--plsql体执行其他操作
exception --有异常捕获处理可以加上该关键字
--异常处理
end;
declare i number(3) := 1; begin loop dbms_output.put_line(i); i := i + 1; exit when i > 100; end loop; end;
2.变量声明:(常量、普通变量、引用普通类型变量、引用行类型变量、异常类型变量、游标类型变量)
DECLARE id constant number(2) := 1; --使用constant 关键词定义常量 name VARCHAR2(10) := '圣元'; --定义指定类型变量 mysal emp.sal%type; --定义引用存在表的列类型 myrow emp%rowtype; --定义引用存在表行类型 bean select * into v_account from xx no_data exception; --异常定义 cursor c1 is select sal from emp; --游标定义,该c1中相当于java中集合,给 cursor c2(dno number) is select sal from emp where deptno = dno; ---带参游标定义,该c2相当于java中带泛型集合 BEGIN raise no_data; exception -- when no_data then -- dbms_output.put_line('没有数据'); when others then dbms_output.put_line('出错了'); --常量就不能再赋值了 id:=2 错误 SELECT sal INTO mysal FROM emp WHERE empno = 7369; SELECT * INTO myrow FROM emp WHERE empno = 7369; dbms_output.put_line(id); dbms_output.put_line(name); dbms_output.put_line(mysal); dbms_output.put_line(myrow.ename || ' ' || myrow.sal); END;
3.plsql中条件语句
select case when then when then else end
select decode()
---------------------------------
if xx then
elsif xx then xx
elsif xx then xx
else xx
end if;---注意加上分号
4.plsql中循环语句
第1种
for i in 1..100 --退出循环的是根据循环次数来定的
loop
end loop;
游标使用for in格式更简单
for 不需要定义的任意变量名称 in c1;
loop
end loop;
第2种:
while --此处while后面声明退出循环条件
loop
end loop;
第3种:
open c1; ---此处打开游标
loop
fetch c1 into xx;
exit when c1%notfound; --此处exit when 声明退出循环条件
end loop;
close c1; --此处关闭游标
(2)存储函数:function
创建存储函数:
create or replace function myfn1(eno in emp.empno%type) return varchar2 as---实际return name 的name类型一定要和定义得return varchar2要一致
--这里可以声明变量
myrow emp%rowtype;
name varchar2;
begin
select * into myrow from emp where empno=eno;
name:=myrow.ename;
return name;
end;
plsql调用存储函数:
select myfn1(7369) from dual;
或者
declare
name varchar2;--此处要声明一个变量用于接收返回的结果
begin
name:=mypro2(7369);
dbms_output.put_line(ename);
end;
(3)存储过程:
第1种创建方式:不带参数
create or replace procedure mypro1 as
--这里可以声明变量
begin
end;
第2种创建方式:带in和out参数,参数个数不限制
create or replace procedure mypro2(eno in emp.empno%type,name out varchar2) as
--这里可以声明变量
myrow emp%rowtype;
begin
select * into myrow from emp where empno=eno;
name:=myrow.ename;
end;
plsql调用存储过程:
execute mypro1;---对于无参数存储过程可以这样调用
或者
call mypro1(xxx)--对于只有in 参数可以这样调用
或者
declare --存储函数和存储过程都可以这样调用
name varchar2;
begin
mypro2(7369,name);---此处声明一个变量用于接收out参数输出
end;
(4)jdk api调用存储函数和存储过程:
oracle和mysql连接数据库写法区别:
jdbc:oracle:thin:@ip:port/数据库
jdbc:mysql://ip:port/数据库
对象模型:
DriverManager.getConncetion()---Connection---prepareCall
CallableStatement---set in 参数直接通过设置类型setInt()---registerOutParameter--
call.execute();
CallableStatement调用存储过程和存储函数的sql语句
{call mypro1(?,?)} 调用存储过程
{?=call myfn1(?)} 调用存储函数
SQL>@D:1.sql --oracle执行sql语句和mysql 中source d:1.sql 差不多
(4)触发器
create or replace trigger 触发器名
before|after
delete|update|insert
on 表名
for each row--行级触发器
begin
end;
raise_application_error(-2999,'') 系统定义错误