Люди, подскажите плиз, как имея имя VIEW извлечь реальные колумны на которые вью ссылается (имя таблицы и имя колумна) для всех его столбцов?
JDBC + Oracle9i.
Здравствуйте, aod_fess, Вы писали:
_>Люди, подскажите плиз, как имея имя VIEW извлечь реальные колумны на которые вью ссылается (имя таблицы и имя колумна) для всех его столбцов? _>JDBC + Oracle9i.
Здравствуйте, aod_fess, Вы писали:
_>Люди, подскажите плиз, как имея имя VIEW извлечь реальные колумны на которые вью ссылается (имя таблицы и имя колумна) для всех его столбцов? _>JDBC + Oracle9i.
а если некоторые или вообще ни один из столбцов этого view ни на какие таблицы не ссылается?
по сути: надо выполнить запрос (можешь его уточнить в форуме по БД)
select t.text from sys.all_views t where t.view_name = 'YourView' and t.owner = 'YourViewOwner'
Здравствуйте, Георгий, Вы писали:
Г>Если не серкет, зачем ?
Не секрет
В приложении есть свои внутренние типы для столбцов, которые записаны в отдельной системной (нашей) таблице. Не прописывать же там еще и вьюшки (информация-то дублируется)?.. Теперь мне нужно вернуть вью (на клиент), но типы прописать такие, как у столбцов оригинальных таблиц. Вот сижу и парюсь...
Здравствуйте, aod_fess, Вы писали:
_>В приложении есть свои внутренние типы для столбцов, которые записаны в отдельной системной (нашей) таблице. Не прописывать же там еще и вьюшки (информация-то дублируется)?..
Здравствуйте, C0s, Вы писали:
C0s>по сути: надо выполнить запрос (можешь его уточнить в форуме по БД) C0s>
select t.text from sys.all_views t where t.view_name = 'YourView' and t.owner = 'YourViewOwner'
C0s>и попарсить полученный текст ....
Так-то конечно можно, но что я в итоге получу? DDL для этого VIEW? А потом лингвистический/синтаксический анализ полученого стейтмента?
А нет ли такой фишки, чтобы просто в ResultSet получить названия колумнов?
Здравствуйте, aod_fess, Вы писали:
_>Так-то конечно можно, но что я в итоге получу? DDL для этого VIEW? А потом лингвистический/синтаксический анализ полученого стейтмента? _>А нет ли такой фишки, чтобы просто в ResultSet получить названия колумнов?
Средсвами JDBC — нет. Спроси на форума БД, может какой хитрый запрос подскажут.
Здравствуйте, aod_fess, Вы писали:
_>Так-то конечно можно, но что я в итоге получу? DDL для этого VIEW? А потом лингвистический/синтаксический анализ полученого стейтмента?
ну да, свальный архитекторский грех 20и человек к такой возне обычно и приводит
_>А нет ли такой фишки, чтобы просто в ResultSet получить названия колумнов?
см. мой наводящий вопрос выше: а если некоторые или вообще ни один из столбцов этого view ни на какие таблицы не ссылается?
добавлю еще: колонки во view могут быть запросто переименованы, это может быть union столбцов из разных таблиц... [список "наводящих на размышления вещей" можно продолжить]
_>Не секрет _>В приложении есть свои внутренние типы для столбцов, которые записаны в отдельной системной (нашей) таблице. Не прописывать же там еще и вьюшки (информация-то дублируется)?.. Теперь мне нужно вернуть вью (на клиент), но типы прописать такие, как у столбцов оригинальных таблиц. Вот сижу и парюсь...
Сделать маппинг (хеш-таблицу) только тех названий колонок view, которые отличаются от соответствующих названий колонок в таблице.
т.е если в этом маппинге нет названия данной колонки view, то значит имя у столбца, на которое она ссылается — такое же, если есть, то значит имя столбца = значению, лежащему по этому ключу(имени колонки view) в этом маппинге.
Дублирование вроде бы должно исключиться...
Здравствуйте, Blazkowicz, Вы писали:
B>Здравствуйте, aod_fess, Вы писали:
_>>Так-то конечно можно, но что я в итоге получу? DDL для этого VIEW? А потом лингвистический/синтаксический анализ полученого стейтмента? _>>А нет ли такой фишки, чтобы просто в ResultSet получить названия колумнов?
B>Средсвами JDBC — нет. Спроси на форума БД, может какой хитрый запрос подскажут.
А ResultSetMetaData .getColumnCount(), getColumnName(), getColumnLabel() не подойдет?
Здравствуйте, C0s, Вы писали:
C0s>Здравствуйте, aod_fess, Вы писали:
C0s>см. мой наводящий вопрос выше: а если некоторые или вообще ни один из столбцов этого view ни на какие таблицы не ссылается? C0s>добавлю еще: колонки во view могут быть запросто переименованы, это может быть union столбцов из разных таблиц... [список "наводящих на размышления вещей" можно продолжить]
Да, Вы совершенно правы. В итоге придется мне типы хранить в системной таблице и для вьюшек Самое простое решение без всяких напрягов.
Здравствуйте, dshe, Вы писали:
B>>Средсвами JDBC — нет. Спроси на форума БД, может какой хитрый запрос подскажут.
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
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
Т.е. грубо говоря, каждому колумну вью ставится в соответствие один колумн какой-либо таблицы.
Хотя это и не принципиально.
Здравствуйте, 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, а каким-нибудь хитрым запросом?..
так я всю дорогу толкую о том, что задача в общем случае не имеет решения, ибо колонки не обязательно основываются на таблицах
а парсинг может помочь отсеять зерна от плевел (т.е. вычислимым полям не пытаться сопоставлять "ваши магические" типы)
Здравствуйте, 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'ом (любым).
Здравствуйте, aod_fess, Вы писали:
_>Я не имел ввиду конкретные имена колумнов Имелось ввиду то, что Oracle подставляет в данную колонку VIEW. _>Т.е., в принципе то же, что написано в DDL-е, но без алиасов и желательно бы в ResultSet'ом (любым).
а, понял
имхо в любом случае все упирается в разбор, просто разумно понять, предоставляет ли oracle что-то для разбора.
afaik jdbc ничего предоставлять для этого не может (слишком общая технология)... спеку по jdbc читать лениво, поэтому придется тебе поверить на слово
Если я правильно понял вашу задачу, то решение выбранное вашим архитектором не совсем правильное...(на мой взгляд) _>В приложении есть свои внутренние типы для столбцов, которые записаны в отдельной системной (нашей) таблице. Не прописывать же там еще и вьюшки (информация-то дублируется)?.. Теперь мне нужно вернуть вью (на клиент), но типы прописать такие, как у столбцов оригинальных таблиц. Вот сижу и парюсь...
Проще в вашей отделной системной таблице хранить соответствие типов БД вашим внутренним типам.
Есть такая вьюшка в 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
Как видно из примера, в первом случае длина возвращаемого varchar2 не была известна, по этому была принята максимально возможная для типа varchar2 — 4000. Во втором случае в запросе, на основе которого создавалась вьюшка, явно ограничиваем значение 10 символами, по этому тип колонки и есть varchar2(10)