Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Не вызывается java-класс  [new]
chyngyz_zh
Member

Откуда:
Сообщений: 10
Всем здрасти!

Создал java-класс в Oracle. При компиляции ошибок нет. Этот же код в NetBeans работает без проблем.
Результатом этого метода является отправка СМС-сообщения на указанный номер, и возврат статуса сообщения (удачный, не удачный).
CREATE OR REPLACE AND COMPILE JAVA SOURCE NAMED "Sms3" AS

import java.io.IOException;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;


public class Sms3 {
	
	public static void main(String[] args) throws Exception {
            new Sms3().sendSms();
        }
        
        public static String sendSms() throws Exception {
                String V_RESULT = "";

		DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		Calendar cal = Calendar.getInstance();
		    
		String pubKey = "публичный ключ"; //Public Key
		String prtKey = "приват ключ"; //Private Key
		String sender = "наименование"; //Sender Name
		String datetime = dateFormat.format(cal.getTime()); //DateTime
		String phone = "номер телефона"; //Phone number
		String message2 = "текст смс"; //message text
		try{
			
			String hash = getHash(pubKey+phone+sender+message2+datetime+prtKey, "MD5"); // get to hash
		
			URL url = new URL("URL-адрес");
			HttpURLConnection conn =(HttpURLConnection) url.openConnection();
			
			String urlParameters = "hash="+hash+"'&'sender="+sender+"'&'message="+message2+"'&'datetime="+datetime+"'&'publicKey="+pubKey+"'&'phone="+phone+"";
			byte[] postData = urlParameters.getBytes( StandardCharsets.UTF_8 );
			int postDataLength = postData.length;
			
			conn.setDoOutput(true);
			conn.setInstanceFollowRedirects( false );
			conn.setRequestMethod("POST");
			conn.setRequestProperty( "Content-Type", "application/x-www-form-urlencoded");
			conn.setRequestProperty( "charset", "utf-8");
			conn.setRequestProperty( "Content-Length", Integer.toString( postDataLength ));
			conn.setUseCaches( false );
			
                        DataOutputStream wr = new DataOutputStream( conn.getOutputStream());
                        wr.write( postData );
                        wr.flush();
			
			if(conn.getResponseCode() != 200){
				throw new RuntimeException("Failed : HTTP error code : "+conn.getResponseCode());
			}
			BufferedReader br = new BufferedReader(new InputStreamReader((conn.getInputStream())));
			String output;
			
			//System.out.println("Output from Server... \n");
			while ((output = br.readLine()) != null) {
				//System.out.println(output);
                                V_RESULT = V_RESULT + output;
			}
			
			conn.disconnect();
		}catch(MalformedURLException e){
			e.printStackTrace();
		}catch (IOException e) {
			e.printStackTrace();

		  }
            //System.out.println(V_RESULT);
            return V_RESULT;
	}
        
        private static String getHash(String txt, String hashType) {
        try {
                    java.security.MessageDigest md = java.security.MessageDigest.getInstance(hashType);
                    byte[] array = md.digest(txt.getBytes());
                    StringBuffer sb = new StringBuffer();
                    for (int i = 0; i < array.length; ++i) {
                        sb.append(Integer.toHexString((array[i] & 0xFF) | 0x100).substring(1,3));
                 }
                    return sb.toString();
            } catch (java.security.NoSuchAlgorithmException e) {
                //error action
            }
            return null;
        }

        private static String md5(String txt) {
            return getHash(txt, "MD5");
        }

        private static String sha1(String txt) {
            return getHash(txt, "SHA1");
        }
	
}


Далее пишу функцию для вызова. Тоже компилируется без проблем.
CREATE OR REPLACE FUNCTION smsSendFunc3
RETURN VARCHAR2
AS
  LANGUAGE JAVA NAME 'Sms3.sendSms() return java.lang.String';


Теперь при попытке запустить:
select smsSendFunc3 from dual;


выдает ошибку:
ORA-29541: class FORS.Sms3 could not be resolved


С правами все в порядке, работаю на тестовой базе с полными правами.

Перепробовал все что знал и то что поиском пользовался, не помогло.

В чем может быть ошибка? И как выяснить действительную ошибку java-класса?
26 июл 16, 18:06    [19458510]     Ответить | Цитировать Сообщить модератору
 Re: Не вызывается java-класс  [new]
chyngyz_zh
Member

Откуда:
Сообщений: 10
Пытался выяснить пользовательскую ошибку в java-классе следующий кодом:

SQL> SET SERVEROUTPUT ON SIZE 1000000;
SQL> CALL DBMS_JAVA.SET_OUTPUT (1000000);

Method called

SQL> exec dbms_output.put_line(smsSendFunc3());


Выходит та же ошибка.

