在 PL/SQL 中重写 java 代码的挑战

Posted

技术标签:

【中文标题】在 PL/SQL 中重写 java 代码的挑战【英文标题】:Challenges in Rewriting java code in PL/SQL 【发布时间】:2016-12-05 22:17:57 【问题描述】:

我有一个 PL/SQL 文件,其中包含一个仅包含 Java 代码的过程。

以下是Java代码开始前的声明:

CREATE OR REPLACE AND COMPILE JAVA SOURCE NAMED "fnd_log_file_handler" AS

此 Java 代码执行各种文件操作(复制、检查长度、遍历文件数组、检查文件对象是否为目录等)和 DOM 操作/XML 解析(从给定的 XML 字符串创建 XML 文档对象)。此外,它还使用返回 Process 对象的 Runtime.exec() java 方法调用外部命令。以下是导入的包:

import java.nio.channels.FileChannel;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

还有一种方法被重复调用。它返回与特定名称模式匹配的文件夹中的文件列表。它使用 Comparator 过滤结果。以下是代码摘录

/**
     * This API returns list of files in a folder matching particular name pattern.
     * @param path - Path to the directory to get list of files
     * @param pattern - Pattern for file names to look for. All files with name 
     * starting with this pattern will be returned from the API
     * @return - Sorted list of files. 
     */

  private static File[ ] listFilesInOrder (String path, String pattern, 
                                        Comparator <File> compareFunc) 
  
      BASEFILENAME = pattern;
      File lFile = new File (path);

      File[] arrayFileList = lFile.listFiles(new FilenameFilter() 
          public boolean accept(File f, String s)  return s.startsWith(BASEFILENAME + INDEX_SPERATOR); 
      );


      if(arrayFileList!=null)
      
        Arrays.sort(arrayFileList, compareFunc);

      

      return arrayFileList;
  

我希望删除 java 依赖项,以防 JVM 将来从数据库中删除。是否可以编写 PL/SQL 代码来包含所有这些逻辑?如果没有,我的其他选择是什么?任何反馈表示赞赏。

【问题讨论】:

万一JVM将来从数据库中删除? @Kayaman Java 是 Oracle 数据库中的一个可选组件,不幸的是,DBA 删除它并不常见。这很愚蠢,但它确实发生了,因此明智的做法是尽可能避免 Java 依赖。 @JonHeller 是否有解决这种情况的方法?此代码是否仍可以作为可以从数据库中调用的独立 Java 文件存在?我不确定在 PL/SQL 中翻译所有这些逻辑是否可行。 【参考方案1】:

是的,在 PL/SQL 中是可能的。要使用文件系统中的文件,您需要查看 Oralce UTL_FILE 包,请参阅:Oracle UTL_FILE documentation

要在 java 中与列表类似地工作,您可以在 PL/SQL 代码中使用您的自定义 TYPE 和该 TYPE 的 TABLE。

PL/SQL 足够强大,可以做这样的逻辑

【讨论】:

我对 URL_FILE 包很熟悉。有没有办法调用外部应用程序和 DOM 操作? 只要 Oracle 具有 XPath/XQuery 能力,当然可以调用外部应用程序和 XML 操作。抱歉,现在我离 PL/SQL 太远了,无法准确地告诉你如何......你可以通过文档来挖掘。它没有隐藏太浸......祝你好运:)

以上是关于在 PL/SQL 中重写 java 代码的挑战的主要内容,如果未能解决你的问题,请参考以下文章

在 oracle apex 中将 sql 查询重写为 pl/sql

.htaccess URL 重写挑战

Java面试宝典常用类中的方法重写|equals方法与逻辑运算符==的区别

如何在一组行之后或有条件地在没有 PL/SQL 块的情况下增加 oracle 序列?

Java中重载(Overload)和重写(Override)的定义

重写旧的/不推荐使用的代码java [关闭]