java中如何调用数据库的java程序调用存储过程程

&nbsp>&nbsp
&nbsp>&nbsp
&nbsp>&nbsp
java程序中调用数据库中的存储过程
摘要:publicstaticvoidaa(StringjobNo)throwsException{Stringsql=&CALLdatabaseName.procedureName(?)&;Connectionconn=try{conn=getConnection();CallableStatementcs=conn.prepareCall(sql);cs.setString(1,jobNo);cs.execute();}catch(Exceptio
public static void aa(String jobNo) throws Exception {
String sql =&CALL databaseName.procedureName(?)&;
Connection conn =
conn = getConnection();
CallableStatement cs = conn.prepareCall(sql);
cs.setString(1, jobNo);
cs.execute();
} catch (Exception ex) {
ex.printStackTrace();
} finally {
if (conn != null) {
conn.close();
以上是的内容,更多
的内容,请您使用右上方搜索功能获取相关信息。
若你要投稿、删除文章请联系邮箱:zixun-group@service.aliyun.com,工作人员会在五个工作日内给你回复。
云服务器 ECS
可弹性伸缩、安全稳定、简单易用
&40.8元/月起
预测未发生的攻击
&24元/月起
为您提供0门槛上云实践机会
你可能还喜欢
你可能感兴趣
阿里云教程中心为您免费提供
java程序中调用数据库中的存储过程相关信息,包括
的信息,所有java程序中调用数据库中的存储过程相关内容均不代表阿里云的意见!投稿删除文章请联系邮箱:zixun-group@service.aliyun.com,工作人员会在五个工作日内答复
售前咨询热线
支持与服务
资源和社区
关注阿里云
International在JAVA中如何调用存储过程_百度文库
赠送免券下载特权
10W篇文档免费专享
部分付费文档8折起
每天抽奖多种福利
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
在JAVA中如何调用存储过程
阅读已结束,下载本文需要
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,同时保存到云知识,更方便管理
加入VIP
还剩2页未读,
定制HR最喜欢的简历
你可能喜欢这两天折腾着做了个用oracle的java存储过程执行系统命令的功能,在网上找了很多资料,总算解决了,整理出来,顺便复习一下
需求是: 在数据库中有个job定时执行某任务,其中需要调用操作系统命令生成多个文件夹和文件内容,并把他们打包.
环境是: linux AS3 ,oracle 9.2.0.4
实现过程:
1、 用sysdba用户赋予执行job的数据库用户权限,包括文件操作的权限和执行系统命令的权限,命令为:
SQL& exec dbms_java.grant_permission('USERNAME','SYS:java.io.FilePermission','&&ALL FILE&&','read,write,execute,delete');
SQL& exec dbms_java.grant_permission('USERNAME','SYS:java.lang.RuntimePermission','*','WriteFileDescriptor');
其中,USERNAME是数据库用户名,&&ALL FILE&&指所有文件
2、用执行job的用户登录,并编写java存储过程
java代码
public class RunCmd
{
public static int Run(String args)
{
Runtime rt = Runtime.getRuntime();
String os=System.getProperty("os.name").toLowerCase().trim();
String cmd[]={"/bin/sh","-c",args};
int rc = -1;
try{
&& if(rt!=null&&args!=null){
&&& P
&& if(os.startsWith("windows"))& //windows环境下
&&&& p = rt.exec(args);
& else
&&&& p=rt.exec(cmd);& //linux环境下,暂时不考虑其他环境
&&&& if(p!=null){
&&&&&& int bufSize = 4096;
&&&&&& BufferedInputStream bis =new BufferedInputStream(p.getInputStream(), bufSize);
&&&&&&
&&&&&& byte buffer[] = new byte[bufSize];
&&&&&& while ((len = bis.read(buffer, 0, bufSize)) != -1)
&&&&&& System.out.write(buffer, 0, len);
&&&&&& rc = p.waitFor();
&&&& }else{
&&&&&&& System.out.println("p is null");
&&&& }
&& }else{
&&&&& System.out.println("rt/args is null");
&& }&&
& }catch (Exception e)
& {
&&& e.printStackTrace();
&&& rc = -1;
& }&
& finally
& {
& System.out.println("rc="+rc);
&&
& }
& }
& }
其中,要注意的是在windows环境和linux环境对命令执行的不同,是因为linux下有重定向的问题。
oracle函数定义
create or replace function RUN_CMD(p_cmd in varchar2) return Number
As
language Java name 'RunCmd.Run(java.lang.String) return integer';
主任务过程
create or replace procedure tartask(pdtask in number,path in varchar2) Is
Cursor cur_code Is
Select code,title From pd_res Where task_id=
v_code Varchar2(10);
v_rc N
v_file Varchar2(400);
v_cmd Varchar2(4000);
v_str Varchar2(4000);
v_title Varchar2(500);
Begin
--在linux环境下
&& --创建任务主目录
&& v_cmd:='mkdir '||path||'/'||
&& v_rc:=run_cmd(v_cmd);
&&
&& --对每个资源,创建子目录
&& Open cur_
&&&& Loop
&&&&&& Begin
&&&&&& Fetch cur_code Into& v_code,v_
&&&&&& Exit When cur_code%N
&&&&&&&&&&& --code
&&&&&&&&&&& v_cmd:= 'mkdir '||path||'/'||pdtask||'/'||v_
&&&&&&&&&&& v_rc:=run_cmd(v_cmd);
&&&&&&&&&&&& --meta
&&&&&&&&&&& --mkdir meta
&&&&&&&&&&& v_cmd:= 'mkdir '||path||'/'||pdtask||'/'||v_code||'/meta';
&&&&&&&&&&& v_rc:=run_cmd(v_cmd);
&&&&&&&&&&& v_file:=path||'/'||pdtask||'/'||v_code||'/meta/dc.xml';
&&&&&&&&&&& -----------------------------------------------------------------------------------------
&&&&&&&&&&& --dc.xml
&&&&&&&&&&& --echo 123321 & d:\1.txt
&&&&&&&&&& -- v_cmd:='export LANG=utf-8';
&&&&&&&&&& -- v_rc:=run_cmd(v_cmd);
&&&&&&&&&&&
&&&&&&&&&&& v_str:='&?xml version=\"1.0\" encoding=\"utf-8\"?&';
&&&&&&&&&&& v_cmd:=' echo -E "'||v_str||'" & '||v_
&&&&&&&&&&& v_rc:=run_cmd(v_cmd);
&&&&&&&&&&& v_cmd:='echo -E "" && '||v_
&&&&&&&&&&& v_rc:=run_cmd(v_cmd);
&&&&&&&&&&&
&&&&&&&&&&& v_str:='&dublincore xmlns:dc=\"http://purl.org/dc/elements/1.0/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:dcterms=\"http://purl.org/dc/terms/\"&';
&&&&&&&&&&& v_cmd:= 'echo -E "'||v_str||'" && '||v_
&&&&&&&&&&& v_rc:=run_cmd(v_cmd);
&&&&&&&&&&&& v_cmd:='echo -E "" && '||v_
&&&&&&&&&&& v_rc:=run_cmd(v_cmd);
&&&&&&&&&&&
&&&&&&&&&&& v_str:='&dc:identifier&'||v_code||'&/dc:identifier&';
&&&&&&&&&&& v_cmd:= 'echo -E "'||v_str||'" && '||v_
&&&&&&&&&&& v_rc:=run_cmd(v_cmd);
&&&&&&&&&&&& v_cmd:='echo -E "" && '||v_
&&&&&&&&&&& v_rc:=run_cmd(v_cmd);
&&&&&&&&&&&
&&&&&&&&& --& v_str:='&dc:title&'||'中国 泰山'||'&/dc:title&';
&&&&&&&&&&& --v_cmd:= 'echo -E "'||v_str||'" && '||v_
&&&&&&&&&& -- v_rc:=run_cmd(v_cmd);
&&&&&&&&&& --& v_cmd:='echo -E "" && '||v_
&&&&&&&&& --& v_rc:=run_cmd(v_cmd);
&&&&&&&&&&&
&&&&&&&&&&& v_str:='&/dublincore&';
&&&&&&&&&&& v_cmd:= 'echo -E "'||v_str||'" && '||v_
&&&&&&&&&&& v_rc:=run_cmd(v_cmd);
&&&&&&&&&&&& v_cmd:='echo -E "" && '||v_
&&&&&&&&&&& v_rc:=run_cmd(v_cmd);
&&&&&& E
&&&& End L
&& Close cur_&
&& --打包创建好的目录
&& v_cmd:='tar -zcvf '||path||'/'||pdtask||'.tar.gz'||' '||path||'/'||
&& v_rc:=run_cmd(v_cmd);
这是在linux环境下的任务代码,windows环境下类似,就是输入的命令稍微有些不同,其中包括了目录创建,文件创建和写文件,注掉部分是因为中文问题解决不了,输入的中文都存成乱码,最后决定这个由人工来录入;
问题和总结
在这次解决过程中,遇到了几个问题
1、windows下和linux下调用系统命令的输入,windows下,命令形式为:cmd /c dir,整个是一个字符串输入,而在linux下,需要用{"/bin/sh","-c","ls"}这样的数组形式输入
2、创建并写文件,用echo xxx & filepath 命令
3、在用echo写文件的过程中,遇到了“&”符不能输入的问题,因为会被误认为是重定向符号&,在windows里,可以用在&前加^符号来解决,在linux下,用命令echo带参数 -E 解决
4、在用echo写文件时,换行,写入新行,在windows下,用 echo. & filepath,就是在echo后直接跟一个.号解决,在linux下,用 echo "" & filepath解决
5、echo的&是创建并写入,因此如果该文件存在,会被覆盖,如果需要在文件末添加数据,用&&代替&
6、就是中文的问题,目前还没有解决掉,把java类放到操作系统里执行写中文是没有问题的,echo进去没问题,但是放到oracle里写就会是乱码,不知道是什么地方需要设置,实在是把我折腾坏了,先放着,以后或许忽然就看到解决方法了
浏览: 20604 次
来自: 杭州
你好,请问你的配置build path,是如何配置的?请教下高 ...
文笔很好啊,我还以为是作家那
很喜欢这篇文章,谢谢共享
不错, 学习了, 对我很有帮助,
噢,我也遇到这个问题啦
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'您所在位置: &
&nbsp&&nbsp&nbsp&&nbsp
Java调用SQLServer的存储过程详解..doc 7页
本文档一共被下载:
次 ,您可全文免费在线阅读后下载本文档。
下载提示
1.本站不保证该用户上传的文档完整性,不预览、不比对内容而直接下载产生的反悔问题本站不予受理。
2.该文档所得收入(下载+内容+预览三)归上传者、原创者。
3.登录后可充值,立即自动返金币,充值渠道很便利
Java调用SQLServer的存储过程详解.
你可能关注的文档:
··········
········
Java调用SQL Server的存储过程详解
本文较长,包含了如下几部分
使用不带参数的存储过程
使用带有输入参数的存储过程
使用带有输出参数的存储过程
使用带有返回状态的存储过程
使用带有更新计数的存储过程
1使用不带参数的存储过程?
使用?JDBC?驱动程序调用不带参数的存储过程时,必须使用?call?SQL?转义序列。不带参数的?call?转义序列的语法如下所示:? {call?procedure-name}?? 作为实例,在?SQL?Server?2005?AdventureWorks?示例数据库中创建以下存储过程:?
CREATE?PROCEDURE?GetContactFormalNames? AS BEGIN ???SELECT?TOP?10?Title?+?'?'?+?FirstName?+?'?'?+?LastName?AS?FormalName? ???FROM?Person.Contact END
此存储过程返回单个结果集,其中包含一列数据(由?Person.Contact?表中前十个联系人的称呼、名称和姓氏组成)。?
在下面的实例中,将向此函数传递?AdventureWorks?示例数据库的打开连接,然后使用?executeQuery?方法调用?GetContactFormalNames?存储过程。?
public?static?void?executeSprocNoParams(Connection?con)?{ ???try?{ ??????Statement?stmt?=?con.createStatement(); ??????ResultSet?rs?=?stmt.executeQuery(&{call?dbo.GetContactFormalNames}&);
??????while?(rs.next())?{ ?????????System.out.println(rs.getString(&FormalName&)); ??????} ??????rs.close(); ??????stmt.close(); ???} ???catch?(Exception?e)?{ ??????e.printStackTrace(); ???} }
2使用带有输入参数的存储过程
使用?JDBC?驱动程序调用带参数的存储过程时,必须结合?SQLServerConnection?类的?prepareCall?方法使用?call?SQL?转义序列。带有?IN?参数的?call?转义序列的语法如下所示:? {call?procedure-name[([parameter][,[parameter]]...)]}?
构造?call?转义序列时,请使用??(问号)字符来指定?IN?参数。此字符充当要传递给该存储过程的参数值的占位符。可以使用?SQLServerPreparedStatement?类的?setter?方法之一为参数指定值。可使用的?setter?方法由?IN?参数的数据类型决定。? 向?setter?方法传递值时,不仅需要指定要在参数中使用的实际值,还必须指定参数在存储过程中的序数位置。例如,如果存储过程包含单个?IN?参数,则其序数值为?1。如果存储过程包含两个参数,则第一个序数值为?1,第二个序数值为?2。? 作为如何调用包含?IN?参数的存储过程的实例,使用?SQL?Server?2005?AdventureWorks?示例数据库中的?uspGetEmployeeManagers?存储过程。此存储过程接受名为?EmployeeID?的单个输入参数(它是一个整数值),然后基于指定的?EmployeeID?返回雇员及其经理的递归列表。下面是调用此存储过程的?Java?代码:
? public?static?void?executeSprocInParams(Connection?con)?{ ???try?{ ??????PreparedStatement?pstmt?=?con.prepareStatement(&{call?dbo.uspGetEmployeeManagers(?)}&); ??????pstmt.setInt(1,?50); ??????ResultSet?rs?=?pstmt.executeQuery(); ??????while?(rs.next())?{ ?????????System.out.println(&EMPLOYEE:&); ?????????System.out.println(rs.getString(&LastName&)?+?&,?
正在加载中,请稍后...
53页28页17页18页30页37页38页24页18页24页没有更多推荐了,
不良信息举报
举报内容:
JAVA通过调用数据库函数调用存储过程
举报原因:
原文地址:
原因补充:
最多只允许输入30个字
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!

我要回帖

更多关于 在java中调用存储过程 的文章

 

随机推荐