Или я неправильно делаю?
26 июл 16, 18:10    [19458529]     Ответить | Цитировать Сообщить модератору
 Re: Не вызывается java-класс  [new]
ora601
Member

Откуда:
Сообщений: 750
chyngyz_zh
Пытался выяснить пользовательскую ошибку в java-классе следующий кодом:

SQL> SET SERVEROUTPUT ON SIZE 1000000;
SQL> CALL DBMS_JAVA.SET_OUTPUT (1000000);

Method called

SQL> exec dbms_output.put_line(smsSendFunc3());


Выходит та же ошибка.

Или я неправильно делаю?


CREATE OR REPLACE AND RESOLVE ?
26 июл 16, 18:33    [19458624]     Ответить | Цитировать Сообщить модератору
 Re: Не вызывается java-класс  [new]
dba123
Member

Откуда:
Сообщений: 1054
chyngyz_zh,

CREATE OR REPLACE AND COMPILE JAVA SOURCE NAMED "Sms3" 
может быть двойные кавычки?
27 июл 16, 08:16    [19459854]     Ответить | Цитировать Сообщить модератору
 Re: Не вызывается java-класс  [new]
chyngyz_zh
Member

Откуда:
Сообщений: 10
ora601,

автор
CREATE OR REPLACE AND RESOLVE ?

На строчках
}
        
        public static String sendSms() throws Exception {
                String V_RESULT = "";

и
String urlParameters = "hash="+hash+"'&'sender="+sender+"'&'message="+message2+"'&'datetime="+datetime+"'&'publicKey="+pubKey+"'&'phone="+phone+"";

выводит сообщение
ORA-01741: illegal zero-length identifier

во всех остальных строчках
ORA-00900: invalid SQL statement
27 июл 16, 08:20    [19459865]     Ответить | Цитировать Сообщить модератору
 Re: Не вызывается java-класс  [new]
chyngyz_zh
Member

Откуда:
Сообщений: 10
SELECT * FROM user_objects t
where t.object_name='Sms3'

показывает статус INVALID и в JAVA CLASS, и в JAVA SOURCE
27 июл 16, 08:30    [19459894]     Ответить | Цитировать Сообщить модератору
 Re: Не вызывается java-класс  [new]
chyngyz_zh
Member

Откуда:
Сообщений: 10
select * from user_errors where name = 'Sms3';

показывает
NAME	TYPE	SEQUENCE	TEXT
Sms3	JAVA CLASS	1	ORA-29535: source requires recompilation
Sms3	JAVA SOURCE	1	Sms3:8: cannot resolve symbol
Sms3	JAVA SOURCE	2	symbol  : class StandardCharsets 
Sms3	JAVA SOURCE	3	location: package charset
Sms3	JAVA SOURCE	4	import java.nio.charset.StandardCharsets;
Sms3	JAVA SOURCE	5	                        ^
Sms3	JAVA SOURCE	6	Sms3:40: cannot resolve symbol
Sms3	JAVA SOURCE	7	symbol  : variable StandardCharsets 
Sms3	JAVA SOURCE	8	location: class Sms3
Sms3	JAVA SOURCE	9	"			byte[] postData = urlParameters.getBytes( StandardCharsets.UTF_8 );"
Sms3	JAVA SOURCE	10	                                                                  ^
Sms3	JAVA SOURCE	11	2 errors

Что-то не пойму, на "StandardCharsets" ругается или...?
27 июл 16, 10:29    [19460356]     Ответить | Цитировать Сообщить модератору
 Re: Не вызывается java-класс  [new]
dmdmdm
Member

Откуда: Нижний Новгород
Сообщений: 1640
Рекомендую:

- отлаживать java-код вне оракла, в каком-то нормальном IDE типа Eclipse;
- использовать ту же версию JVM, что в вашем оракле;
- если используются нестандартные библиотеки, не забывать подключать их в проект;
- отлаженный .jar, либо .class, либо .java загружать в Oracle.
27 июл 16, 11:33    [19460862]     Ответить | Цитировать Сообщить модератору
 Re: Не вызывается java-класс  [new]
chyngyz_zh
Member

Откуда:
Сообщений: 10
dmdmdm,

Как уже писал выше, код отлажен и работает в NetBeans.

Соглашусь с вами, проблема скорей всего в версии JVM, при импорте класса "import java.nio.charset.StandardCharsets;".
На сайте https://docs.oracle.com/javase/7/docs/api/java/nio/charset/StandardCharsets.html пишется, что этот класс доступен с версии JVM 1.7. У меня на компьютере стоит версия 1.7.0_71, в Oracle стоит 1.4. Теперь буду работать в этом направлении.
27 июл 16, 11:52    [19461086]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить