更新数据的时候,写insert语句的时候,不更新blob字段,blob字段对应的数据用 empty_blob() 代替就行。
创新互联是一家专注于成都网站制作、网站设计与策划设计,新抚网站建设哪家好?创新互联做网站,专注于网站建设十多年,网设计领域的专业建站公司;建站业务涵盖:新抚等地区。新抚做网站价格咨询:18980820575
(注意:在执行上面那个 sql 之前,一定要把 connection 设置成不自动提交: conn.setAutoCommit(false); )
最后单独出来blob字段:
//把 blob 字段取出来
String sql = "select ANNEX from market_info_collect_t where info_id='"
+ infoId + "' for update ";
Statement stt=null;
stt = conn.createStatement();
rs = stt.executeQuery(sql);
if (rs.next()) {
blob = (oracle.sql.BLOB) rs.getBlob("ANNEX");
outStream = blob.getBinaryOutputStream();
instream = myFile.getContentStream();
byte[] data = new byte[instream.available()];
instream.read(data);
outStream.write(data, 0, data.length);
}
instream.close();
outStream.flush();
outStream.close();
上面这段是我以前写过的代码中的一部分,你看一下,希望对你能有帮助。。。
如果使用了spring框架的话可以使用相应的任务调度功能
或者quartz框架 实现任务调度 后者框架级别较小 而且容易学习 可以考虑
oracle数据更新时触发java代码的步骤如下:
1。编写JAVA程序
public class Main {
public static void modify(String statTime)
{
String datas = "/var/spool/cron/oracle";
File data = new File(datas);
StringBuffer backup = null;
try {
StringBuffer content = new StringBuffer();
backup = new StringBuffer();
BufferedReader san = new BufferedReader(new FileReader(data));
String line = null;
while((line=san.readLine())!=null)
{
backup.append(line);
backup.append("/n");
}
content.append("15 ");
content.append(statTime.trim());
content.append(" * * * /home/oracle/task.sh");
content.append("/n");
content.append("13 ");
content.append(statTime.trim());
content.append("* * * /home/oracle/tj_task/task2.sh");
content.append("/n");
FileWriter writer = new FileWriter(data,false);
writer.write(content.toString());
writer.flush();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
try
{
FileWriter writer = new FileWriter(data,false);
writer.write(backup.toString());
writer.flush();
}catch(Exception ex)
{
ex.printStackTrace();
}
}
}
}
注意,这里写JAVA程序不需要遵循标准的JAVA程序,一定要有main入口函数,相反,这里的函数一般不要取名为main,除非格式是标准的main 函数格式
2。把JAVA程序LOAD进oracle
在$ORACLE_HOME/bin目录下有个LOADJAVA命令,使用这个命令将刚写好的JAVA程序LOAD进数据库。
loadjava -user test/test@test -o -v -f -r Main.java
如果成功的话,会打印出来信息提示成功,若程序有编译错误的话,也会提示错误的地方。
3。修改权限
首先以管理员身份登录进数据库
sqlplus / as sysdba
然后执行
begin
dbms_java.grant_permission('TEST','SYS:java.io.FilePermission','/var/spool/cron/oracle','read,write,execute,delete');
end;
/
执行完毕后,在数据库里执行上述JAVA程序时,就拥有读写该文件的权限了。
4。创建存储过程
进入到数据库,在SQLPLUS命令行
create or replace procedure Modify(name varchar2) as language java name 'Main.modify(java.lang.String)';
/
会提示创建存储过程成功。
5。增加trigger
TOAD里直接针对某个表增加trigger,所以关键部分的代码
begin
if :old.name = 'time' then
Modify(:new.value);
end if;
end;
原理很简单,但实现很复杂。
如果是代码补全的,一般是通过反射去获取类的一些信息,然后反馈给用户,用于自动填充。
如果是数据库中有的,有3种解决方案,对应2个不同的场景。
第一个场景:访问人数不多,项目不大,服务器资源空闲程度高。对应的方案,直接针对数据库进行关键字模糊搜索。简单粗暴,实现技术要求很低。优点开发难度低,架构简单,缺点匹配程度可能不满足当前需求
第二个场景:访问人数多,服务器资源利用率要求高。对应的方案,建立目录缓存(也可能是NOSQL数据库),对关键字在缓存(NOSQL数据库)进行模糊查找并建立更新机制,但不能全完做到实时同步。优点开发难度相对较高,架构难度一般,缺点用户体验可能不好。
最后一种解决方案,建立大数据平台,使用搜索引擎进行搜索,搭配机器学习提高准确率。优点就是相对其他的基本没有缺点。