powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Использование Java в Oracle
25 сообщений из 25, страница 1 из 1
Использование Java в Oracle
    #33816785
Sarin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне поручили вникнуть в сабж. Необходимо написать минимальную ХП на Java.

Если вам не трудно: можете прямо здесь устроить мне небольшой ликбезик результатом которого станет создание чего-то на яве (желательно с выдёргиванием хоть какой-то записи хоть из какой-то таблицы) что можно вызывать из скрипта на PL/SQL. Минимальные знания PL/SQL имеются.
...
Рейтинг: 0 / 0
Использование Java в Oracle
    #33816944
mcureenab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вопрос не иначе от лени.

Oracle Database
Java Developer’s Guide
10g Release 2 (10.2)
B14187-01
Invoking Java Methods

1. Define a class, Hello, as follows:
public class Hello
{
public static String world()
{
return "Hello world";
}
}

....
...
Рейтинг: 0 / 0
Использование Java в Oracle
    #33816946
Feech
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По-моему, довольно подробно первые шаги в этом деле расписаны у Кайта. Имхо, именно то, что вам нужно.
...
Рейтинг: 0 / 0
Использование Java в Oracle
    #33816985
Sarin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо. Просто время "слегка" ограничено. Командование поставило такую задачу. Спросить не у кого так как само командование ничего вроде не знает. Вот мне и велели "разобраться". Ну я и пошол по закоулкам Инэта в поисках инфы.
...
Рейтинг: 0 / 0
Использование Java в Oracle
    #33817089
Sarin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот уже конкретный вопрос созрел.
Есть такая функция на яве:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
public class jtest extends Object{
	   public static int callMethod(){
	   		  counter++;
			  #sql {
			  	   INSERT INTO javaout VALUES("Yo")
			  };
			  return counter;
	   }
	   
	   private static int counter =  0 ;
}
/
Так она рождается:
Код: plaintext
1.
2.
3.
create or replace function java_test return number as
language java name 'jtest.callMethod() return integer';
/
Цель: вставить что-то куда-то:)

А вот я её вызываю:
Код: plaintext
1.
select java_test() from dual

А в ответ TOAD говорит:
Код: plaintext
1.
ORA- 29541 : class BBB.jtest could not be resolved

Если убрать из явы вызов SQL всё работает.
...
Рейтинг: 0 / 0
Использование Java в Oracle
    #33817141
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
create table javaout (value varchar2( 2000 ));
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
create or replace and compile java source named "jtest" as
 import  java.sql.SQLException;
 public   class  jtest {
   public   static   int  callMethod()  throws  SQLException {
    counter++;
    #sql {insert into javaout values('Yo')};
     return  counter;
  }
   private   static   int  counter =  0 ;
}
/
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
create or replace function java_test return number as
language java name 'jtest.callMethod() return int';
/
declare n integer;
begin
  n := java_test;
end;
/
...
Рейтинг: 0 / 0
Использование Java в Oracle
    #33817192
Sarin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо. Работает без ошибок. Но вот чего-то не вставляется нифига:(
...
Рейтинг: 0 / 0
Использование Java в Oracle
    #33817241
Sarin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот теперь такая лажа:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
CREATE OR REPLACE AND RESOLVE JAVA SOURCE NAMED "jtest" AS
import java.sql.SQLException;

public class jtest extends Object{
	   public static int callMethod(){
	   		  counter++;
			  return counter;
	   }
	   
	   public static void execSQL(){
	   		 try{
			 #sql {
			  	   INSERT INTO javaout(outstr) VALUES('Yo');
			  };
			  }
			  catch(SQLException e){
			  		counter =  1000 ;
			  }
	   }
	   
	   private static int counter =  0 ;
}
/
Есть процедура которая дёргает execSQL. Судя по значению counter опосля дёрганья возникает исключение.
...
Рейтинг: 0 / 0
Использование Java в Oracle
    #33817282
Feech
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Насчет "не вставляет", может попробовать явно коммитить?


Is SQLJ ignoring my UPDATE statements?

When I try to update a record using SQLJ, the data remains unchanged. What is going on?

A couple of notes on this.

* JDBC connections have auto-commit on, but SQLJ connections usually have auto-commit off by default. Thus you need to remember to issue a COMMIT to make the update visible.

* #sql { COMMIT }; You can use an ExecutionContext to see how many rows got updated.

import sqlj.runtime.ExecutionContext;
...
ExecutionContext ec=new ExecutionContext();
#sql [ec] { UPDATE table SET ... WHERE ... };
* System.out.println("Updated "+ec.getUpdateCount()+" rows."); Remember that if the WHERE clause selects no rows, then 0 rows get updated and you will also not see a SQLException.

If your WHERE clause compares any CHAR columns to Java strings, it very likely will not work: you have to blank-pad the Java strings if you want the comparison to succeed. Or you can declare the column as VARCHAR2. Or you could use a LIKE comparison and append a "%" to the Java string.
...
Рейтинг: 0 / 0
Использование Java в Oracle
    #33817297
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sarin wrote:
> Судя по значению counter опосля дёрганья возникает исключение.

Почему бы не вывести это сообщение и не посмотреть на него?
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Использование Java в Oracle
    #33817327
Sarin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FeechНасчет "не вставляет", может попробовать явно коммитить?

Простите, я дурак. Что значит коммитить? Тоесть я понял, что надо сделать COMMIT. Но можно попросить Вас кинуть пример такого запроса?

Как вывести ошибку?
...
Рейтинг: 0 / 0
Использование Java в Oracle
    #33817374
