oracle “调用存储过程失败”!!!急

Josir 2009-03-06 03:31:24
create or replace procedure pr_importwatadata(par_year char,par_period char) is
begin
delete from xh_watadata;
insert into xh_watadata
(
cyear,
cperiod,
pk_deptdoc,
deptcode,
deptname,
psnid,
psncode,
psnname,
f_16,
f_17,
f_21
)
select
a.cyear,
a.cperiod,
c.pk_deptdoc,
c.deptcode,
c.deptname,
a.psnid,
b.psncode,
b.psnname,
d.jobname , --职务系数,后改成岗位
a.f_59 , --系数
a.f_21 --日工资
from wa_data a left join bd_psndoc b on a.psnid = b.pk_psndoc left join bd_deptdoc c on c.pk_deptdoc = b.pk_deptdoc left join om_job d on a.pk_om_job=d.pk_om_job
where
a.cyear = par_year and
a.cperiod = par_period and
a.classid = (select pk_wa_class from wa_waclass where vwaclassname='工资') and
a.dr = 0 and
b.psnclscope = 0 and
b.dr=0
order by
c.deptcode,
b.psncode;
end pr_importwatadata;

调用该存储过程报如下错误:传入的参数为:'2004' 、 '01'

java.rmi.RemoteException: 调用存储过程[NCHR.pr_importwatadata('1','2')]失败,失败原因:ORA-06550: 第 1 行, 第 12 列:
PLS-00225: 子程序或游标 'NCHR' 引用超出范围
ORA-06550: 第 1 行, 第 7 列:
PL/SQL: Statement ignored

使用到的建库脚本:

CREATE TABLE xh_watadata
(
cyear char(4),
cperiod CHAR(2),
pk_deptdoc CHAR(20),
deptcode varchar2(25),
deptname varchar2(25),
psnid char(20),
psncode varchar2(25),
psnname varchar2(25),
f_16 varchar2(100),
f_17 number(13,2),
f_21 number(13,2)
);


...全文
715 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
Josir 2009-03-09
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 gxlineji 的回复:]
如果在SQLPLUS 上能正确运行该存储过程,那么就不是存储过程的问题了!!

可以在这个语句上打个断点,
proc = conn.prepareCall(strTemp);

看看 strTemp 里的值有没有问题!
[/Quote]

你好, 程序中strTemp中得到 :{ call dbo.pr_quickImport(?,?,?)}
pr_quickImport是存储过程的名称,传入的是三个参数。
但是在
proc = conn.prepareCall(strTemp); 的下一步

if (parmeters != null) { for (int i=0;i <parmeters.length;i++) { proc.setString(i+1, parmeters[i]); } } //设置入参
proc.execute();
没有把参数传入,就抛出异常!
wanglei8 2009-03-07
  • 打赏
  • 举报
回复
如果从sqlplus里面调用该存储过程无误的话,那就是java程序的问题了
moonshowder 2009-03-07
  • 打赏
  • 举报
回复
在pl/sql developer 中能运行过程不?如果能执行就是组装过程中出错了
gxlineji 2009-03-06
  • 打赏
  • 举报
回复
如果在SQLPLUS 上能正确运行该存储过程,那么就不是存储过程的问题了!!

可以在这个语句上打个断点,
proc = conn.prepareCall(strTemp);

看看 strTemp 里的值有没有问题!
Josir 2009-03-06
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 gisinfo 的回复:]
其实很简单的存储过程


把两个SQL提出来运行能通过么?
不能就是SQL问题
[/Quote]

sql 语法能通过,但是客户端报错,后台也无法执行,如果单独提取存储过程里的SQL语句是可以执行的!不知道为什么原因???
gisinfo 2009-03-06
  • 打赏
  • 举报
回复
语法没问题
gisinfo 2009-03-06
  • 打赏
  • 举报
回复
其实很简单的存储过程



把两个SQL提出来运行能通过么?
不能就是SQL问题


Josir 2009-03-06
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 randy_ideal 的回复:]
可能是你外部程序传递参数的类型或长度有问题吧,你是用什么语言,两个参数如何传的?
[/Quote]

如下是传入参数:s1、s2

