JDBC+Oracle9i. Извлечение столбцов из VIEW
От: aod_fess  
Дата: 02.02.07 13:25
Оценка:
Люди, подскажите плиз, как имея имя VIEW извлечь реальные колумны на которые вью ссылается (имя таблицы и имя колумна) для всех его столбцов?
JDBC + Oracle9i.
Re: JDBC+Oracle9i. Извлечение столбцов из VIEW
От: Георгий  
Дата: 02.02.07 13:32
Оценка:
Здравствуйте, aod_fess, Вы писали:

_>Люди, подскажите плиз, как имея имя VIEW извлечь реальные колумны на которые вью ссылается (имя таблицы и имя колумна) для всех его столбцов?

_>JDBC + Oracle9i.

Если не серкет, зачем ?
Re: JDBC+Oracle9i. Извлечение столбцов из VIEW
От: C0s Россия  
Дата: 02.02.07 13:39
Оценка:
Здравствуйте, aod_fess, Вы писали:

_>Люди, подскажите плиз, как имея имя VIEW извлечь реальные колумны на которые вью ссылается (имя таблицы и имя колумна) для всех его столбцов?

_>JDBC + Oracle9i.

а если некоторые или вообще ни один из столбцов этого view ни на какие таблицы не ссылается?

по сути: надо выполнить запрос (можешь его уточнить в форуме по БД)
select t.text from sys.all_views t where t.view_name = 'YourView' and t.owner = 'YourViewOwner'

и попарсить полученный текст ....
Re[2]: JDBC+Oracle9i. Извлечение столбцов из VIEW
От: aod_fess  
Дата: 02.02.07 13:41
Оценка:
Здравствуйте, Георгий, Вы писали:

Г>Если не серкет, зачем ?


Не секрет
В приложении есть свои внутренние типы для столбцов, которые записаны в отдельной системной (нашей) таблице. Не прописывать же там еще и вьюшки (информация-то дублируется)?.. Теперь мне нужно вернуть вью (на клиент), но типы прописать такие, как у столбцов оригинальных таблиц. Вот сижу и парюсь...
Re[3]: JDBC+Oracle9i. Извлечение столбцов из VIEW
От: C0s Россия  
Дата: 02.02.07 13:48
Оценка:
Здравствуйте, aod_fess, Вы писали:

_>В приложении есть свои внутренние типы для столбцов, которые записаны в отдельной системной (нашей) таблице. Не прописывать же там еще и вьюшки (информация-то дублируется)?..


архитектор у вас шутник...
Re[4]: JDBC+Oracle9i. Извлечение столбцов из VIEW
От: aod_fess  
Дата: 02.02.07 13:58
Оценка:
Здравствуйте, C0s, Вы писали:

C0s>архитектор у вас шутник...


Смешно, но у нас больше 20-ти человек в проекте, и ни одного нормального архитектора Вот и приходится извращаться
Re[2]: JDBC+Oracle9i. Извлечение столбцов из VIEW
От: aod_fess  
Дата: 02.02.07 14:10
Оценка:
Здравствуйте, C0s, Вы писали:

C0s>по сути: надо выполнить запрос (можешь его уточнить в форуме по БД)

C0s>
select t.text from sys.all_views t where t.view_name = 'YourView' and t.owner = 'YourViewOwner'

C0s>и попарсить полученный текст ....

Так-то конечно можно, но что я в итоге получу? DDL для этого VIEW? А потом лингвистический/синтаксический анализ полученого стейтмента?
А нет ли такой фишки, чтобы просто в ResultSet получить названия колумнов?
Re[3]: JDBC+Oracle9i. Извлечение столбцов из VIEW
От: Blazkowicz Россия  
Дата: 02.02.07 14:15
Оценка:
Здравствуйте, aod_fess, Вы писали:

_>Так-то конечно можно, но что я в итоге получу? DDL для этого VIEW? А потом лингвистический/синтаксический анализ полученого стейтмента?

_>А нет ли такой фишки, чтобы просто в ResultSet получить названия колумнов?

Средсвами JDBC — нет. Спроси на форума БД, может какой хитрый запрос подскажут.
Re[3]: JDBC+Oracle9i. Извлечение столбцов из VIEW
От: C0s Россия  
Дата: 02.02.07 14:20
Оценка:
Здравствуйте, aod_fess, Вы писали:

_>Так-то конечно можно, но что я в итоге получу? DDL для этого VIEW? А потом лингвистический/синтаксический анализ полученого стейтмента?


ну да, свальный архитекторский грех 20и человек к такой возне обычно и приводит

_>А нет ли такой фишки, чтобы просто в ResultSet получить названия колумнов?


