【问题标题】:Changing Java file to Stored procedure将 Java 文件更改为存储过程
【发布时间】:2018-05-13 23:44:02
【问题描述】:

我有一个 java 文件名 E2BXmlParser,我在其中读取和操作从数据库中获取的 XML 数据。

现在我尝试在像这样更改文件后使用 Oracle SQL Developer 执行 java 文件

CREATE AND COMPILE JAVA SOURCE NAMED "E2BXmlParser" AS

--(Rest of Code).

其余的代码看起来像这样--

import oracle.jdbc.*
import oracle.xdb.XMLType;
import oracle.xml.parser.v2.XMLDocument;
import oracle.jdbc.*;
import org.w3c.dom.*;
import org.xml.sax.InputSource;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.*;
import java.sql.Connection;
import java.util.*
import javax.xml.xpath.*;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.io.StringReader;

class Reaction {

}

public class E2BXmlParser {

   //variables

    public E2BXmlParser(int regReportId, int reportId) {
       //connection
    }
    public static void parseXML(int regReportId, int reportId, int isBlinded, int reportFormid,int pi_is_r3_profile,int pi_max_length,String pi_risk_category) throws SQLException, XPathExpressionException, TransformerException {
        //fetching data
    }
    private static Document getDocumentFromString(String xmlContent) throws Exception {

    }

    private String getStringByElementName(String tagName, Element element) {

    }
    private OracleConnection getConnecton() {
       //oracle connection

    }
private Document getXmlDocumentFromDb(int regReportId, int reportId) {
    //fetching and manipulating data
}
private List<Reaction> getReactionIds() {
    //logic 
}
private void findById(Reaction reaction, String id) {

    //xpath for finding nodes

}
private boolean checkNodeExists(Element el, String nodeName) {
    NodeList list = el.getElementsByTagName(nodeName);
    return list.getLength() > 0;
}
private void updateNode(Reaction reaction, Element el) {

  //update xml

}
private void updateXmlInDB(int regReportId, int reportId) throws SQLException {
    //update xml in db
}

private void updateDrugNode() {
    Element rootElement = document.getDocumentElement();
    //logic
}

private void updateDrugEventandDrugRelatedness(int reportFormid) {
    //update xml 

}

private void updateMedicinalActiveSubstance(int regReportId, int isBlinded, int reportFormid,int pi_is_r3_profile,int pi_max_length,String pi_risk_category) {

   //update xml after fetching data and changing in DB
}

private Boolean compareStrings(String strOne, String strTwo) {

    //logic
}

private void updateDosageInformation() {
   //logic
}

private void updateActiveSubstanceName() {

   updating activesubstance using xpath 

}

private void RemoveDuplicateActiveSubstance(NodeList activesubstancenameList, List<String> names) {

// logic
     }
}

现在它要求在代码中使用多个值(反应、节点列表、节点)。

但事实并非如此 当我像这样从命令行执行java文件时

loadjava -user  username/password@DBalias -r E2BXmlParser.java

P.S 我必须将我的 E2BXmlParser.java 文件更改为 E2BXmlParser.sql 文件,以便我可以从 oracle sql developer 执行它。

请帮忙。

【问题讨论】:

    标签: java xml stored-procedures plsql oracle-sqldeveloper


    【解决方案1】:

    最简单的解决方案是将类的所有逻辑包装到类中的一个静态方法中。接下来你必须将此方法发布到pl sql。

    静态函数的发布将看起来(或多或少)像这样。

    CREATE PROCEDURE parseXML (regReportId NUMBER, reportId NUMBER, isBlinded NUMBER, reportFormid NUMBER, pi_is_r3_profile NUMBER, pi_max_length NUMBER, pi_risk_category varchar2)
    AS LANGUAGE JAVA
    NAME 'E2BXmlParser.parseXML(int regReportId, int reportId, int isBlinded, int reportFormid,int pi_is_r3_profile,int pi_max_length,java.lang.String pi_risk_category)';
    

    注意。在 plsql 中,您必须使用对象示例的完整路径 String -> java.lang.String

    当然,oracle 允许以更面向对象的方式使用 java 类,但这更复杂。

    有关更多信息,请查看本手册。 https://docs.oracle.com/cd/E18283_01/java.112/e10588/toc.htm

    第 3 章(在 Oracle 数据库中调用 Java 方法)- 了解基本解决方案。
    第 6 章(使用调用规范发布 Java 类)-(编写对象类型调用规范的段落)-用于发布完整的 java 类。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-22
      • 1970-01-01
      • 2015-11-19
      相关资源
      最近更新 更多