semenar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sarin FeechНасчет "не вставляет", может попробовать явно коммитить?

Простите, я дурак. Что значит коммитить? Тоесть я понял, что надо сделать COMMIT. Но можно попросить Вас кинуть пример такого запроса?

Как вывести ошибку?
commit;
select * from javaout;
...
Рейтинг: 0 / 0
Использование Java в Oracle
    #33817380
Фотография SeaGate
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SarinНо можно попросить Вас кинуть пример такого запроса?
Возможно:
Код: plaintext
#sql { COMMIT };
SarinКак вывести ошибку?
А если блоке catch, через e.errorCode? (или что-то типа того, давно с java не работал...)
...
Рейтинг: 0 / 0
Использование Java в Oracle
    #33817396
Sarin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Commit закончился ошибкой компиляции.

e.printStackTrace по идеи печатет стек. Пробовал. Но куда он его отпечатает?
...
Рейтинг: 0 / 0
Использование Java в Oracle
    #33817427
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sarine.printStackTrace по идеи печатет стек. Пробовал. Но куда он его отпечатает?
Если предварительно вызвать dbms_java.set_output(nnn), то будет печатать в оракловый output.
Может сделать просто?
Код: plaintext
1.
2.
 public   static   void  execSQL()  throws  SQLException {
  #sql {INSERT INTO javaout(outstr) VALUES('Yo');};
}
...
Рейтинг: 0 / 0
Использование Java в Oracle
    #33817453
КП
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SarinCommit закончился ошибкой компиляции.

e.printStackTrace по идеи печатет стек. Пробовал. Но куда он его отпечатает?
Код: plaintext
dbms_java.set_output( 1000000 );
Или файлы на сервере в /udump.

Мне кажется не туда заносит немного. На мой взляд суть сабжа заключатся не в возможности выполнения DML, а в возможности некоторой обработке данных, на которую не способен PLSQL.
...
Рейтинг: 0 / 0
Использование Java в Oracle
    #33817471
Sarin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да мне хоть чтонибудь бы получить от явы на предмет работы с таблицами.
...
Рейтинг: 0 / 0
Использование Java в Oracle
    #33817478
Sarin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот что с throws получилось:

ORA-29532: Java call terminated by uncaught Java exception: oracle.jdbc.driver.OracleSQLException: ORA-00911: invalid character
ORA-06512: at "BBB.JAVA_SQL", line 0
ORA-06512: at line 4
...
Рейтинг: 0 / 0
Использование Java в Oracle
    #33817492
semenar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
CREATE TABLE JAVA(JAVA VARCHAR2( 10 ));
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
CREATE OR REPLACE AND RESOLVE JAVA SOURCE NAMED "t" AS
 import  java.io.*;
 import  java.sql.*;

 public   class  ins_{

 public   static  oracle.sql.NUMBER ins_(String Vl)
 { int  rc =  0 ;String c;
   try  {
   rc= 0 ;c=Vl;
    #sql{insert into JAVA(java) VALUES(:c)};
        rc= 1 ;
         }  catch (Exception e)
          {e.printStackTrace();
                rc= 0 ;
       } finally {
      return   new  oracle.sql.NUMBER(rc);
    }
  }
}
/
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
CREATE OR REPLACE function run_(p_cmd in varchar2) return number as
  language java name 'insert_.insert_
                     (java.lang.String) return oracle.sql.number';
/

CREATE OR REPLACE PROCEDURE append_java IS
v number;
 begin
  v:= run_('ку-ку');
  commit;
end;
/
У меня вроде работает))
...
Рейтинг: 0 / 0
Использование Java в Oracle
    #33817498
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SarinВот что с throws получилось:

ORA-29532: Java call terminated by uncaught Java exception: oracle.jdbc.driver.OracleSQLException: ORA-00911: invalid character
ORA-06512: at "BBB.JAVA_SQL", line 0
ORA-06512: at line 4
Точка с запятой лишная, забыл убрать
Код: plaintext
1.
2.
3.
 public   static   void  execSQL()  throws  SQLException {
//  #sql {INSERT INTO javaout(outstr) VALUES('Yo');};
  #sql {INSERT INTO javaout(outstr) VALUES('Yo')};
}
...
Рейтинг: 0 / 0
Использование Java в Oracle
    #33817511
Sarin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо, товарищи дорогие!!! Огромное. Заработало.

Теперь позволю себе немного обнаглеть:) А как забрать переменную из запроса? В Нэте русском пока чёт не нашол ничего.
...
Рейтинг: 0 / 0
Использование Java в Oracle
    #33817525
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SarinА как забрать переменную из запроса?
/topic/271982
...
Рейтинг: 0 / 0
Использование Java в Oracle
    #33817821
Partisan M
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
название вопроса неконткретное, лучше бы "как писать хранимую процедуру на Java".

Теория: можно с использованием JDBC, а можно с SQLJ. Приведённые выше примеры используют SQLJ, хотя популярнее JDBC.SQLJ в конечном счёте преобразуется в JDBC.
Литература
- в комплекте документации Oracle есть целая книжка по написанию хранимых процедур на Java (с использованием JDBC). По SQLJ есть книжка на русском языке, хотя не помню, есть ли там что о хранимых процедурах.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Использование Java в Oracle
    #39266055
bestonix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
semenar,

поясните пожалуйста, как из функции run_ значение "ку-ку" попадает в java_код ins_.ins_ ?
...
Рейтинг: 0 / 0
Использование Java в Oracle
    #39266323
10 лет прошло епрст.
...
Рейтинг: 0 / 0
25 сообщений из 25, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Использование Java в Oracle
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]