使用shell脚本在java中使用参数执行存储过程

时间:2018-01-11 16:07:06

标签: java jdbc

我是java世界的新手并且正在尝试学习,我正在尝试将具有几个参数的存储过程作为参数传递给通过shell脚本执行的java程序,不会看到存储过程被执行。

另外,我有一个工作程序,它执行没有参数的存储过程。以下是代码片段

将存储过程存储为如下所示的参数:

String StProcNme = args[0];

以下是执行存储过程的代码:

stmt = con.createStatement();
rs = stmt.executeQuery("{call " +StProcNme+"}" );

在这种情况下,传递给shellscript的存储过程值为TESTDB.Test_xyzz_abc_method.xxxx_req_xyz_some_test,这是有效的。

当我尝试使用存储过程值TESTDB.TESTDB.Test_xyzz_abc_method.xxxx_req_xyz_some_test('TEST_MMTS_ABCXYZ','N')运行上面的代码时,它不起作用,我看到参数的引号在程序中被丢弃。

我正在使用JDK 6 - 感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

试图在注释中执行此操作,但是...

String sqlString = args[0];
String query = "{ call " + sqlString + " }";

CallableStatement spStmt = dbConn.prepareCall(query);

for(int i = 1; i < args.length; i++) {
 spStmt.setObject(i+2, args[i]); // need to lookup the positioning, off the top of my head here
}

spStmt.execute();

脚本的参数如下所示:

myScript TESTDB.TESTDB.Test_xyzz_abc_method.xxxx_req_xyz_some_test(?,?) TEST_MMTS_ABCXYZ N

您唯一需要引用的时间是是否有不连续的字符串传递到shell脚本中

myScript TESTDB.TESTDB.Test_xyzz_abc_method.xxxx_req_xyz_some_test(?,?) "Hello World" N

*已编辑以添加Shell脚本*

如果您只是想得到自己正在工作的内容,则可以创建一个脚本,告诉它传递原始命令行参数。

cmdTest bash脚本:

printf "Running Command:"
printf " %q" java CMDTest "$@"
printf "\n"

java CMDTest "$@"

使用小型Java程序进行测试,您将获得:

./cmdTest "TESTDB.TESTDB.Test_xyzz_abc_method.xxxx_req_xyz_some_test('TEST_MMTS_ABCXYZ','N')"

输出:

Running Command: java CMDTest TESTDB.TESTDB.Test_xyzz_abc_method.xxxx_req_xyz_some_test\(\'TEST_MMTS_ABCXYZ\'\,\'N\'\)
Arg: 0   TESTDB.TESTDB.Test_xyzz_abc_method.xxxx_req_xyz_some_test('TEST_MMTS_ABCXYZ','N')

Java代码的完整性

public class CMDTest {
    public static void main(String[] args) {
        for(int i = 0; i < args.length; i++) {
          System.out.println("Arg: " + i + "\t " + args[i]);
        }
    }
}