[英]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.