简体   繁体   English

Java静态方法用作Oracle函数

[英]Java Static method used as Oracle function

I'm quite new to Java development and Oracle either, but I'm learning. 我对Java开发和Oracle还是很陌生,但是我正在学习。

My problem is the following, I created a dll in .net and used it as custom function in MSSqlServer, basically this library act as a SOAP gateway letting me call a webservice (both in GET and POST) simply using a SELECT like this 我的问题是以下问题,我在.net中创建了一个dll,并将其用作MSSqlServer中的自定义函数,基本上,该库充当SOAP网关,让我可以像这样简单地使用SELECT来调用Web服务(在GET和POST中)

SELECT * 
FROM fn_SoapGateway_MakeWebRequest
(
'GET', -- Method
'https://fish.go-moo.it', -- Url
'/foo/bar?method=info', -- Path
'' -- XML Envelope
)

Now, I want to do the same thing but using Java for Oracle. 现在,我想做同样的事情,但是使用Java for Oracle。 For testing purposes, I created the class "SoapGateway" which exposes two static methods: 为了进行测试,我创建了“ SoapGateway”类,该类公开了两个静态方法:

  • 1) public statis String GetData() <- which returns just a string, to see that all things work good.. 1) 公共状态String GetData() <-仅返回一个字符串,以确保所有工作正常。

  • 2) public static String MakeWebRequest(String username, String password, String method, String url, String path, String envelope) <- makes the call to the webservice 2) 公共静态String MakeWebRequest(字符串用户名,字符串密码,字符串方法,字符串url,字符串路径,字符串信封) <-进行对Web服务的调用

The second step is compiling everything with the Oracle java compiler so there will be no problems of java version: done! 第二步是使用Oracle Java编译器编译所有内容,因此不会出现Java版本的问题:完成!

Now third step: binding Oracle function to the java class with a simple code like this 现在的第三步:使用像这样的简单代码将Oracle函数绑定到java类

CREATE OR REPLACE FUNCTION fn_SoapGateway_GetData RETURN VARCHAR2 AS LANGUAGE JAVA NAME 'SoapGateway.GetData() return java.lang.String'; 创建或替换功能fn_SoapGateway_GetData返回VARCHAR2作为语言Java名称“ SoapGateway.GetData()return java.lang.String';”。 COMMIT; 承诺;

and last, test the simple function GetData with this select 最后,使用此选择测试简单函数GetData

SELECT MY_SCHEMA.fn_SoapGateway_GetData() FROM DUAL ;  

works like a charme!! 像一个咒语! and it returns me my custom string. 它返回我我的自定义字符串。

Now, finally I can ask you my questions: 现在,最后我可以问你我的问题:

1) What should I write in Oracle to bind the function "MakeWebRequest" and create the function in Oracle? 1) 我应该在Oracle中写些什么来绑定功能“ MakeWebRequest”并在Oracle中创建功能?

2) Is it correct sending a "String" as an Envelope and returning a "String" or should I use a bigger data type? 2) 以信封形式发送“字符串”并返回“字符串”是否正确,还是应该使用更大的数据类型? If so, which kind of data type? 如果是这样,哪种数据类型? Can you help me correcting my code? 您能帮我更正我的代码吗? I can share everything once it works 一切正常,我可以分享

3) How can I invoke the function correctly from Oracle to obtain the response as an XML variable? 3) 我如何才能正确地从Oracle调用函数以获得XML变量的响应?

