#sql #oracle #plsql
#sql #Oracle #plsql
Вопрос:
Как сконструировать приведенный ниже код sql в oracle
select 'select top 1 ''' TABLE_NAME '.' column_name ''' from ' TABLE_NAME ' where ' COLUMN_NAME ' between ''1/27/2010 15:21'' and ''1/27/2010 15:22'' union '
from INFORMATION_SCHEMA.columns
where data_type = 'datetime'
order by TABLE_NAME
select 'select''' TABLE_NAME '.' column_name ''' from ' TABLE_NAME ' where ROWNUM <= 1 and ' COLUMN_NAME ' between ''1/27/2010 15:21'' and ''1/27/2010 15:22'' union '
from all_tab_columns
WHERE DATA_TYPE='DATE'
Комментарии:
1. я хочу, чтобы моим результатом был текст запроса
Ответ №1:
не является оператором конкатенации строк; используйте ||
вместо этого.
select 'select ''' || TABLE_NAME || '.' || column_name || ''' from "' || OWNER || '"."' || TABLE_NAME || '" where ROWNUM <= 1 and ' || COLUMN_NAME || ' between DATE ''2010-01-27'' INTERVAL ''15:21'' HOUR TO MINUTE and DATE ''2010-01-27'' INTERVAL ''15:22'' HOUR TO MINUTE union '
from all_tab_columns
WHERE DATA_TYPE='DATE'
db<>скрипка здесь
Вы также не должны полагаться на неявное преобразование строк в даты (поскольку ваш запрос завершится ошибкой, если параметры сеанса не соответствуют вашему ожидаемому формату или если пользователь решит изменить этот формат). Вместо этого вы должны либо использовать TO_DATE
с явной моделью формата (т. е. TO_DATE( '1/27/2010 15:21', 'MM/DD/YYYY HH24:MI' )
Или Использовать литералы (т. е. DATE '2010-01-27' INTERVAL '15:21' HOUR TO MINUTE
Или TIMESTAMP '2010-01-27 15:21:00'
).
Кроме того, вы, вероятно, захотите выполнить фильтрацию по схеме OWNER
и включить схему в FROM
предложение вашего вывода и должны использовать двойные кавычки вокруг идентификаторов, поскольку они могут быть чувствительны к регистру.