|
|
|
Передача ARRAY в хранимую процедуру Oracle
|
|||
|---|---|---|---|
|
#18+
Неправильно определяется тип данных Oracle при создании ArrayDescriptor Код: try { DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver()); con = DriverManager.getConnection("jdbc:oracle:oci8:@mydb", "user", "pass"); for(int i=0;i<10;i++) scodes =new String("hello moto"); 1. OracleCallableStatement cstmt = (OracleCallableStatement)con.prepareCall("{? = call Cheme.MyStorPr(?,?,?)}"); cstmt.registerIndexTableOutParameter(1,1000, OracleTypes.VARCHAR, 256); 2. ArrayDescriptor prices_AD = new ArrayDescriptor("ORANUMBER ", con); 3. ArrayDescriptor quant_AD = new ArrayDescriptor(" ORAINTEGER ", con); 4. ArrayDescriptor codes_AD = new ArrayDescriptor(" ORASTRING ", con); 5. System.out.println("--"+prices_AD.descType()); 6. System.out.println("--"+quant_AD.descType()); 7. System.out.println("--"+codes_AD.descType()); 8. oracle.sql.ARRAY prices_ar = new oracle.sql.ARRAY(prices_AD, con, prices); 9. oracle.sql.ARRAY quant_ar = new oracle.sql.ARRAY(quant_AD, con, quant); System.out.println("111"); 10. oracle.sql.ARRAY codes_ar = new oracle.sql.ARRAY(codes_AD, con, scodes); System.out.println("222"); 11. cstmt.setARRAY(3, codes_ar); 12. cstmt.setARRAY(4, quant_ar); 13. cstmt.setARRAY(5, prices_ar); 14. cstmt.execute(); Datum[] str = cstmt.getOraclePlsqlIndexTable(1); System.out.println(str.length); } catch(Exception ex) { System.err.println(ex); } На 10 строке выдает ошибку, связанную с преобразованием типов в Integer. Строки 5 6 7 выдают следующее: --ORANUMBER NUMBER --ORAINTEGER NUMBER --ORASTRING NUMBER Хотя в Oracle типы определются так: create or replace type ORAInteger as table of integer create or replace type ORANumber as table of number create or replace type ORAString as table of varchar2(255) Почему Number? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2004, 12:53 |
|
||
|
Передача ARRAY в хранимую процедуру Oracle
|
|||
|---|---|---|---|
|
#18+
Немного наладили Теперь правильно определяется VARCHAR, не Number. В Oracle с create or replace были неясности. Но массив к сожалению все равно не передается. Ошибка: oracle-character-set-171 17056 Подскажите, как быть с кодировкой? Текст в массиве строк на латинском, куда копать?. Хелп, плиз. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2004, 17:06 |
|
||
|
Передача ARRAY в хранимую процедуру Oracle
|
|||
|---|---|---|---|
|
#18+
А нельзя ли передавать все параметры единой объектной таблицей? По крайней мере у меня с кодировкой символов все в порядке, база - UTF8, на клиенте - CL8MSWIN1251. How to pass an array from Java which maps to a PL/SQL table in oracle? Дополнительно: раз уж используется OCI-драйвер, можно определить массив в Oracle как pl/sql-таблицу: Oracle9i JDBC Developer's Guide and Reference Release 2 (9.2) JDBC OCI Extensions Accessing PL/SQL Index-by Tables http://download-west.oracle.com/docs/cd/B10501_01/java.920/a96654/oci_func.htm#1017512 Там пример внизу дан. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2004, 12:02 |
|
||
|
Передача ARRAY в хранимую процедуру Oracle
|
|||
|---|---|---|---|
|
#18+
Вот еще: http://asktom.oracle.com/pls/ask/f?p=4950:8:::::F4950_P8_DISPLAYID:8908169959941 http://asktom.oracle.com/pls/ask/f?p=4950:8:3500651406860365671::NO::F4950_P8_DISPLAYID,F4950_P8_CRITERIA:7350176492925, ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2004, 12:13 |
|
||
|
Передача ARRAY в хранимую процедуру Oracle
|
|||
|---|---|---|---|
|
#18+
Спасибо за ответ, Денис. Все параметры единой таблицей передавать не очень удобно, у них типы разные. Раньше строками передавали, проблемы с преобразованием строк в Number были. Вот, поэтому разделили. Моя реализация передачи ARRAY похожа на ту,что в примерах, различий я не нашел. С PL/SQL я еще обязательно посмотрю, но в чем разница между массивами или таблицей? А вот с кодировкой.. Для коннекта я устанавливаю так: DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver()); Properties info = new Properties(); info.put("user", dbuser); info.put("password", dbpass); info.put("charSet", "UTF8"); con = DriverManager.getConnection("jdbc:oracle:oci8:@mydb", info); Но ошибка все равно не изчезает.. На сервере установлена CL8MSWIN1251. Сервер на WIN2000. Странно, при чем здесь тогда вообще oracle-character-set-171? Ошибка 17056 - это Unsupported charset. Что ж делать.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2004, 15:08 |
|
||
|
Передача ARRAY в хранимую процедуру Oracle
|
|||
|---|---|---|---|
|
#18+
Все параметры единой таблицей передавать не очень удобно, у них типы разные. Мне не совсем понятно, в чем может заключаться неудобство? Если создать объектный тип (или тип ARRAY в пакете) с набором полей, совпадающий с набором требуемых параметров, после чего создать объектную таблицу (или pl/sql-таблицу) на основе описанного типа и использовать его в процедурах? Насчет info.put("charSet", "UTF8"); я не уверен - туда действительно можно именно "UTF8" передавать, это где-то указано? К слову, Properties для DriverManager'а я совсем не передаю, и у меня все работает:) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2004, 15:40 |
|
||
|
Передача ARRAY в хранимую процедуру Oracle
|
|||
|---|---|---|---|
|
#18+
Счас побробовал передавать строки как PL/SQL table - то же самое, ошибка oracle-character-set-171 17056 на строке cstmt.setPlsqlIndexTable..: .... String[] st=new String[2]; st[0]="32432"; st[1]="32433"; cstmt.setPlsqlIndexTable(3, st, st.length, st.length, OracleTypes.VARCHAR, 255); .... Конечно, можно объединить все в одну таблицу, только тогда не очень понятно как ее задать так, чтобы типы данных для каждого поля различались.. но это ладно пока, разобраться наверно можно.. Но.. я боюсь, что если таблица (или массив) с один полем (одномерный как бы) не передается, то при объединении ничего не измениться. От Properties вообщем-то тоже ничего не меняется, можно передавать только пароль и логин, или Properties, результат тот же. Ох. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2004, 15:53 |
|
||
|
Передача ARRAY в хранимую процедуру Oracle
|
|||
|---|---|---|---|
|
#18+
Допустим, у тебя есть объектный тип, наподобе как в примере с CallInOutStructArray: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. Его ты и используешь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2004, 16:05 |
|
||
|
Передача ARRAY в хранимую процедуру Oracle
|
|||
|---|---|---|---|
|
#18+
В Oracle ясно, а как это в Java будет выглядеть не очень понятно, как этот массив или таблицу описать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2004, 16:34 |
|
||
|
Передача ARRAY в хранимую процедуру Oracle
|
|||
|---|---|---|---|
|
#18+
Если можно пример в Java.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2004, 16:34 |
|
||
|
Передача ARRAY в хранимую процедуру Oracle
|
|||
|---|---|---|---|
|
#18+
Все это будет выглядеть один в один с примером callInOutStructArray . Просто надо внести небольшие изменения, для демонстрации: 1. В Oracle я изменил тип данных первого поля с VARCAHR2 на NUMBER: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 2. В Java меняем пару строк, вместо записи из строк передаем запись из числа и строки: Код: plaintext 1. 2. меняем на Код: plaintext 1. 2. И все, запускаем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2004, 16:58 |
|
||
|
Передача ARRAY в хранимую процедуру Oracle
|
|||
|---|---|---|---|
|
#18+
Спасибо Денис, попробуем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2004, 18:05 |
|
||
|
Передача ARRAY в хранимую процедуру Oracle
|
|||
|---|---|---|---|
|
#18+
Тока в Java по моему не совсем так,.. мы ведь должны передовать массив, состоящий из объектов int и String. Это будет Object[][] ob= {{new Integer(1), "Первый"}, {new Integer(2), "Второй"}}; Если я правильно понимаю? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2004, 18:16 |
|
||
|
Передача ARRAY в хранимую процедуру Oracle
|
|||
|---|---|---|---|
|
#18+
В конечном итоге - да. Может быть можно атаптировать вышеуказанный код до такой степени, чтобы сразу создавать "массив массивов". Просто я попытался показать миминум требуемых измененений кода для демонстрации его способности к загрузке массивов, содержащих некий другой тип данных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2004, 19:21 |
|
||
|
Передача ARRAY в хранимую процедуру Oracle
|
|||
|---|---|---|---|
|
#18+
Спасибо Денис. Но вызвать процедуру таким способом не удается :( Как мне тогда правильно передавать созданный объект Попробовал setObject: Код: plaintext 1. 2. 3. 4. 5. 6. Выдает ошибку 17049 на setObject Попробовал по другому: Код: plaintext 1. 2. 3. 4. 5. Пишет java ? sql 17049 (на oracle.sql.STRUCT ww...) Тоже не правильно. Хелп, плиз. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2004, 10:53 |
|
||
|
Передача ARRAY в хранимую процедуру Oracle
|
|||
|---|---|---|---|
|
#18+
Немного изменил передаваемый объект (теперь [], а не [][]) Код: plaintext 1. 2. 3. Ошибка java ? sql 17049 изчезла, но вылезла та старая: oracle-character-set-171 17056 которая была и при передаче просто ARRAY типа varchar. код 171 соответствует кодировке cl8mswin1251, а 17056 - ошибка "Non supported character set" Получается, что мой драйвер не порддерживает эту кодировку!? Это довольно странно.. Что же делать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2004, 11:18 |
|
||
|
Передача ARRAY в хранимую процедуру Oracle
|
|||
|---|---|---|---|
|
#18+
Напиши мне письмо, адрес в профиле, я свой пример покажу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2004, 12:40 |
|
||
|
Передача ARRAY в хранимую процедуру Oracle
|
|||
|---|---|---|---|
|
#18+
столкнулся с такой же проблемой oracle-character-set-171 Unsupported charset скажите как вы ее все таки победили ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.01.2005, 08:48 |
|
||
|
Передача ARRAY в хранимую процедуру Oracle
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.01.2005, 12:54 |
|
||
|
Передача ARRAY в хранимую процедуру Oracle
|
|||
|---|---|---|---|
|
#18+
таже проблема ! имею: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. в classpath прописан nls_charset12.jar и все равно ошибка: oracle-character-set-171 Unsupported charset кто поборол ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2005, 11:40 |
|
||
|
Передача ARRAY в хранимую процедуру Oracle
|
|||
|---|---|---|---|
|
#18+
А если zip вместо jar? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2005, 13:31 |
|
||
|
Передача ARRAY в хранимую процедуру Oracle
|
|||
|---|---|---|---|
|
#18+
Не знаю, но может это вам как-то поможет. У меня при передача ARRAY в хранимую процедуру Oracle возникала ошибка: Invocation exception: Cannot map Unicode to Oracle character.(java.sql.SQLException: Cannot map Unicode to Oracle character.) java.sql.SQLException: Cannot map Unicode to Oracle character. at oracle.sql.converter.CharacterConverter1Byte.toOracleCharacter(CharacterConverter1Byte.java:156) at oracle.sql.converter.CharacterConverter1Byte.toOracleString(CharacterConverter1Byte.java:246) at oracle.sql.CharacterSetWithConverter.convert(CharacterSetWithConverter.java:160) at oracle.sql.CHAR.(CHAR.java:133) at oracle.sql.CHAR.(CHAR.java:157) at oracle.jdbc.oracore.OracleTypeCHAR.toDatum(OracleTypeCHAR.java:145) at oracle.jdbc.oracore.OracleType.toDatumArray(OracleType.java:145) at oracle.jdbc.oracore.OracleTypeCHAR.toDatumArray(OracleTypeCHAR.java:173) at oracle.sql.ArrayDescriptor.toOracleArray(ArrayDescriptor.java:768) at oracle.sql.ARRAY.(ARRAY.java:118) Я убил много времени, но поборол это так: необходимо было переконвертить строки в ARRAY в Cp1250: if(rowI.get(indIC) != null) cValuesS[i-1] = new String(((String)rowI.get(indIC)).getBytes("Cp1250"), "Cp1250"); else cValuesS[i-1] = (String)rowI.get(indIC); ...... ..... oracle.sql.ArrayDescriptor arrayDesc = oracle.sql.ArrayDescriptor.createDescriptor("EDBADM.STRING_VARRAY", db_con.getMetaData().getConnection()); ...... oracle.sql.ARRAY arrayc = new oracle.sql.ARRAY(arrayDesc, db_con.getMetaData().getConnection(), cValuesS); ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2005, 13:57 |
|
||
|
Передача ARRAY в хранимую процедуру Oracle
|
|||
|---|---|---|---|
|
#18+
неа ... не помогло ;-( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2005, 18:28 |
|
||
|
Передача ARRAY в хранимую процедуру Oracle
|
|||
|---|---|---|---|
|
#18+
Решили проблему с русским языком скачиванием какой-то новой версии дров. В этой версии nls_charset12.jar имеет размер 5000574 байт ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.05.2005, 14:13 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=32422091&tid=2151857]: |
0ms |
get settings: |
10ms |
get forum list: |
18ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
173ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
83ms |
get tp. blocked users: |
1ms |
| others: | 257ms |
| total: | 563ms |

| 0 / 0 |