см. мой наводящий вопрос выше: а если некоторые или вообще ни один из столбцов этого view ни на какие таблицы не ссылается?
добавлю еще: колонки во view могут быть запросто переименованы, это может быть union столбцов из разных таблиц... [список "наводящих на размышления вещей" можно продолжить]
Re[3]: JDBC+Oracle9i. Извлечение столбцов из VIEW
От: ddocker Россия www.codelab.ru
Дата: 02.02.07 14:31
Оценка:
_>Не секрет
_>В приложении есть свои внутренние типы для столбцов, которые записаны в отдельной системной (нашей) таблице. Не прописывать же там еще и вьюшки (информация-то дублируется)?.. Теперь мне нужно вернуть вью (на клиент), но типы прописать такие, как у столбцов оригинальных таблиц. Вот сижу и парюсь...
Сделать маппинг (хеш-таблицу) только тех названий колонок view, которые отличаются от соответствующих названий колонок в таблице.
т.е если в этом маппинге нет названия данной колонки view, то значит имя у столбца, на которое она ссылается — такое же, если есть, то значит имя столбца = значению, лежащему по этому ключу(имени колонки view) в этом маппинге.
Дублирование вроде бы должно исключиться...
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[4]: JDBC+Oracle9i. Извлечение столбцов из VIEW
От: dshe  
Дата: 02.02.07 15:08
Оценка:
Здравствуйте, Blazkowicz, Вы писали:

B>Здравствуйте, aod_fess, Вы писали:


_>>Так-то конечно можно, но что я в итоге получу? DDL для этого VIEW? А потом лингвистический/синтаксический анализ полученого стейтмента?

_>>А нет ли такой фишки, чтобы просто в ResultSet получить названия колумнов?

B>Средсвами JDBC — нет. Спроси на форума БД, может какой хитрый запрос подскажут.


А ResultSetMetaData .getColumnCount(), getColumnName(), getColumnLabel() не подойдет?
--
Дмитро
Re[4]: JDBC+Oracle9i. Извлечение столбцов из VIEW
От: aod_fess  
Дата: 02.02.07 15:12
Оценка:
Здравствуйте, C0s, Вы писали:

C0s>Здравствуйте, aod_fess, Вы писали:


C0s>см. мой наводящий вопрос выше: а если некоторые или вообще ни один из столбцов этого view ни на какие таблицы не ссылается?

C0s>добавлю еще: колонки во view могут быть запросто переименованы, это может быть union столбцов из разных таблиц... [список "наводящих на размышления вещей" можно продолжить]

Да, Вы совершенно правы. В итоге придется мне типы хранить в системной таблице и для вьюшек Самое простое решение без всяких напрягов.
Re[5]: JDBC+Oracle9i. Извлечение столбцов из VIEW
От: Blazkowicz Россия  
Дата: 02.02.07 15:13
Оценка:
Здравствуйте, dshe, Вы писали:

B>>Средсвами JDBC — нет. Спроси на форума БД, может какой хитрый запрос подскажут.


D>А ResultSetMetaData .getColumnCount(), getColumnName(), getColumnLabel() не подойдет?


Маловероятно. ИМХО, вернет алиасы которые у view.
Re[5]: JDBC+Oracle9i. Извлечение столбцов из VIEW
От: C0s Россия  
Дата: 02.02.07 15:15
Оценка:
Здравствуйте, dshe, Вы писали:

D>А ResultSetMetaData .getColumnCount(), getColumnName(), getColumnLabel() не подойдет?


имеем
CREATE OR REPLACE VIEW my_view AS SELECT t.my_column AS other_column, 'preved' AS bear_column, my_package.my_func(t.my_column_2) FROM my_table t

интересно, что вернут эти методы для "SELECT * FROM my_view"? (вопрос риторический)
Re[6]: JDBC+Oracle9i. Извлечение столбцов из VIEW
От: aod_fess  
Дата: 02.02.07 15:42
Оценка:
Здравствуйте, C0s, Вы писали:

C0s>имеем
CREATE OR REPLACE VIEW my_view AS SELECT t.my_column AS other_column, 'preved' AS bear_column, my_package.my_func(t.my_column_2) FROM my_table t

C0s>интересно, что вернут эти методы для "SELECT * FROM my_view"? (вопрос риторический)

Ладно, пусть имеем немного измененную исходную задачу (так, для интереса):

Все вью в базе имеет структуру:
CREATE OR REPLACE VIEW my_view AS SELECT t1.my_column1 AS mt1c1, t1.my_column2 AS mt1c2, t2.my_column1 AS mt1c2 FROM my_table1 t1, my_table2 t2 WHERE t1.my_column3 = t2.my_column2


Т.е. грубо говоря, каждому колумну вью ставится в соответствие один колумн какой-либо таблицы.
Хотя это и не принципиально.

Необходимо поучить что-то вроде:

my_view.mt1c1 == my_table1.my_column1
my_view.mt1c2 == my_table1.my_column2
my_view.mt2c1 == my_table2.my_column1

Для вашего же примера это будет:

my_view.other_column == my_table.my_column
my_view.bear_column == 'preved'
my_view.<вероятно, пропущеное имя > == my_package.my_func(my_table.my_column_2)

