totodate在oracle中创建视图时未验证用户输入值

问题描述 投票:0回答:1

我正在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。

sql oracle view to-date
1个回答
0
投票

您输入的日期不会根据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')

您可以看到视图文本是按原样使用的,没有经过验证。使用视图时,将完成验证。


0
投票

我认为您正在做的是错的。创建视图as is,没有这样的条件。然后,如果要限制从该视图中选择时返回的行,请将其包含在selectwhere子句中。例如:

create or replace view v_test as
select whatever
from your_table;

select * From v_test
where trunc(whenmodified) = some_date

此外,让用户创建视图有什么好处?是you应该一次执行一次,然后让用户use视图。

© www.soinside.com 2019 - 2024. All rights reserved.