Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Oracle > DatabaseMData::geProcedureCols() vs user_arguments


Автор: setnull 27.8.2010, 18:25
Все здравствуйте!!!
Есть тип
Код

create or replace TYPE         "NVARCHAR_ARRAY" AS VARRAY(320000000) OF NVARCHAR2(32767);

Проблема стоит вокруг опоределения параметров процйдур такого типа через ojdbc.
Если анализировать эти параметры в представлении user_arguments, то они там представлены двумя строками 

data_level data_type
0              VARRAY
1              NVARCHAR2

Сейчас же клиентский джава-код анализирует параметры процедур через функцию DatabaseMetaData::geProcedureColumns(), которая в свою очередь возращает только строки, соответствующие строкам user_arguments с data_level=0

В свою очередь, если переводить все, на информацию из user_arguments, то, как мимнимум (еще вплотную не анализировал), user_arguments предоставляет данные о типе через его имя, а geProcedureColumns в значении из java.sql.Types. 

Т.е. вопрос в одном из двух
1) Как средствами jodbc дополниить/расширить информацию  из DatabaseMetaData::geProcedureColumns() недостающей?
либо прийдется переводить все на запросы из user_arguments, и как минимум
2)как корректно отобразить Имя типа в множество java.sql.Types (имеется ввиду не техника, а принцип), т.к. есть подозрение, что это не просто соответствие один к одному, и самому писать - сразу все не предусмотришь... Может это можно сделать также средствами самого ojdbc?

Вообще, хотелось бы решить это как-то первым подходом, т.к. кажется, что переводить на другой источник информации, хоть и похожий, будет в любом случае хлопотнее...

Спасибо!!!

Автор: setnull 30.8.2010, 15:02
проследил:
одждбси делает такой запрос
Код

SELECT package_name AS procedure_cat,
       owner AS procedure_schem,
       object_name AS procedure_name,
       argument_name AS column_name,
       DECODE(position, 0, 5,
                        DECODE(in_out, 'IN', 1,
                                       'OUT', 4,
                                       'IN/OUT', 2,
                                       0)) AS column_type,
       DECODE (data_type, 'CHAR', 1,
                          'VARCHAR2', 12,
                          'NUMBER', 3,
                          'LONG', -1,
                          'DATE', 93,
                          'RAW', -3,
                          'LONG RAW', -4,
                          'TIMESTAMP', 93, 
                          'TIMESTAMP WITH TIME ZONE', -101, 
               'TIMESTAMP WITH LOCAL TIME ZONE', -102, 
               'INTERVAL YEAR TO MONTH', -103, 
               'INTERVAL DAY TO SECOND', -104, 
               'BINARY_FLOAT', 100, 'BINAvRY_DOUBLE', 101,               1111) AS data_type,
       DECODE(data_type, 'OBJECT', type_owner || '.' || type_name,               data_type) AS type_name,
       DECODE (data_precision, NULL, data_length,
                               data_precision) AS precision,
       data_length AS length,
       data_scale AS scale,
       10 AS radix,
       1 AS nullable,
       NULL AS remarks,
       sequence,
       overload,
       default_value
 FROM all_arguments
WHERE owner LIKE :1 ESCAPE '/'
  AND object_name LIKE :2 ESCAPE '/' AND data_level = 0
  AND package_name LIKE :3 ESCAPE '/'
  AND (argument_name LIKE :5 ESCAPE '/'
       OR (argument_name IS NULL
           AND data_type IS NOT NULL))
ORDER BY procedure_schem, procedure_name, overload, sequence

Привнеслась ясность в процесс декодирования типа...
Но как через ojdbc запросить data_level >= 0
Или как быть, ведь ojdbc не дает даже имени пользовательского типа, чтоб потом уточнить его мету...
Или таки писать свой запрос, во многом дублирующий ????

Автор: ToshaCh 30.8.2010, 15:17
Хорошо бы этот вопрос отзеркалировать в раздел java, может кто-нить сталкивался. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)