to_date не проверяет введенное пользователем значение при создании представления в oracle - PullRequest
0 голосов
/ 20 марта 2020

Я создаю один вид в Oracle 12.2.0.1.0 и добавляю в мой вид следующее условие:

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

, когда модифицирован тип даты.

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

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

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

Ответы [ 2 ]

5 голосов
/ 20 марта 2020

Дата, которую вы вводите, не проверяется в 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')

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

3 голосов
/ 20 марта 2020

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

create or replace view v_test as
select whatever
from your_table;

select * From v_test
where trunc(whenmodified) = some_date

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

...