我已经使用用户名系统建立了到oracle数据库的连接
连接成功,我能够执行所有基本的sql操作,例如insert,update,delete ...,但是我无法执行存储过程。 当我尝试从netbeans调用存储过程时,出现了一些错误。请帮助我解决这个问题。
netbeans按钮执行的代码
int eid = Integer.parseInt(eidtf.getText());
String ename = enametf.getText();
String dob = dobtf.getText();
String sex = male.getText();
if (female.isEnabled() == true) {
sex = female.getText();
}
String designation = destf.getText();
int basic = Integer.parseInt(basictf.getText());
//String sql = "exec calc(" +eid +","+ basic +",'"+ ename +"','"+ sex +"','"+ dob +"','"+ designation +"')";
try {
CallableStatement cs = con.prepareCall("{call calc(? ? ? ? ? ?)}");
cs.setInt(2, 50);
cs.setInt(1, 126);
cs.setString(3, ename);
cs.setString(4, sex);
cs.setString(5, dob);
cs.setString(6, designation);
cs.execute();
JOptionPane.showMessageDialog(this, "Insertion has been done successfully!!!");
} catch (SQLException ex) {
JOptionPane.showMessageDialog(this, "Error: " + ex.getMessage() + "\nCause: " + ex.getCause() + "\nError Code: " + ex.getErrorCode() + "\nStack: " + ex.getClass());
}
下表和过程:
create table emp_payroll
(eid number(4) primary key,
ename varchar(20),
dob date,
sex char(1),
designation varchar(20),
basic number(5,2),
da number(5,2),
hra number(5,2),
pf number(5,2),
mc number(5,2),
gross number(5,2),
ded number(5,2),
net_pay number(5,2)
);
create or replace procedure calc
(x_eid in emp_payroll.eid%type :=123,
x_basic in emp_payroll.basic%type,
x_name in emp_payroll.ename%type,
x_sex in emp_payroll.ename%type,
x_dob in emp_payroll.ename%type,
x_des in emp_payroll.ename%type
)
as
x_da emp_payroll.basic%type;
x_hra emp_payroll.basic%type;
x_pf emp_payroll.basic%type;
x_mc emp_payroll.basic%type;
x_gross emp_payroll.basic%type;
x_ded emp_payroll.basic%type;
x_net_pay emp_payroll.basic%type;
begin
x_da:=.6* x_basic;
x_hra:=.6* x_basic;
x_pf:=.6* x_basic;
x_mc:=.6* x_basic;
x_gross:=x_basic+x_da+x_hra;
x_ded:=x_pf+x_mc;
x_net_pay:=x_gross-x_ded;
insert into emp_payroll values(x_eid,x_name,x_dob,x_sex,x_des,x_basic,x_da,x_hra,x_pf,x_mc,x_gross,x_ded,x_net_pay) ;
end calc;
/
当我在sqlplus中运行以下命令时:
exec calc(123,50,'Har','m','12-apr-2000','student');
我正在获取预期的o / p。 但是当我在netbeans中做同样的事情时 我没有得到预期的操作,但出现了一些错误。
我们非常感谢您的帮助。 预先感谢...
答案 0 :(得分:2)
CallableStatement
的Javadoc说:
用于执行SQL存储过程的接口。 JDBC API提供了存储过程SQL转义语法,该语法允许所有RDBMS以标准方式调用存储过程。此转义语法的一种形式包含结果参数,而另一种形式不包含结果参数。如果使用,则结果参数必须注册为OUT参数。其他参数可用于输入,输出或两者。参数按编号顺序引用,第一个参数为1。
{?= call <procedure-name>[(<arg1>,<arg2>, ...)]} {call <procedure-name>[(<arg1>,<arg2>, ...)]}
如您所见,参数用逗号分隔,几乎与任何以任何语言将参数传递给函数/过程/方法的语法相同。
这意味着您的代码应为:
CallableStatement cs = con.prepareCall("{call calc(?,?,?,?,?,?)}");