to_date 在 Oracle 中创建视图时不验证用户输入值
to_date not validating user input value while creating view in oracle
我正在 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 开发人员。
您输入的日期未在 DDL 上验证,但在 select 从该视图:
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')
如您所见,视图的文本按原样使用,没有验证。使用视图时进行验证。
在我看来,您所做的是错误的。没有这样的条件,按原样 创建视图。然后,如果您想限制从该视图中选择时返回的行,请将其包含在 select
的 where
子句中。例如:
create or replace view v_test as
select whatever
from your_table;
select * From v_test
where trunc(whenmodified) = some_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 开发人员。
您输入的日期未在 DDL 上验证,但在 select 从该视图:
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')
如您所见,视图的文本按原样使用,没有验证。使用视图时进行验证。
在我看来,您所做的是错误的。没有这样的条件,按原样 创建视图。然后,如果您想限制从该视图中选择时返回的行,请将其包含在 select
的 where
子句中。例如:
create or replace view v_test as
select whatever
from your_table;
select * From v_test
where trunc(whenmodified) = some_date
此外,您希望让用户创建视图有什么好处?应该由你做一次,让用户使用视图。