存储过程建成功了,我在用java调用的时候又报错了。
首先我的存储过程如下:create or replace procedure query_student
is
v_name varchar2(20);
begin
select name into v_name from st_t_student where id=3012;
dbms_output.put_line(v_name);
end query_student;我的java代码如下:public void test(){
conn = JDBCUtils.getConnection("miniWeb", "miniWeb");
try {
conn.setAutoCommit(false);
//调用存储过程
cstmt = conn.prepareCall("{call query_student}");
rs = cstmt.executeQuery();
while(rs.next()){
System.out.println(rs.getString("v_name"));
}
conn.commit();
} catch (SQLException e) {
e.printStackTrace();
try {
conn.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
}finally{
JDBCUtils.closeConnection(rs, pstmt, conn);
}
}我的错误信息如下:java.sql.SQLException: ORA-00900: invalid SQL statement at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:125)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:305)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:272)
at oracle.jdbc.driver.T4C8Odscrarr.receive(T4C8Odscrarr.java:203)
at oracle.jdbc.driver.T4CCallableStatement.do_describe(T4CCallableStatement.java:604)
at oracle.jdbc.driver.OracleStatement.get_column_index(OracleStatement.java:3037)
at oracle.jdbc.driver.OracleResultSetImpl.findColumn(OracleResultSetImpl.java:1861)
at oracle.jdbc.driver.OracleResultSet.getString(OracleResultSet.java:1559)
at com.sinosoft.javase.ProcedureTest.test(ProcedureTest.java:36)
at com.sinosoft.javase.ProcedureTest.main(ProcedureTest.java:53)
首先我的存储过程如下:create or replace procedure query_student
is
v_name varchar2(20);
begin
select name into v_name from st_t_student where id=3012;
dbms_output.put_line(v_name);
end query_student;我的java代码如下:public void test(){
conn = JDBCUtils.getConnection("miniWeb", "miniWeb");
try {
conn.setAutoCommit(false);
//调用存储过程
cstmt = conn.prepareCall("{call query_student}");
rs = cstmt.executeQuery();
while(rs.next()){
System.out.println(rs.getString("v_name"));
}
conn.commit();
} catch (SQLException e) {
e.printStackTrace();
try {
conn.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
}finally{
JDBCUtils.closeConnection(rs, pstmt, conn);
}
}我的错误信息如下:java.sql.SQLException: ORA-00900: invalid SQL statement at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:125)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:305)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:272)
at oracle.jdbc.driver.T4C8Odscrarr.receive(T4C8Odscrarr.java:203)
at oracle.jdbc.driver.T4CCallableStatement.do_describe(T4CCallableStatement.java:604)
at oracle.jdbc.driver.OracleStatement.get_column_index(OracleStatement.java:3037)
at oracle.jdbc.driver.OracleResultSetImpl.findColumn(OracleResultSetImpl.java:1861)
at oracle.jdbc.driver.OracleResultSet.getString(OracleResultSet.java:1559)
at com.sinosoft.javase.ProcedureTest.test(ProcedureTest.java:36)
at com.sinosoft.javase.ProcedureTest.main(ProcedureTest.java:53)
ResultSet rs = stmt.executeQuery("{call query_student}");
试试
CallableStatement cstmt = con.prepareCall("{call query_student)}");
cstmt.execute();
System.out.println(cstmt.getString(1));
试试
------------->这里貌似需要括号,有点忘了
cstmt = conn.prepareCall("{call query_student()}");
少url
cstmt.setString(1,"aa");//第一个必须是输入的,不能是输出
cstmt=registerOutParameter(2,java.sql.Types.VARCHAR);//输出
stmt.executeUpdate();
String val=cstmt.getString(2);
/*
* file: TestProcedure.java
* class: TestProcedure
*
* description:
*
* @author: leisore
* @version: V1.0.0
*/
package cn.leisore.daily._2010_06_03;import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;public class TestProcedure { public TestProcedure() {
super();
} public static void main(String[] args) throws ClassNotFoundException {
Connection conn=null;
ResultSet rs=null;
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
conn = DriverManager.getConnection(
"jdbc:oracle:thin:@127.0.0.1:1521:leisore", "leisore",
"leisore");
conn.setAutoCommit(false);
// 调用存储过程
CallableStatement cstmt = conn.prepareCall("{call query_student}");
rs = cstmt.executeQuery();
while (rs.next()) {
System.out.println(rs.getString("v_name"));
}
conn.commit();
} catch (SQLException e) {
e.printStackTrace();
try {
conn.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
} finally {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
} }java.sql.SQLException: 无法对 PLSQL 语句执行提取: next
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:146)
at oracle.jdbc.driver.OracleResultSetImpl.next(OracleResultSetImpl.java:192)
at cn.leisore.daily._2010_06_03.TestProcedure.main(TestProcedure.java:36)
public void test(){
conn = JDBCUtils.getConnection("miniWeb", "miniWeb");
try {
conn.setAutoCommit(false);
//调用存储过程
//Statement stmt = conn.createStatement();
//rs = stmt.executeQuery("{call query_student}");
cstmt = conn.prepareCall("{call query_student()}");
cstmt.registerOutParameter(1, Types.VARCHAR);
cstmt.execute();
System.out.println(cstmt.getString(1));
conn.commit();
} catch (SQLException e) {
e.printStackTrace();
try {
conn.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
}finally{
JDBCUtils.closeConnection(rs, pstmt, conn);
}
}java.sql.SQLException: 无效的列索引
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:125)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:162)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:227)
at oracle.jdbc.driver.OracleCallableStatement.registerOutParameterInternal(OracleCallableStatement.java:117)
at oracle.jdbc.driver.OracleCallableStatement.registerOutParameter(OracleCallableStatement.java:253)
at oracle.jdbc.driver.OracleCallableStatement.registerOutParameter(OracleCallableStatement.java:333)
at com.sinosoft.javase.ProcedureTest.test(ProcedureTest.java:38)
at com.sinosoft.javase.ProcedureTest.main(ProcedureTest.java:56)
cstmt.execute();
create or replace procedure query_student
is
v_name varchar2(20);
begin
select name into v_name from st_t_student where id=3012;
-- dbms_output.put_line(v_name); 这句不要呢
end query_student;
下面这样就可以了:public void queryStudent(){
conn = JDBCUtils.getConnection("miniWeb", "miniWeb");
try {
conn.setAutoCommit(false);
//调用存储过程
//Statement stmt = conn.createStatement();
//rs = stmt.executeQuery("{call query_student}");
cstmt = conn.prepareCall("{call query_student()}");
//cstmt.registerOutParameter(1, Types.VARCHAR);
cstmt.execute();
//System.out.println(cstmt.getString(1));
conn.commit();
} catch (SQLException e) {
e.printStackTrace();
try {
conn.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
}finally{
JDBCUtils.closeConnection(rs, cstmt, conn);
}
}
create or replace procedure p_query(v_i in int,v_name out varchar2)
is
begin
select ename into v_name from emp where empno=7900 and 1=v_i;
end p_query;
package com.abing.test;import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;public class P_test { public P_test() {
super();
} public static void main(String[] args) throws ClassNotFoundException {
Connection conn=null;
ResultSet rs=null;
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
conn = DriverManager.getConnection(
"jdbc:oracle:thin:@127.0.0.1:1521:orcl", "scott",
"tiger");
conn.setAutoCommit(false);
// 调用存储过程
CallableStatement cstmt = conn.prepareCall("{call p_query(?,?)}");
cstmt.setInt(1,1);
cstmt.registerOutParameter(2, Types.VARCHAR);
cstmt.execute();
String name = cstmt.getString(2);
System.out.println(name);
conn.commit();
} catch (SQLException e) {
e.printStackTrace();
try {
conn.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
} finally {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
} }}
输出结果:JAMES
返回结果集
create or replace package pa_query as
type p_cursor is ref cursor;
end pa_query;
/
create or replace procedure p_query(v_cursor out pa_query.p_cursor)
is
begin
open v_cursor for select * from emp;
end p_query;package com.abing.test;import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;import oracle.jdbc.OracleTypes;public class P_test { public P_test() {
super();
} public static void main(String[] args) throws ClassNotFoundException {
Connection conn=null;
ResultSet rs=null;
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
conn = DriverManager.getConnection(
"jdbc:oracle:thin:@127.0.0.1:1521:orcl", "scott",
"tiger");
conn.setAutoCommit(false);
// 调用存储过程
CallableStatement cstmt = conn.prepareCall("{call p_query(?)}");
//cstmt.setInt(1,1);
cstmt.registerOutParameter(1, OracleTypes.CURSOR);
cstmt.execute();
rs = (ResultSet) cstmt.getObject(1);
while(rs.next()) {
String name = rs.getString("ename");
System.out.println(name);
}
conn.commit();
} catch (SQLException e) {
e.printStackTrace();
try {
conn.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
} finally {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
} }}
呵呵,这个输入参数,也不是必须的
...
create or replace procedure p_query(v_name out varchar2)
...CallableStatement cstmt = conn.prepareCall("{call p_query(?)}");
//cstmt.setInt(1,1);
cstmt.registerOutParameter(1, Types.VARCHAR);
cstmt.execute();
String name = cstmt.getString(1);
System.out.println(name);
public void queryStudent(){
conn = JDBCUtils.getConnection("miniWeb", "miniWeb");
try {
conn.setAutoCommit(false);
//调用存储过程
cstmt = conn.prepareCall("{call query_student(?)}");
cstmt.registerOutParameter(1, Types.VARCHAR);
cstmt.execute();
System.out.println(cstmt.getString(1));
conn.commit();
} catch (SQLException e) {
e.printStackTrace();
try {
conn.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
}finally{
JDBCUtils.closeConnection(rs, cstmt, conn);
}
}
as
cname varchar2(40);
cpwd varchar2(16);
begin
if(selType = 'IN_NAME')then
select Oname,Opwd into cname,cpwd from operator where Oname = name;
elsif(selType ='IN_NAME_PWD')then
select Oname,Opwd into cname,cpwd from operator where Oname = name and Opwd = pwd;
end if;
end;
我也遇到相同的问题了都在么。。这个是我的存储过程,返回多个值。。
java代码调用存储过程
public static Collection selOperator(String name, String pwd,
OperatorSelType selType) {
// 连接数据库
Connection con = ConnectionManager.getConnection();
CallableStatement cst = null;
ResultSet rs = null;
// 建一个操作员列表
Collection<Operator> opc = new ArrayList<Operator>();
try {
String proc = "{call proc_selOperator ('"+name+"','"+pwd
+"','"+ selType+"')}";
// 取得操作员表数据
cst = con.prepareCall(proc);
rs = cst.executeQuery();
while (rs.next()) {
Operator op = new Operator();
op.setName(rs.getString("Oname"));
op.setPwd(rs.getString("Opwd"));
opc.add(op);
}
} catch (SQLException ex) {
ex.printStackTrace();
} finally {
ConnectionManager.closeResultSet(rs);
ConnectionManager.closeStatement(cst);
ConnectionManager.closeConnection(con);
}
return opc;
}
出现java.sql.SQLException: ORA-00900: invalid SQL statement at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:125)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:305)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:272)
at oracle.jdbc.driver.T4C8Odscrarr.receive(T4C8Odscrarr.java:203)
at oracle.jdbc.driver.T4CCallableStatement.do_describe(T4CCallableStatement.java:604)
at oracle.jdbc.driver.OracleStatement.get_column_index(OracleStatement.java:3047)
at oracle.jdbc.driver.OracleResultSetImpl.findColumn(OracleResultSetImpl.java:1861)
at oracle.jdbc.driver.OracleResultSet.getString(OracleResultSet.java:1559)
at cn.waycool.contrl.DBWorker.selOperator(DBWorker.java:53)
at cn.waycool.frame.Login.actionPerformed(Login.java:99)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1849)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2169)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:420)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:258)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:234)
at java.awt.Component.processMouseEvent(Component.java:5488)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3093)
at java.awt.Component.processEvent(Component.java:5253)
at java.awt.Container.processEvent(Container.java:1966)
at java.awt.Component.dispatchEventImpl(Component.java:3955)
at java.awt.Container.dispatchEventImpl(Container.java:2024)
at java.awt.Component.dispatchEvent(Component.java:3803)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4212)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3892)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3822)
at java.awt.Container.dispatchEventImpl(Container.java:2010)
at java.awt.Window.dispatchEventImpl(Window.java:1766)
at java.awt.Component.dispatchEvent(Component.java:3803)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:463)
at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:234)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:163)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:157)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:149)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:110)