我有一个名为 E2BXmlParser 的 java 文件,我在其中读取和操作从数据库获取的 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
}
}
现在它要求提供代码中使用的多个值( react 、节点列表、节点)。
但事实并非如此 当我像这样从命令行执行java文件时
loadjava -user username/password@DBalias -r E2BXmlParser.java
P.S 我必须将 E2BXmlParser.java 文件更改为 E2BXmlParser.sql 文件,以便我可以从 Oracle sql Developer 执行它。
请帮忙。
最佳答案
最简单的解决方案是将类的所有逻辑包装到类中的一个静态方法中。接下来你必须将此方法发布到 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 类。
关于java - 将 Java 文件更改为存储过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47566791/