从 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 代码有问题。