Как добавить значение harcode в оператор запроса для oracle

#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 предложение вашего вывода и должны использовать двойные кавычки вокруг идентификаторов, поскольку они могут быть чувствительны к регистру.