to_date не проверяет значение пользовательского ввода при создании представления в оракуле

Я создаю одно представление в Oracle 12.2.0.1.0 и добавляю в свое представление следующее условие:

WHERE trunc(whenmodified) = TO_DATE('&userinput', 'DDMMYYYY')

whenmodified имеет тип даты.

Я ожидал получить сообщение об ошибке, когда пользовательский ввод не в формате «DDMMYYYY». Но для ввода типа 14142020 нет ошибки, и представление создается. Я ожидал следующую ошибку: ORA-01843: недопустимый месяц

01843. 00000 -  "not a valid month"
*Cause:    
*Action:

Я использую SQL DEVELOPER для этого.


person coming out of void    schedule 20.03.2020    source источник
comment
Представление не имеет параметров. Амперсанд не имеет ничего общего с Oracle SQL. Это средство вашего инструмента для замены значений на лету. Таким образом, Oracle видит уже замененную строку. Вместо этого вы можете добавить в таблицу виртуальный столбец user_formatted_date generate always as to_char(whenmodified, 'DDMMYYYY'), если хотите упростить написание запросов с помощью where user_formatted_date = :userinput.   -  person Thorsten Kettner    schedule 20.03.2020


Ответы (2)


Дата, которую вы вводите, проверяется не при DDL, а при выборе из этого представления:

SQL> create or replace view td as select sysdate sd,dummy from dual where trunc(sysdate)=to_date('&az','ddmmyyyy');
Enter value for az: 12131444
old   1: create or replace view td as select sysdate sd,dummy from dual where trunc(sysdate)=to_date('&az','ddmmyyyy')
new   1: create or replace view td as select sysdate sd,dummy from dual where trunc(sysdate)=to_date('12131444','ddmmyyyy')

View created.

SQL> select * from td;
select * from td
               *
ERROR at line 1:
ORA-01843: not a valid month


SQL> set long 2000
SQL> select text from user_views where view_name='TD';

TEXT
--------------------------------------------------------------------------------
select sysdate sd,dummy from dual where trunc(sysdate)=to_date('12131444','ddmmyyyy')

Как видите, текст представления принимается как есть, без проверки. Проверка выполняется при использовании представления.

person gsalem    schedule 20.03.2020

То, что вы делаете, на мой взгляд, неправильно. Создать представление как есть, без таких условий. Затем, если вы хотите ограничить строки, возвращаемые при выборе из этого представления, включите его в предложение select where. Например:

create or replace view v_test as
select whatever
from your_table;

select * From v_test
where trunc(whenmodified) = some_date

Кроме того, какую выгоду вы ожидаете от предоставления пользователям возможности создавать представления? Это вы должны сделать один раз и позволить пользователям использовать представление.

person Littlefoot    schedule 20.03.2020