Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle—从Java存储过程内部调用.bat文件(调用R文件)_Java_Oracle_Stored Procedures_Plsql_Java Stored Procedures - Fatal编程技术网

Oracle—从Java存储过程内部调用.bat文件(调用R文件)

Oracle—从Java存储过程内部调用.bat文件(调用R文件),java,oracle,stored-procedures,plsql,java-stored-procedures,Java,Oracle,Stored Procedures,Plsql,Java Stored Procedures,我目前正在使用Oracle 12c标准版 我创建了一个Java类,并使用JDK 6编译它(因为Oracle 12c默认支持JDK 6)。课程内容如下: import java.io.File; import java.io.IOException; public class Run_Batch { public static void main(String[] args) throws InterruptedException, IOException {

我目前正在使用Oracle 12c标准版

我创建了一个Java类,并使用JDK 6编译它(因为Oracle 12c默认支持JDK 6)。课程内容如下:

import java.io.File;
import java.io.IOException;

public class Run_Batch
{
    public static void main(String[] args) throws InterruptedException, IOException
    {       
       Runtime.getRuntime().exec("cmd /c start execute_r.bat", null, new File("C:/Users/Admin/workspace/"));

    }

}
CREATE OR REPLACE PACKAGE run_r_package AS
PROCEDURE run_test_batch
END;

CREATE OR REPLACE PACKAGE BODY run_r_package AS
PROCEDURE run_test_batch
AS LANGUAGE JAVA
NAME 'Run_Batch.proc()';
END;
我的目标是创建一个Java存储过程,我可以使用PL/SQL通过Oracle调用它。Java存储过程将从Run_Batch类调用main()方法,生成一个新的操作系统进程(可能),并运行C:/Users/Admin/workspace目录中的execute_r.bat批处理文件。之后,.bat文件将运行一个.R文件,该文件将使用ROracle库在Oracle数据库中创建一个新表

.bat文件的代码如下所示:

path
Rscript run_signal.R
pause
exit
EXECUTE run_test_batch('123');
import java.io.File;
import java.io.IOException;

public class Run_Batch
{
    public static void proc() throws InterruptedException, IOException
    {
        Runtime.getRuntime().exec("cmd /c cmd.exe", null, null);

    }

}
.bat和.R文件都位于C:/Users/Admin/workspace目录中

.R文件的代码为:

library(ROracle)
drv <- dbDriver("Oracle")
host <- "win-2h3vud23lai"
port <- 1521
sid <- "oracle"
connect.string <- paste(
"(DESCRIPTION=",
"(ADDRESS=(PROTOCOL=tcp)(HOST=", host, ")(PORT=", port, "))",
"(CONNECT_DATA=(SID=", sid, ")))", sep = "")
con <- dbConnect(drv, username = "C##USER",
             password = "password",dbname=connect.string)

createTable <- "CREATE TABLE IRIS_TABLE (time_stamp VARCHAR2(55), 
category VARCHAR2(15), type VARCHAR2(55), 
servername VARCHAR2(15), code VARCHAR2(15), msg VARCHAR2(255))"
之后,我输入了SQLPLUS.exe,并创建了一个包和一个包体:

CREATE OR REPLACE PACKAGE run_r_package AS
PROCEDURE run_test_batch ( ARGUMENTS VARCHAR2 )
END;

CREATE OR REPLACE PACKAGE BODY run_r_package AS
PROCEDURE run_test_batch( ARGUMENTS VARCHAR2) 
AS LANGUAGE JAVA
NAME 'Run_Batch.main(java.lang.String[])';
END;
我已成功创建包含包体的包。 但是,我无法运行Java存储过程,也无法调用run\u r\u batch()过程。每当我尝试这样做时,我都会收到未定义类的错误、未定义的错误或奇怪的异常名称

我无法使Oracle文档(在此处找到:)正常工作

如果使用sqlplus,请执行以下操作:

CALL run_test_batch('123');
我得到以下错误:

ORA-06576:不是有效的函数或过程名称

如果使用EXECUTE而不是CALL,则如下所示:

path
Rscript run_signal.R
pause
exit
EXECUTE run_test_batch('123');
import java.io.File;
import java.io.IOException;

public class Run_Batch
{
    public static void proc() throws InterruptedException, IOException
    {
        Runtime.getRuntime().exec("cmd /c cmd.exe", null, null);

    }

}
我得到以下错误:

ORA-06550:第1行第7列 PLS-00201:必须声明标识符“运行测试批” ORA-06550:第1行第7列 PL/SQL:语句被忽略。

如果使用SQL Developer而不是SQLPLUS,在使用密码连接到我的用户C##user后,我将尝试使用以下代码运行该过程:

BEGIN
    run_r_package.run_test_batch('');
END;
我第一次得到这个信息:

由于未解决的异常而终止执行:

ORA-29532:java调用被未捕获的java异常终止:java.lang.ExceptionInInitializerError ORA-06512:在“C###USER.RUN#u R#u包”中,第2行

但是现在,当我再次尝试运行代码时,我得到了一条不同的消息:

ORA-29532:java调用被未捕获的java异常终止:java.lang.NoClassDefFoundError ORA-06512:在“C###USER.RUN#u R#u包”中,第2行

$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ 编辑 $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$

我试图改进我的类,并按照注释中的建议运行一个简单的Windows命令

新的Java文件如下所示:

path
Rscript run_signal.R
pause
exit
EXECUTE run_test_batch('123');
import java.io.File;
import java.io.IOException;

public class Run_Batch
{
    public static void proc() throws InterruptedException, IOException
    {
        Runtime.getRuntime().exec("cmd /c cmd.exe", null, null);

    }

}
我的包创建代码已修改如下:

import java.io.File;
import java.io.IOException;

public class Run_Batch
{
    public static void main(String[] args) throws InterruptedException, IOException
    {       
       Runtime.getRuntime().exec("cmd /c start execute_r.bat", null, new File("C:/Users/Admin/workspace/"));

    }

}
CREATE OR REPLACE PACKAGE run_r_package AS
PROCEDURE run_test_batch
END;

CREATE OR REPLACE PACKAGE BODY run_r_package AS
PROCEDURE run_test_batch
AS LANGUAGE JAVA
NAME 'Run_Batch.proc()';
END;
如果我在sqlplus.exe中使用botch调用或EXECUTE,我会得到相同的错误,即必须声明run\u test\u批处理

如果我尝试通过SQL Developer调用该过程,如下所示:

BEGIN
    run_r_package.run_test_batch;
END;
我得到了错误:

ORA-29531:类Run\u批处理中没有方法proc ORA-06512:en“C##USER.RUN#u R#u包”,第2行
ORA-06512:en line 2

您知道这只适用于Windows,所有底层应用程序(R等)都需要从运行Oracle的Windows服务中访问。似乎是一个非常复杂的练习。“未定义类的错误、未定义的错误或奇怪的异常名称”,例如??是。但一切都在同一台机器内运行,这台机器同时充当客户端和服务器。这只是我在工作中被要求做的一个练习,因为他们不想为Oracle R连接库/包付费。这是我找到的“最简单”的解决方法。请编辑您的问题,并显示错误。这里的人不是读心术的。你说得对,谢谢。我刚刚添加了每当我尝试运行代码时收到的4条不同的错误消息。我还建议一步一步地执行此操作。编写一个Java存储过程,只进行一个简单的操作系统调用,而不是使用批处理文件和R程序(至少最初是这样)。这就减少了调试的工作量。在我看来,Java代码采用字符串数组,而PL/SQL包装器采用单个字符串。Java代码实际上似乎没有使用参数,因此可能应该重新定义它,使其不带任何参数。或者,将它(和PL/SQL)包装器定义为采用标量
字符串
。您知道这只适用于Windows,所有底层应用程序(R等)都需要从运行Oracle的Windows服务中访问。似乎是一个非常复杂的练习。“未定义类的错误、未定义的错误或奇怪的异常名称”,例如??是。但一切都在同一台机器内运行,这台机器同时充当客户端和服务器。这只是我在工作中被要求做的一个练习,因为他们不想为Oracle R连接库/包付费。这是我找到的“最简单”的解决方法。请编辑您的问题,并显示错误。这里的人不是读心术的。你说得对,谢谢。我刚刚添加了每当我尝试运行代码时收到的4条不同的错误消息。我还建议一步一步地执行此操作。编写一个Java存储过程,只进行一个简单的操作系统调用,而不是使用批处理文件和R程序(至少最初是这样)。这就减少了调试的工作量。在我看来,Java代码采用字符串数组,而PL/SQL包装器采用单个字符串。Java代码实际上似乎没有使用参数,因此可能应该重新定义它,使其不带任何参数。或者,将它(和PL/SQL)包装器定义为采用标量
字符串