java - 使用 JDBC 运行 Drop Tablespace 命令时,操作系统中的数据文件未删除

标签 java oracle jdbc oracle11g

我使用 ojdbc6.jar 库编写一个 Java 应用程序,通过命令删除 Oracle 中的表空间:

drop tablespace test including contents and datafiles cascade constraints;

但是当命令完成(成功且没有错误)时,数据文件仍然存在于我的操作系统中。
当我直接在 sqlplus 或 SQL Developer 上运行此命令时,数据文件眨眼间就会消失。

这是我创建表空间的 SQL 脚本(我不认为这是原因)

    CREATE TABLESPACE UC4_112_DATA
DATAFILE 'D:\app\oradata\testimport\tablespace_bond_75.dbf'
SIZE 128M
AUTOEXTEND ON NEXT 100M MAXSIZE 5000M
DEFAULT STORAGE (INITIAL 512K NEXT 2048K MAXEXTENTS UNLIMITED);

我在 Windows 8 上使用 Oracle 11G2 安装。
你们以前遇到过这种症状吗?如何解决这个问题?
编写java代码来运行该命令(运行脚本文件和运行命令两种方式)

SQLRunner sqlRunner = null;
    try {
        logger.info("Executing SQL query/script ...");
        sqlRunner = new SQLRunner(connection);
        sqlRunner.setStopOnError(true);
        if (scriptFile != null) {
            sqlRunner.setScriptDelimiter(scriptSeperator);

            File tempFile;
            URI uri = new URI(scriptFile);
            if (uri.getScheme() == null){
                tempFile = new File(scriptFile);
            }else{
                String fileInURI = URLEncoder.encode(uri.toURL().getFile(), "UTF-8");
                String filename = URLDecoder.decode(fileInURI, "UTF8");
                filename = normalizePath(filename, charMap, false, scriptFile.length() - filename.length());
                filename = filename.replace("BACK_TICK", "`");
                tempFile = new File(filename);
            }
            sqlRunner.executeScript(tempFile);

        } else {
            String query = parser.getOptionValue(queryArg);
            query = decryptIfEncrypted(query);
            String outputSeperator = parser.getOptionValue(outputSeperatorArg);
            if (outputSeperator == null) {
                outputSeperator = "#!#";
            }
            SQLResult result = sqlRunner.executeSQL(query);
            printResult(result, outputSeperator);
        }

        sqlRunner.commit();
        logger.info("Executed SQL query/script successfully.");
    } catch (SQLException e) {
        sqlRunner.rollback();
        logger.error(e);
        if (e.getMessage().contains(" exist"))
            returnCode = ErrorCodes.SQL_EXISTS_ERROR;
        else
            returnCode = ErrorCodes.EXCEPTION;

    } catch (URISyntaxException e) {
        logger.error(String.format("Invalid URI file \"%s\" !!!", scriptFile), e);
        returnCode = ErrorCodes.PARAMSMISMATCH;
    } finally {
        if (sqlRunner != null)
            sqlRunner.close();
    }

最佳答案

这种行为在 Windows 平台中是预料之中的(实际上是 Windows 平台的限制),在该平台中,只有所有打开该文件的进程都释放该文件后才能删除该文件。

问题ALTER DATABASE DATAFILE '<file_name>' OFFLINE DROP;在删除表空间之前。

错误 2338968: 删除表空间并不总是自动删除数据文件。

关于java - 使用 JDBC 运行 Drop Tablespace 命令时,操作系统中的数据文件未删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43909315/

相关文章:

java - 将 jtextbox 值和 jradiobutton 值插入数据库

java - Oracle JDBC 数据源将所有连接的自动提交属性设置为 false

java - 如何使 2 个整数相除产生一个 float 而不是另一个整数?

java - 托管在不同服务器上的 JavaScript 前端的 JEE session

sql - 如何编写查询来识别发音相似的名字?

oracle - 对未初始化集合 PL/SQL 的引用

java - 字符串到日期的准备语句绑定(bind)

java - GC 调优 - 防止 Full GC

java - BufferedReader vs Console vs Scanner

oracle - 如何从Oracle函数返回RefCursor?