检查插入的值是Varchar还是Integer

时间:2013-11-16 16:09:58

标签: sql oracle integer

我正在使用SQL Developer / Oracle,如果在特定字段上插入的值是整数或只是“字符串”,我需要检查触发器。

我尝试了isnumeric(),但Oracle中不存在此功能。因为我无法在任何地方找到它,所以Oracle中的等价物是什么?

2 个答案:

答案 0 :(得分:3)

从上次评论到@Ben's answer

  

'1234'应被视为字符串并失败

您似乎希望在插入时对文字进行数据类型检查,并且只允许插入数字数据类型的文字。 Oracle在有意义的情况下进行隐式数据类型转换。例如,表中有一列数字数据类型。当您尝试向该列插入字符文字'123'时,尽管文字是字符数据类型(char,简单字符文字属于CHAR数据,但操作仍会成功默认情况下不输入varchar2,因为Oracle 在列的数据类型上查看,然后在数据类型和字符文字的元素中查看并确定'是,它是有意义的将该字符文字转换为数字。并且做到了。正如@Ben所说,让你的应用程序检查你试图插入表中的值是数字还是字符数据类型可能会更好。

话虽如此,进行数据类型检查并允许仅插入数字数据类型的文字或变量的最简单的方法是创建一个包含一个重载函数的包,比如isnumber()。该函数的第一个版本具有varchar2数据类型的形式参数,其重载版本具有number数据类型的形式参数。根据实际参数的数据类型,Oracle将选择适当的函数版本:

SQL> create or replace package Util1 as
  2    function isnumber(p_val in varchar2)
  3      return varchar2;
  4    function isnumber(p_val in number)
  5      return number;
  6  end;
  7  /
Package created

SQL> create or replace package body Util1 as
  2    function isnumber(p_val in varchar2)
  3      return varchar2 is
  4    begin
  5      raise_application_error(-20000, 'Not a numeric data type');
  6    end;
  7  
  8    function isnumber(p_val in number)
  9       return number is
 10    begin
 11      return p_val;
 12    end;
 13  end;
 14  /
Package body created

当您使用数值数据类型的实际参数调用util1.isnumber()函数时,它只返回它,并且当使用字符数据类型的实际参数调用函数时,将引发异常。

SQL> create table t1(col number);
Table created

SQL> insert into t1(col) values(util1.isnumber(123));
1 row inserted

SQL> commit;
Commit complete

SQL> insert into t1(col) values(util1.isnumber('123'));

ORA-20000: Not a numeric data type
ORA-06512: at "HR.UTIL1", line 5

SQL> insert into t1(col) values(util1.isnumber('12345f'));

ORA-20000: Not a numeric data type
ORA-06512: at "HR.UTIL1", line 5

注意由于隐式数据类型转换,此方法在触发器中不起作用。在触发器中,您必须执行以下操作:

 :new.col_name := util1.isnumber(:new.col_name)

由于col_name属于number数据类型,Oracle将始终使用数字数据类型的形式参数调用isnumber()函数的版本,即使插入实际值,插入也将成功(说)'123'

答案 1 :(得分:0)

  

我正在使用if。这意味着如果插入的值是varhchar,我将引发应用程序错误,否则我将什么都不做。

当您将字符插入数字字段时,您将收到一个“无效数字”异常(ORA-01722)。这使您的选择更容易; 测试以查看您插入的字符串是否为字符。当用户将字符插入数字字段并重新引发应用程序错误时(如果您真的觉得必须),捕获引发的异常。

根本没有必要进行测试。

例如:

create table test ( a number );

begin
   insert into test values ('a');
exception when INVALID_NUMBER then
   raise_application_error(-20000, 'The number wasn''t a number');
end;
/

值得注意的是,您还可以测试应用程序代码中是否有某个数字(如果它是应用程序)。那么你就不必再去数据库了。