И сделать бы это не распарсивая DDL, а каким-нибудь хитрым запросом?..
Вопрос конечно, ближе к DB форуму, но все же...
Re[7]: JDBC+Oracle9i. Извлечение столбцов из VIEW
От: C0s Россия  
Дата: 02.02.07 15:52
Оценка:
Здравствуйте, aod_fess, Вы писали:

_>Для вашего же примера это будет:


_>my_view.other_column == my_table.my_column

_>my_view.bear_column == 'preved'
_>my_view.<вероятно, пропущеное имя > == my_package.my_func(my_table.my_column_2)

верно только для первой строки
для второй и третьей исходных имён нет: 'preved' — это значение, а my_func — возвращает значение

_>И сделать бы это не распарсивая DDL, а каким-нибудь хитрым запросом?..


так я всю дорогу толкую о том, что задача в общем случае не имеет решения, ибо колонки не обязательно основываются на таблицах
а парсинг может помочь отсеять зерна от плевел (т.е. вычислимым полям не пытаться сопоставлять "ваши магические" типы)
Re[8]: JDBC+Oracle9i. Извлечение столбцов из VIEW
От: aod_fess  
Дата: 02.02.07 16:02
Оценка:
Здравствуйте, C0s, Вы писали:

_>>my_view.other_column == my_table.my_column

_>>my_view.bear_column == 'preved'
_>>my_view.<вероятно, пропущеное имя > == my_package.my_func(my_table.my_column_2)

C0s>верно только для первой строки

C0s>для второй и третьей исходных имён нет: 'preved' — это значение, а my_func — возвращает значение

Я не имел ввиду конкретные имена колумнов Имелось ввиду то, что Oracle подставляет в данную колонку VIEW.
Т.е., в принципе то же, что написано в DDL-е, но без алиасов и желательно бы в ResultSet'ом (любым).
Re[9]: JDBC+Oracle9i. Извлечение столбцов из VIEW
От: C0s Россия  
Дата: 02.02.07 16:07
Оценка:
Здравствуйте, aod_fess, Вы писали:

_>Я не имел ввиду конкретные имена колумнов Имелось ввиду то, что Oracle подставляет в данную колонку VIEW.

_>Т.е., в принципе то же, что написано в DDL-е, но без алиасов и желательно бы в ResultSet'ом (любым).

а, понял
имхо в любом случае все упирается в разбор, просто разумно понять, предоставляет ли oracle что-то для разбора.
afaik jdbc ничего предоставлять для этого не может (слишком общая технология)... спеку по jdbc читать лениво, поэтому придется тебе поверить на слово
Re[3]: JDBC+Oracle9i. Извлечение столбцов из VIEW
От: zanimon  
Дата: 23.03.07 17:31
Оценка:
Здравствуйте, aod_fess, Вы писали:

Если я правильно понял вашу задачу, то решение выбранное вашим архитектором не совсем правильное...(на мой взгляд)
_>В приложении есть свои внутренние типы для столбцов, которые записаны в отдельной системной (нашей) таблице. Не прописывать же там еще и вьюшки (информация-то дублируется)?.. Теперь мне нужно вернуть вью (на клиент), но типы прописать такие, как у столбцов оригинальных таблиц. Вот сижу и парюсь...

Проще в вашей отделной системной таблице хранить соответствие типов БД вашим внутренним типам.
Есть такая вьюшка в Oracle SYS.COL, в которой хранятся названия столбцов, их тип, названия объектов к которым они относятся(таблиц, вьюшек).
Если столбец вьюшки получается просто выбором поля определенной таблицы, то их типы будут совпадать. Если же столбец получается в результате вычислений, то все зависит от того какой тип возвращает функция. Например:
Создадим функцию, которая возвращает varchar2:
CREATE OR REPLACE FUNCTION CALC(PARAM IN VARCHAR2) RETURN VARCHAR2 IS
BEGIN 
  RETURN(LPAD(PARAM,10,'C'));
END CALC;


теперь создадим две вьюшки
CREATE OR REPLACE VIEW V_TEST1 AS
SELECT CALC('Bb') FIELD1 FROM DUAL

и
CREATE OR REPLACE VIEW V_TEST2 AS
SELECT SUBSTR(CALC('Bb'),1,10) FIELD1 FROM DUAL


Посмотрим что покажет системная вьюшка SYS.COL:
 SELECT * FROM SYS.COL WHERE TNAME like 'V_TEST%'


TNAME      COLNO    CNAME      COLTYPE      WIDTH    ....
V_TEST1      1      FIELD2    VARCHAR2     4000 ....
V_TEST2      1      FIELD2    VARCHAR2      10    ....

Как видно из примера, в первом случае длина возвращаемого varchar2 не была известна, по этому была принята максимально возможная для типа varchar2 — 4000. Во втором случае в запросе, на основе которого создавалась вьюшка, явно ограничиваем значение 10 символами, по этому тип колонки и есть varchar2(10)
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.