2

从 Oracle 12c 迁移到 Oracle 18c 后,由于 SQLJ 与我们的 18c 迁移不兼容,以下 java 源代码不起作用。重写 Oracle Java 代码以在 18c 中调用我们的 db 包的最佳方法是什么?

一位 DBA 告诉我们问题可能出在#sql并且代码需要重写,但我不是 Java 专家,不知道重写需要多广泛。这是代码:

import java.io.*;
import java.sql.*;

public class MoveFile
{
    public static void getFileList(String directory_source , String directory_target ) throws SQLException
    {
        File path = new File(directory_source);
        FilenameFilter filter = new FilenameFilter() {
            public boolean accept(File path, String name) {
                return !name.startsWith(".");
            }
        };
        String[] list = path.list(filter);
        String element;
        for(int i = 0; i < list.length; i++)
        {
            element = list[i];
            #sql { --this seems to be the issue since the compiler says invalid character "#"
                call my_user.my_package(:directory_source, :directory_target, :element)
            };
        }
    }
};

这是我们得到的错误信息:

`ORA-29541: class MY_USER.MoveFile could not be resolved`

这用于在以下包中的过程中创建:

create or replace PACKAGE UTIL_OS AS

    FUNCTION run_cmd(p_cmd IN VARCHAR2) RETURN NUMBER IS
      LANGUAGE JAVA NAME 'ExecuteOSCommand.runThis(java.lang.String) return integer';

    PROCEDURE MoveFile (in_file_path IN VARCHAR2) IS
          LANGUAGE JAVA NAME 'DirectoryListMove.getList(java.lang.String,java.lang.String )';

END;

/

这是我成功编译的尝试(此时我只是尝试执行任何数据库操作以查看是否至少可以连接):

CREATE OR REPLACE AND RESOLVE JAVA SOURCE NAMED MoveFile AS
import java.io.*;
import java.sql.*;

//import oracle.jdbc.driver.*;

public class DirectoryListMove
{
    // JDBC driver name and database URL
   static final String JDBC_DRIVER = "oracle.jdbc.driver.OracleDriver";  
   static final String DB_URL = ("jdbc:oracle:thin:@myhost:myport/myservicename");

   //  Database credentials
   static final String USER = "my_user";
   static final String PASS = "my_password";

public static void getList(String directory_source , String directory_target ) throws SQLException
{
   File path = new File(directory_source);
   FilenameFilter filter = new FilenameFilter() {
    public boolean accept(File path, String name) {
        return !name.startsWith(".");
    }
};
   Connection conn = null;

      try {
           //STEP 2: Register JDBC driver
           Class.forName("oracle.jdbc.driver.OracleDriver");

            //STEP 3: Open a connection
           conn = DriverManager.getConnection(DB_URL,USER,PASS);

            //STEP 4: Execute a query

            Statement statement = conn.createStatement();

           //attempt to execute a working DML statement
            String query = " insert into my_table values ('99','Test',9,'N')";
          statement.executeUpdate(query);

            conn.close();
        }
        catch (Exception e) {
           // . . .
        }
        finally {
          //  . . .
        }
}
};

然后我执行了这个过程:

BEGIN
            UTIL_OS.MoveFile
                (
                    '/myFile/Path'
                );
end;
/

由于我们目前正试图在数据库表中插入一条记录,因此输入参数与这个问题无关。没有插入记录,让我相信 java 代码有问题。

4

0 回答 0