import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import oracle.jdbc.OracleTypes;
import oracle.jdbc.OracleCallableStatement;
import org.junit.Test;
import demo.utils.JDBCUtills;
/*
* Statement < PreparedStatement < CallableStatement
*/
public class TestOracle {
/*
* create or replace
procedure queryEmpInfo(eno in number,
pename out varchar2,
psal out number,
pjob out varchar2)
*/
@Test
public void testProcedure(){ //´æ´¢¹ý³Ì²âÊÔÓÃÀý
//{call procedure-name(??/)}
String sql = "{call queryEmpInfo(?,?,?,?)}";
Connection conn = null;
CallableStatement call = null;
try{
conn = JDBCUtills.getConnection();
call = conn.prepareCall(sql);
//Set value to param
call.setInt(1, 7839);
//declare out parameter
call.registerOutParameter(2, OracleTypes.VARCHAR);
call.registerOutParameter(3, OracleTypes.NUMBER);
call.registerOutParameter(4, OracleTypes.VARCHAR);
//run
call.execute();
//get returned values
String name = call.getString(2);
double sal = call.getDouble(3);
String job = call.getString(4);
System.out.println(name);
System.out.println(sal);
System.out.println(job);
}catch(Exception ex){
ex.printStackTrace();
}finally{
JDBCUtills.release(conn, call, null);
}
}
/*
* create or replace
function queryEmpIncome(eno in number)
return number
*/
@Test
public void testFunction(){ //´æ´¢º¯Êý²âÊÔÓÃÀý
//{?=call procedure-name(??/)}
String sql = "{?= call queryEmpIncome(?)}";
Connection conn = null;
CallableStatement call = null;
try{
conn = JDBCUtills.getConnection();
call = conn.prepareCall(sql);
call.registerOutParameter(1, OracleTypes.NUMBER);
call.setInt(2, 7839);
call.execute();
double income = call.getDouble(1);
System.out.println(income);
}catch(Exception ex){
ex.printStackTrace();
}finally{
JDBCUtills.release(conn, call, null);
}
}
@Test
public void testCursor(){ //·ÃÎÊÓαê²âÊÔÓÃÀý
String sql = "{call MYPACKAGE.queryEmpList(?,?)}"; //×¢Òâ´Ë¾äÒªÓÐ{}
Connection conn = null;
CallableStatement call = null;
ResultSet rs = null;
try{
conn = JDBCUtills.getConnection();
call = conn.prepareCall(sql);
call.setInt(1, 20);
call.registerOutParameter(2, OracleTypes.CURSOR);
call.execute();
rs = ((OracleCallableStatement)call).getCursor(2);
while(rs.next()){
String name = rs.getString("ename");
double sal = rs.getDouble("sal");
System.out.println(name+ " " + sal);
}
}catch(Exception ex){
ex.printStackTrace();
}finally{
JDBCUtills.release(conn, call, rs);
}
}
}
ÔÚJavaÓïÑÔÖе÷ÓÃ
ÔÚJavaÓïÑÔÖе÷Óô洢¹ý³Ì
ÔÚJavaÓïÑÔÖе÷Óô洢º¯Êý
ʲôʱºòÓô洢¹ý³Ì/´æ´¢º¯Êý£¿
ÔÔò£ºÈç¹ûÖ»ÓÐÒ»¸ö·µ»ØÖµ£¬Óô洢º¯Êý£»·ñÔò£¬¾ÍÓô洢¹ý³Ì¡£
´¥·¢Æ÷
´¥·¢Æ÷¶¨Òå
Êý¾Ý¿â´¥·¢Æ÷ÊÇÒ»¸öÓë±íÏà¹ØÁªµÄ¡¢´æ´¢µÄPL/SQL³ÌÐò¡£Ã¿µ±Ò»¸öÌØ¶¨µÄÊý¾Ý²Ù×÷Óï¾ä(Insert,update,delete)ÔÚÖ¸¶¨µÄ±íÉÏ·¢³öʱ£¬Oracle×Ô¶¯µØÖ´Ðд¥·¢Æ÷Öж¨ÒåµÄÓï¾äÐòÁС£
´¥·¢Æ÷µÄÀàÐÍ
Óï¾ä¼¶´¥·¢Æ÷
?ÔÚÖ¸¶¨µÄ²Ù×÷Óï¾ä²Ù×÷֮ǰ»òÖ®ºóÖ´ÐÐÒ»´Î£¬²»¹ÜÕâÌõÓï¾äÓ°ÏìÁ˶àÉÙÐÐ ¡£
Ðм¶´¥·¢Æ÷£¨FOR EACH ROW£©
?´¥·¢Óï¾ä×÷ÓõÄÿһÌõ¼Ç¼¶¼±»´¥·¢¡£ÔÚÐм¶´¥·¢Æ÷ÖÐʹÓÃoldºÍnewα¼Ç¼±äÁ¿, ʶ±ðÖµµÄ״̬¡£
´´½¨´¥·¢Æ÷
CREATE [or REPLACE] TRIGGER ´¥·¢Æ÷Ãû
{BEFORE | AFTER}
{DELETE | INSERT | UPDATE [OFÁÐÃû]}
ON ±íÃû
[FOR EACH ROW [WHEN(Ìõ¼þ) ] ]
PLSQL¿é
´¥·¢Æ÷¼òµ¥ÊµÀý
/*
µÚÒ»¸ö´¥·¢Æ÷:¶Ôupdate
*/
create or replace trigger sayHello
after update
on emp
begin
dbms_output.put_line('Hello World');
end;
/
Ðм¶´¥·¢Æ÷
´¥·¢Óï¾äÓëα¼Ç¼±äÁ¿µÄÖµ
´¥·¢Æ÷Ó¦Ó󡾰ʵÀý
³¡¾°Ò»£¨Óï¾ä´¥·¢Æ÷£©
/*
´¥·¢Æ÷Ó¦Óó¡¾°Ò»£ºÊµÏÖ¸´ÔӵݲȫÐÔ¼ì²é
ÏÞÖÆ·Ç¹¤×÷ʱ¼äÏòÊý¾Ý¿âemp²åÈëÊý¾Ý
1. ÖÜÄ©£ºÐÇÆÚÁù ÐÇÆÚÈÕ to_char(sysdate,'day')
2. <9 or >18µã to_number(to_char(sysdate,'hh24'))
*/
create or replace trigger securityEmp
before insert
on emp
begin
if to_char(sysdate,'day') in ('ÐÇÆÚÈý','ÐÇÆÚÁù','ÐÇÆÚÈÕ')
or to_number(to_char(sysdate,'hh24')) not between 9 and 18 then
raise_application_error(-20001,'²»ÄÜÔڷǹ¤×÷ʱ¼ä²åÈëÊý¾Ý');
end if;
end;
/
³¡¾°¶þ£¨Ðм¶´¥·¢Æ÷£©
/*
´¥·¢Æ÷Ó¦Óó¡¾°¶þ£ºÈ·ÈÏÊý¾Ý
Õǹ¤×ʲ»ÄÜÔ½ÕÇÉÙ
Ðм¶´¥·¢Æ÷µÄÁ½¸öα¼Ç¼±äÁ¿ :old , :new
*/
create or replace trigger checksal
before update
on emp
for each row
begin
if :old.sal > :new.sal then
raise_application_error(-20002,'ÕǺóµÄ¹¤×ʲ»ÄÜÉÙÓÚÕÇǰµÄ¡£ÕǺó:'||:new.sal||' ÕÇǰ£º'||:old.sal);
end if;
end;
/
´¥·¢Æ÷Á·Ï°
ÏÞÖÆÃ¿¸ö²¿ÃÅÖ»ÕÐÆ¸5ÃûÖ°¹¤£¬³¬¹ý¼Æ»®Ôò±¨³ö´íÎóÐÅÏ¢
*****************************************************************************
/*
Á·Ï°£ºÏÞÖÆÃ¿¸ö²¿ÃÅÖ»ÕÐÆ¸5ÃûÖ°¹¤£¬³¬¹ý¼Æ»®Ôò±¨³ö´íÎóÐÅÏ¢
*/
create or replace trigger limitEmpCount
before insert on emp
for each row
declare
pCount number;-- ±£´æÃ¿¸ö²¿ÃŵÄÔ±¹¤Êý
begin
select count(*) into pcount from emp where deptno=:new.deptno;
if pcount > 5 then raise_application_error(-20004,'²¿ÃÅ:' || :new.deptno || ' Ô±¹¤ÒÑÓÐ5ÈË');
end if;
end;
?