Oracle Java 存储过程命令行交互

Posted

技术标签:

【中文标题】Oracle Java 存储过程命令行交互【英文标题】:Oracle Java Stored Procedure Command-line Interaction 【发布时间】:2009-07-21 13:50:40 【问题描述】:

我有一个有趣的要求。

我们需要在 Java 存储过程中进行命令行交互。尽管使用dbms_java.grant_permission 命令授予了适当的权限,但我遇到了java.io.IOException,我使用java.io.InputStreamReaderSystem.in 读取。

问题出在哪里?

Java 源代码在这里:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

import java.sql.ResultSet;
import java.sql.Statement;
import java.sql.Connection;
import java.sql.SQLException;


import oracle.jdbc.driver.OracleDriver;

public class ExecuteInteractiveBatch 

    public static void aFunction() 

        Connection connection = null;
        try 
            int rowFetched = 0;

            connection = new OracleDriver().defaultConnection();

            Statement stmt = connection.createStatement();

            ResultSet rs = stmt.executeQuery("SELECT count(1) cnt from sometable where c = 2");

            int count = 0;
            if (rs.next()) 
                count = rs.getInt(1);
            
            rs.close();
            stmt.close();
            rs = null;
            stmt = null;
            if (count == 1) 
                System.out.println("Do you want to continue?");
                BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
                String response = reader.readLine();
                if ("Y".equalsIgnoreCase(response)) 
                    stmt = connection.createStatement();
                    int rowsAffected = stmt.executeUpdate("DELETE from sometable where c=2");
                    System.out.println("" + rowsAffected + " row(s) deleted");
                    stmt.close();
                
            
         catch (IOException ex) 
            ex.printStackTrace();
         catch (SQLException ex) 
            ex.printStackTrace();
         finally 

            try 
                if (connection != null || !connection.isClosed()) 
                    connection.close();
                
             catch (SQLException ex) 
                ex.printStackTrace();
            
        
    

【问题讨论】:

问题出在哪里?可能在您未包含在问题中的堆栈跟踪中。 :) 可能还包括您创建的代码 什么叫aFunction?您能否向我们提供提供详细错误信息的堆栈跟踪? 抱歉,我没有注意到oracle 标签。我非常怀疑 System.in 是否可用于 Java 存储过程。您希望用户在哪里输入他们的回复? 【参考方案1】:

您不能从 Oracle 内部对控制台执行 I/O...不能在 java 中,不能在 PL/SQL 中,无处可去。 Oracle 运行在与用户不同的进程中,甚至很可能是不同的计算机,并且 java 存储过程正在该进程中运行。您需要在客户端系统上运行一些 java 代码来执行控制台 I/O。

【讨论】:

以上是关于Oracle Java 存储过程命令行交互的主要内容,如果未能解决你的问题,请参考以下文章

将Java存储过程迁移到AWS RDS oracle

oracle数据库调用存储过程

myBatis 调用 Oracle 存储过程,报错,求解答

oracle 中用啥命令执行一个带参数的存储过程

如何导出ORACLE指定存储过程

Oracle调用Java类开发的存储过程函数的方法