Oracle и Java динамическое предложение "Order by" - PullRequest
2 голосов
/ 16 сентября 2010

Я пытаюсь построить динамический SQL-запрос в Java (показано ниже)содержит ли таблица столбец с именем 'custID'.В этом столбце будет несколько таблиц, поэтому я хочу отсортировать таблицы с этим столбцом по custID.(Вместо того, чтобы иметь сотни дополнительных операторов if для каждой таблицы, которая имеет это имя столбца.) Возможно ли это?Я видел людей, использующих функцию «декодирования», но я не могу понять, как использовать ее здесь.

Ответы [ 5 ]

6 голосов
/ 16 сентября 2010

Используйте DatabaseMetaData , чтобы получить информацию о таблице.

Вы можете использовать методы getTablexxx() и getColumnxx() для получения информации о таблице.

Connection conn = DriverManager.getConnection(.....);
DatabaseMetaData dbmd = conn.getMetaData();
dbmd.getxxxx(); 

Примечание: вы забыли пробел в своем коде перед предложением ORDER BY.

2 голосов
/ 16 сентября 2010

Если вы довольны жестким кодированием, можно избежать нескольких условий, чтобы хранить список всех таблиц, включающих custID.

private final static String tablesWithCustID = "/TableX/TableY/TableZ/";

...

if (tablesWithCustID.contains( tableName )) {
  sqlStr = sqlStr.concat("order by custID")
}

.простая строка с разделителями, если вам нравится.

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

1 голос
/ 17 сентября 2010

Как насчет ArrayList.contains()?
Вы можете создать список таблиц, в которых есть этот столбец, и просто проверить tables.contains(tablename) в конечном условии if.

1 голос
/ 16 сентября 2010

Я понимаю, что вы ищете решение, которое может сделать это за один запрос, то есть без предварительного выполнения отдельного запроса метаданных.

К сожалению, это будет невозможно. Функция decode может выполнять некоторые динамические действия со значениями столбцов, но не с именами столбцов. И вы ищете решение для динамического получения имени столбца.

Альтернативой может быть просто добавление ORDER BY 1, 2. Это старый синтаксис, который означает порядок по первому, а затем по второму столбцу. Это может быть хорошим решением, если столбец custID является первым столбцом. В противном случае это, по крайней мере, даст вам некоторую сортировку.

1 голос
/ 16 сентября 2010

Самый простой способ сделать это - прочитать определения столбцов из USER_TAB_COLUMNS или ALL_TAB_COLUMNS и проверить наличие столбца custID. Без сумасшедших трюков с PL / SQL вы не сможете решить эту проблему одним только SQL.

Кстати, отсутствует "" между tableName и порядком по предложениям.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...