String s = aJTextField.getText();
if(!Tools.validInput(this, s, 6))
return;
if(NCOptionPane.showConfirmDialog(this, "\u4F60\u771F\u7684\u60F3\u5BFC\u5165[" + s + "]\u6708\u4EFD\u7684\u5DE5\u8D44\u6570\u636E\u5417?\u8FD9\u662F\u4E00\u4E2A\u975E\u5E38\u9700\u8981\u614E\u91CD\u8003\u8651\u7684\u64CD\u4F5C,\u56E0\u4E3A\u5B83\u5C06\u51B2\u6389\u4F60\u4EE5\u524D\u586B\u8FC7\u7684\u6570\u636E!!!!", "\u63D0\u793A", 0) == 1)
return;
String s1 = s.substring(0, 4);
String s2 = s.substring(4, 6);
try
{
//ChangHuaCommBO_Client.callProcedure("hr230_xch", "dbo.pr_importwatadata", new String[] {s1, s2});
//调用存储过程后台插入数据;
ChangHuaCommBO_Client.getIdataprotect().callProcedure("NCHR", "NCHR.pr_importwatadata", new String[] {s1, s2});



public void callProcedure(String procedureName, String[] parmeters) throws SQLException, nc.bs.pub.SystemException,java.rmi.RemoteException
{
Connection conn = null;
java.sql.CallableStatement proc = null;

String str_pars = procedureName + "(";
if(parmeters!=null)
{
for (int i=0; i<parmeters.length; i++) { if(parmeters[i]==null) { str_pars = str_pars + "null,"; } else{ str_pars = str_pars + "'" + parmeters[i] + "',";} }
str_pars = str_pars.substring(0,str_pars.length()-1);
}
str_pars = str_pars + ")";

System.out.println("ChangHuaCommDMO-->callProcedure(\"" + str_pars + "\")");
try
{
Class.forName(str_driver).newInstance();
conn = DriverManager.getConnection(str_url,str_user,str_pwd); //建立连接
String strTemp = "{ call " + procedureName + "(";
if(parmeters != null)
{
for(int i=0;i<parmeters.length;i++) { strTemp = strTemp + "?,"; }
strTemp = strTemp.substring(0,strTemp.length()-1);
}
strTemp = strTemp + ")}";

proc = conn.prepareCall(strTemp);
if (parmeters != null) { for (int i=0;i<parmeters.length;i++) { proc.setString(i+1, parmeters[i]); } } //设置入参
proc.execute();
}
catch(Exception ex)
{
ex.printStackTrace();
throw new java.rmi.RemoteException("调用存储过程[" + str_pars + "]失败,失败原因:" + ex.getMessage());
}
finally
{
try{ if (proc != null) { proc.close(); } }catch(Exception ex){}
try{ if (conn != null) { conn.close(); } }catch(Exception ex){}
}
}
Josir 2009-03-06
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 hdhai9451 的回复:]
create or replace procedure pr_importwatadata(par_year char,par_period char) is
begin
delete from xh_watadata;
insert into xh_watadata
(
cyear,
cperiod,
pk_deptdoc,
改为:
create or replace procedure pr_importwatadata(par_year in char(4),par_period in char(2)) is
begin
delete from xh_watadata;
insert into xh_watadata
(
cyear,
cperiod,
pk_deptdoc,

试试看
[/Quote]

兄弟,不行啊,还是有错的,第一行的语法也是通不过的
randy_ideal 2009-03-06
  • 打赏
  • 举报
回复
可能是你外部程序传递参数的类型或长度有问题吧,你是用什么语言,两个参数如何传的?
jlj84237485 2009-03-06
  • 打赏
  • 举报
回复
帮顶一下
Andy__Huang 2009-03-06
  • 打赏
  • 举报
回复
create or replace procedure pr_importwatadata(par_year char,par_period char) is
begin
delete from xh_watadata;
insert into xh_watadata
(
cyear,
cperiod,
pk_deptdoc,
改为:
create or replace procedure pr_importwatadata(par_year in char(4),par_period in char(2)) is
begin
delete from xh_watadata;
insert into xh_watadata
(
cyear,
cperiod,
pk_deptdoc,

试试看

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