Many many thanks for helping! 非常感谢您的帮助! tell me if I was not clear in something! 告诉我是否不清楚某件事! ((: ((:

----------------------- UPDATEEEEE ----------------------------- ----------------------- UPDATEEEEE -------------------------- ---

Ok guys, now step 2.0.. I obtained the result I wanted from Java, I used java.sql.Clob and everything seems fine.. 好的,现在是步骤2.0 ..我从Java获得了想要的结果,我使用了java.sql.Clob,一切似乎都很好。

So, I tested from a main in eclipse, called the SoapGateway.MakeWebRequest(.....) and everything seems perfect! 因此,我从一个名为SoapGateway.MakeWebRequest(.....)的月食中进行了测试,一切似乎都很完美! The remote host replies with the xml for my Get method. 远程主机用xml答复我的Get方法。 --> ok ->好的

Now, I loaded the java class into oracle server with loadjava -schema bla bla bla --> ok 现在,我使用loadjava -schema bla bla bla-> ok将Java类加载到oracle服务器中

Then, compiled it from the Enterprise Manager --> ok 然后,从企业管理器编译它->确定

Then, created a function like this 然后,创建一个像这样的函数

CREATE OR REPLACE FUNCTION fn_SoapGateway_MakeWebRequest(v_username VARCHAR2, v_password VARCHAR2, v_method VARCHAR2, v_url VARCHAR2, v_path VARCHAR2, v_envelope VARCHAR2) RETURN CLOB
AS LANGUAGE JAVA NAME 'SoapGateway.MakeWebRequest_Clob(java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String) return java.sql.Clob';

COMMIT;

--> ok! ->好吧!

And finally.. called it with: 最后..用:

SELECT MY_SCHEMA.FN_SOAPGATEWAY_MAKEWEBREQUEST
(
    'user',
    'pass',
    'method',
    'url',
    'path',
    'envelope',
) FROM DUAL;

ORA-29532: Chiamata java terminata a causa di un'eccezione Java non ottenuta: java.lang.NullPointerException (Java call terminated for null pointer exception) --> KO!! ORA-29532:Java中的Java终端会导致Java错误:java.lang.NullPointerException(Java调用因空指针异常而终止)-> KO!

Now, any idea about why on Eclipse works like a charme and from Oracle it generates such error? 现在,关于为什么在Eclipse上可以像魔术一样工作并且从Oracle产生这样的错误的任何想法吗? Am I doing something wrong? 难道我做错了什么?

Thank you so much! 非常感谢!

L. L.

ad 1) Something like that should work: 广告1)类似的方法应该起作用:

CREATE OR REPLACE FUNCTION yourFunctionName(username  varchar2, password varchar2, method varchar2, url varchar2, path varchar2, envelope  varchar2) RETURN VARCHAR2 AS 
LANGUAGE JAVA NAME 'SoapGateway.MakeWebRequest(java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String) return java.lang.String';

ad 2) If data is big, you can use BLOB - it's working perfectly for me when I'm generating xml ;) 广告2)如果数据量很大,则可以使用BLOB-当我生成xml时,它对我来说效果很好;)

ad 3) Try this: 广告3)试试:

SELECT yourFunctionName('username', 'pass', 'method', 'url', 'path', 'envelope') FROM dual;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 类中使用的静态方法 - Static method used in a class GroovyMock在用于通过静态方法调用测试Java类时不起作用 - GroovyMock not working when used to test Java class with static method call 多线程使用的Java同步和静态同步方法 - Java Synchronized and static synchronized method used by Multiple Threads 在java中的synchronized方法或块中使用静态成员 - static members when used in synchronized method or block in java 使用Java供应商/函数在静态方法中传递方法 - Using Java supplier/Function to pass method in static method Java使字符串简写/不允许使用replace()函数/静态方法 - Java Making a string shorthand/No replace() function allowed/static method 在 Java 中,为什么 Function.identity() 是静态方法而不是其他方法? - In Java why is Function.identity() a static method instead of something else? Java方法中的静态变量(如PHP函数中的行为)? - Static variables in a Java method like in a PHP function behaviour? 要在Java的函数/方法中使用对象调用还是静态调用? - To use object call or static call in a function/method for java? Java 中静态递归函数的 PowerMockito verifyStatic() 方法问题 - Issue with PowerMockito verifyStatic() method for a static recursive function in Java
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM