【问题标题】:Calling a Stored Procedure Using Oracle SQL Developer使用 Oracle SQL Developer 调用存储过程
【发布时间】:2015-06-01 13:13:56
【问题描述】:

在运行 Java 代码时,我无法将服务器输出设置为 ON。但我可以连接到 Oracle SQL 数据库。

出现以下错误:

****java.lang.NullPointerException DB 连接成功 java.sql.SQLSyntaxErrorException: ORA-00922: 缺失或无效 选项****

请给我一个解决方案。

代码:

ResultSet rs= DS_DB.getResultSet("set serveroutput on");
DS_DB.connectDatabase();

String command = "{call sfmd.getNativeIdsForXID('EDDAC')}";
CallableStatement cstmt = connection.prepareCall(command);
cstmt.execute();
System.out.println("Cstmt :"+command);'

谢谢

【问题讨论】:

    标签: java sql oracle jdbc


    【解决方案1】:

    set serveroutput on 是 SQL*plus 命令,在 JDBC 驱动程序中不可用。 JDBC 驱动程序不支持 dbms_output。 Tom Kyte 的网站有一个很好的解释和可能的解决方案。 https://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:45027262935845

    【讨论】:

    • 这并不完全正确,您可以从 dbms_output 包中捕获 Oracle 输出。我会把它作为另一个答案发布。
    • @Mike JDBC 没有本地捕获 dbms_output 的接口。在链接中,我提供了与您的建议类似的解决方案。使用 PL/SQL dbms_output.get_line 包。
    【解决方案2】:

    有点不清楚你想在这里做什么。

    如果您在寻找结果集,Oracle 不返回结果集,您需要将您的参数之一定义为 SYS_REFCURSOR 类型的输出参数。

    String command = "{call sfmd.getNativeIdsForXID(?,?)}";
    CallableStatement cstmt = connection.prepareCall(command);
    cstmt.registerOutParameter(1, ORACLE_CURSOR_TYPE);
    cstmt.setObject(2, 'EDDAC');
    cstmt.execute();
    
    ResultSet rs = (ResultSet) cstmt.getObject(1);
    

    在您的存储过程中,定义输出参数

    CREATE OR REPLACE PROCEDURE "getNativeIdsForXID" (
        NativeIdsCursor OUT SYS_REFCURSOR, 
        P_XID VARCHAR(20)) IS
    
      open NativeIdsCursor for 
      SELECT ID from SomeTable where XID = P_XID;
    
    END "getNativeIdsForXID";
    

    如果您在存储过程中使用 dbms_output 包,您也可以获得输出。

    这里有几个实用程序可以做到这一点。您启用 dbms 输出,然后像往常一样执行您的过程,然后您可以打印输出。

        public static void enableDBMSOutput(DBConnection conn, int buffer_size) {
    
            try {
    
                String SQLString = null;
    
                if (buffer_size > 0)
                    SQLString = "sys.dbms_output.enable(?)";
                else
                    //SQLString = "{call sys.dbms_output.enable(buffer_size => NULL) }"; // Unlimited
                    SQLString = "sys.dbms_output.enable(buffer_size => NULL)"; // Unlimited
    
                CallableStatement stmt = conn.getCallableStatement(true, SQLString);
    
                if (buffer_size > 0)
                    stmt.setInt(1,buffer_size);
    
                stmt.execute();
    
                System.out.println("DBMS_OUTPUT has been Enabled!");
    
            } catch (SQLException e) {
                System.out.println("Problem occurred enabling dbms_output: " + e.toString());
            }
        }
    
    
        public static void disableDBMSOutput(DBConnection conn) {
    
            try {
    
                String SQLString = "sys.dbms_output.disable()";
    
                CallableStatement stmt = conn.getCallableStatement(true, SQLString);
    
                stmt.execute();
    
                System.out.println("DBMS_OUTPUT has been Disabled!");
    
            } catch (SQLException e) {
                System.out.println("Problem occurred disabling dbms_output: " + e.toString());
            }
        }
    
    
        public static void printDBMSOutput(DBConnection conn) {
    
            try {
                String SQLString = "sys.dbms_output.get_line(?,?)";
    
                CallableStatement stmt = conn.getCallableStatement(true, SQLString);
    
                stmt.registerOutParameter(1,java.sql.Types.VARCHAR);
                stmt.registerOutParameter(2,java.sql.Types.NUMERIC);
    
                int status = 0;
                String output = null;
    
                do {
                    stmt.execute();
                    output = stmt.getString(1);
                    status = stmt.getInt(2);
    
                    if (null != output)
                        System.out.println("dbms_output: " + output);
    
                } while (status == 0);
    
            } catch (Exception e) {
                System.out.println("Problem occurred during print_dbms_output: " + e.toString());
            }
        }
    
        public static String [] getDBMSOutput(DBConnection conn) {
    
            try {
                String SQLString = "{call sys.dbms_output.get_line(?,?)}";
    
                CallableStatement stmt = conn.getCallableStatement(true, SQLString);
    
                stmt.registerOutParameter(1,java.sql.Types.VARCHAR);
                stmt.registerOutParameter(2,java.sql.Types.NUMERIC);
    
                int status = 0;
                String output = null;
                ArrayList <String> dbmsOutput = new ArrayList<String>();
                do {
                    stmt.execute();
                    output = stmt.getString(1);
                    status = stmt.getInt(2);
    
                    if (null != output)
                        dbmsOutput.add(output);
    
                } while (status == 0);
    
                return (String [])dbmsOutput.toArray();
    
            } catch (Exception e) {
                System.out.println("Problem occurred during print_dbms_output: " + e.toString());
                return null;
            }
        }
    }
    
    public CallableStatement getCallableStatement(boolean isProcedure, String sqlString){
        try {
            if (isProcedure) {
                String query = "{ call " + sqlString + " }";
    
                return dbConn.prepareCall(query);
            } else
                return dbConn.prepareCall(sqlString);
    
        } catch (SQLException e) {
            e.printStackTrace();
            return null;
        }
    }
    

    【讨论】:

    • 嗨,迈克,我遇到了 DBConnection 的导入问题无法解析为公共静态 void enableDBMSOutput(DBConnection conn, int buffer_size) 的类型
    • @BhaskarReddy DBConnection是我创建的一个类,可以改成Connection(java.sql)
    • @BhaskarReddy getCallableStatement 基本上做了一个 conn.prepareCall(SqlString)
    • @BhaskarReddy 添加了 getCallableStatement 代码,但我有一个 Connection 包装在一个更大的功能类 (DBConnection) 中,因此您需要获取代码并自己制作,但所有组件都在那里您需要做的是,它不会只是通过剪切/粘贴来运行,尽管它并没有那么遥远。静态函数实际上是称为 JDBCUtils 的实用程序类(独立于 DBConnection)的一部分。 getCallableStatement 是我的 DBConnection 类的一部分。
    猜你喜欢
    • 2011-03-09
    • 2012-05-16
    • 2013-01-28
    • 1970-01-01
    • 2021-12-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-09
    • 2011-06-07
    相关资源
    最近更新 更多