Re: FW: ORA-01722: invalid number

From: Jose Soares <jose.soares_at_sferacarta.com>
Date: Wed, 04 Feb 2015 14:43:49 +0100
Message-ID: <54D22215.1010903_at_sferacarta.com>



Thanks for your answer, Mark.
In the meantime I was arrived at a conclusion to be drawn similar to yours and in fact I replaced all those '0.0' (*) with 0 using
alter table "table_name"modify "column_name" number default 0 and now it works.
Thanks again for your help.

j



(*) the schema was created automaticaly by sqlalchemy with DefaultClause which defines defaults as strings.

On 02/04/2015 10:36 AM, Mark W. Farnham wrote:
>
> Sorry for the delay. Something bounced.
>
> *From:*Mark W. Farnham [mailto:mwf_at_rsiz.com]
> *Sent:* Wednesday, February 04, 2015 4:35 AM
> *To:* 'jose.soares_at_sferacarta.com'; 'oracle-l_at_freelists.org'
> *Subject:* RE: ORA-01722: invalid number
>
> Having default values that require conversions would seem to be the
> root cause.
>
> Consider:
>
> SQL> r
>
> 1 select
> column_name,data_type,data_type_mod,data_type_owner,data_length,data_precision,data_scale,default_length,data_default
>
> 2* from dba_tab_columns where owner = 'MWF' and table_name = 'JUNK_NLS2'
>
> COLUMN_NAME DATA_TYPE DAT DATA_TYPE_OWNER DATA_LENGTH DATA_PRECISION
> DATA_SCALE DEFAULT_LENGTH DATA_DEFAULT
>
> ------------ ---------- --- --------------- ----------- --------------
> ---------- -------------- --------------------
>
> ID NUMBER ~ ~ 22 ~ ~
> ~ ~
>
> ID2 NUMBER ~ ~ 22 ~
> ~ 5 '0.0'
>
> SQL> c/2//
>
> 2* from dba_tab_columns where owner = 'MWF' and table_name = 'JUNK_NLS'
>
> SQL> r
>
> 1 select
> column_name,data_type,data_type_mod,data_type_owner,data_length,data_precision,data_scale,default_length,data_default
>
> 2* from dba_tab_columns where owner = 'MWF' and table_name = 'JUNK_NLS'
>
> COLUMN_NAME DATA_TYPE DAT DATA_TYPE_OWNER DATA_LENGTH DATA_PRECISION
> DATA_SCALE DEFAULT_LENGTH DATA_DEFAULT
>
> ------------ ---------- --- --------------- ----------- --------------
> ---------- -------------- --------------------
>
> ID NUMBER ~ ~ 22 ~ ~
> ~ ~
>
> ID2 NUMBER ~ ~ 22 ~
> ~ 3 0.0
>
> So if you see (from Jure below)
>
> create table test(id number, id2 number default '0.0');
>
> that would be as in JUNK_NLS2. (no pejorative there, JUNK just means
> stuff I can throw away)
>
> To avoid these problems define your defaults like JUNK_NLS:
>
> create table junk_nls (id number, id2 number default 0.0);
>
> so that the resulting table does not need data conversion upon the
> insertion of each row. (And yes, I think Kim has a point that Oracle
> should at least raise a warning (probably at create time as well as
> insert time) that your default value require conversion. And failing
> to name the offending column is on a par with cable customer service
> instructions.
>
> So I’d fix the table:
>
> SQL> alter table junk_nls2 modify id2 default 0;
>
> Table altered.
>
> SQL> select
> column_name,data_type,data_type_mod,data_type_owner,data_length,data_precision,data_scale,default_length,data_default
>
> 2 from dba_tab_columns where owner = 'MWF' and table_name =
> 'JUNK_NLS2';
>
> COLUMN_NAME DATA_TYPE DAT DATA_TYPE_OWNER DATA_LENGTH DATA_PRECISION
> DATA_SCALE DEFAULT_LENGTH DATA_DEFAULT
>
> ------------ ---------- --- --------------- ----------- --------------
> ---------- -------------- --------------------
>
> ID NUMBER ~ ~ 22 ~
> ~ ~ ~
>
> ID2 NUMBER ~ ~ 22 ~
> ~ 1 0
>
> for example would change the table Jure offers so no conversion is
> required.
>
> Unless your dba has some reason for storing a numeric default as a
> string (I’d be curious as to that answer) I do not understand wanting
> the default value to require conversion on insert or taking up more
> space than it needs to in the dictionary.
>
> Anyway, then it should not matter what your NLS parameters are
> anywhere in the stack. It is possible that your dba will say the table
> is too big to modify and you should be ready to inform the dba this
> operation on default values scales with the number of columns you need
> to change, not the number of rows in the table.
>
> I’m also curious exactly what the source of your “schema” extract was
> below.
>
> Finally, a useful test is to create a test table using your current
> stack having all the columns with defaults populated from the
> problematic table typing the default values exactly as you have them.
> If that fails on some conversion the error returned in sqlplus will
> have an asterisk marking the first problem hit.
>
> Along the lines of Kim’s suggestions a
>
> testparse create table xyz (id number);
>
> command that didn’t stop at the first error and continued (up to a
> defined limit because sometimes things south fast after the first
> error) would be nice. Do not hold your breath. That request is from
> about 1984.
>
> Good luck,
>
> mwf
>
> *From:*oracle-l-bounce_at_freelists.org
> <mailto:oracle-l-bounce_at_freelists.org>
> [mailto:oracle-l-bounce_at_freelists.org] *On Behalf Of *Jose Soares
> *Sent:* Wednesday, February 04, 2015 3:04 AM
> *To:* oracle-l_at_freelists.org <mailto:oracle-l_at_freelists.org>
> *Subject:* Re: ORA-01722: invalid number
>
> Hi all,
>
> I asked the db administer to set nls_numeric_characters but he says me
> that it is already OK
> and sent me this list where infact it seems correct.
>
> Should it be ",." or ".," in my case?
>
>
>
> select * from nls_database_parameters;
> parameter | value
> -----------------------+ ----------------------------
> NLS_LANGUAGE | AMERICAN
> NLS_TERRITORY | AMERICA
> NLS_CURRENCY | $
> NLS_ISO_CURRENCY | AMERICA
> NLS_NUMERIC_CHARACTERS | .,
> NLS_CHARACTERSET | WE8ISO8859P15
> NLS_CALENDAR | GREGORIAN
> NLS_DATE_FORMAT | DD-MON-RR
> NLS_DATE_LANGUAGE | AMERICAN
> NLS_SORT | BINARY
> NLS_TIME_FORMAT | HH.MI.SSXFF AM
> NLS_TIMESTAMP_FORMAT | DD-MON-RR HH.MI.SSXFF AM
> NLS_TIME_TZ_FORMAT | HH.MI.SSXFF AM TZR
> NLS_TIMESTAMP_TZ_FORMAT| DD-MON-RR HH.MI.SSXFF AM TZR
> NLS_DUAL_CURRENCY | $
> NLS_COMP | BINARY
> NLS_LENGTH_SEMANTICS | BYTE
> NLS_NCHAR_CONV_EXCP | FALSE
> NLS_NCHAR_CHARACTERSET | AL16UTF16
> NLS_RDBMS_VERSION | 10.2.0.5.0
> (20 rows)
>
> He said me also, that probably it depends on the client language.
>
> j
>
>
> On 01/30/2015 02:38 PM, Jose Soares wrote:
>
> On 01/30/2015 12:58 PM, Kim Berg Hansen wrote:
>
> (Practically simultaneous thinking, Jure ;-)
>
> A discussion question to everybody:
>
> The docs on CREATE TABLE state as follows:
>
> *DEFAULT*
>
> The |DEFAULT| clause lets you specify a value to be
> assigned to the column if a subsequent |INSERT| statement
> omits a value for the column. The data type of the
> expression must match the data type specified for the
> column. The column must also be large enough to hold this
> expression.
>
> (Highlighting by me.)
>
> * Would you consider this a doc bug? Should it have said
> "the expression must match the data type or be able to be
> implicitly converted"?
> * Can you think of *any *use case where it makes sense that
> the expression does *not *match data type but "only" can
> be implicitly converted?
> * Would you expect Oracle to raise an exception when you try
> to use a string value as default for a number column?
> * Would you consider it a good Request For Enhancement to
> ask Oracle to raise such an exception when datatype in
> DEFAULT clause does not match column datatype properly?
>
> Personally I can't think of a valid use case, so my vote is
> that I would like Oracle to raise exception at CREATE TABLE if
> datatypes of DEFAULT and column does not match.
>
>
> This error raises when one try to create a table using a column
> default that doesn't match the definition of:
> NLS_NUMERIC_CHARACTERS | .,
>
> but, the error even occurs if you after have created the table
> with the right value for NLS_NUMERIC_CHARACTERS ,
> you decide to change it later, as in my case.
>
>
>
> But I may have missed some strange use case that my fantasy is not
> good enough to imagine ;-)
>
> Your opinions?
>
>
> The error message is not clear.
>
> At least I expected something like this:
>
> ORA-1722: invalid value on column "column_name"
>
>
>
> Regards
>
> Kim Berg Hansen
>
> http://dspsd.blogspot.com
>
> kibeha_at_gmail.com <mailto:kibeha_at_gmail.com>
>
> _at_kibeha
>
> On Fri, Jan 30, 2015 at 12:43 PM, Jure Bratina
> <jure.bratina_at_gmail.com <mailto:jure.bratina_at_gmail.com>> wrote:
>
> Hi,
>
> Do you have any triggers defined on the table? If not, maybe the
> default value '0.0' on the NUMBER type columns might be the
> problem e.g.:
>
> SQL> select value
> 2 from nls_session_parameters
> 3 where parameter = 'NLS_NUMERIC_CHARACTERS';
>
> VALUE
> ----------
> .,
>
> SQL> create table test(id number, id2 number default '0.0');
>
> Table created.
>
> SQL> insert into test (id) values (1);
>
> 1 row created.
>
> SQL> alter session set NLS_NUMERIC_CHARACTERS=',.';
>
> Session altered.
>
> SQL> insert into test (id) values (1);
> insert into test (id) values (1)
> *
> ERROR at line 1:
> ORA-01722: invalid number
>
>
> SQL>
>
> Regards,
> Jure Bratina
>
> On Fri, Jan 30, 2015 at 12:18 PM, Jose Soares
> <jose.soares_at_sferacarta.com <mailto:jose.soares_at_sferacarta.com>>
> wrote:
>
> Hi all,
> I have a strange error that I can't understand
> when I try to insert a row into the table below, I get this error:
>
> (DatabaseError) ORA-01722: invalid number
> "INSERT INTO fattura_master (sezionale, anno, numero,
> data_emissione) VALUES ('04', 2015, 9999, current_date)"
>
>
> here's the table schema:
>
> name | type | length| nullable|
> default
> --------------------------+ ---------------------------+ ------+
> --------+ ------------------
> tipo_documento | nvarchar2 | 1 | Y
> | NULL
> sezionale | nvarchar2 | 3 | N
> | NULL
> anno | number | 0 | N | NULL
> numero | number | 0 | N | NULL
> data_emissione | date | 0 | N | NULL
> data_competenza | date | 0 | Y | NULL
> tipo_pagamento | nvarchar2 | 5 | Y
> | NULL
> data_pagamento | date | 0 | Y | NULL
> importo_pagato | number | 0 | Y |
> '0.0'
> bollo | number | 0 | Y |
> '0.0'
> note | nvarchar2 | 200 | Y
> | NULL
> ced | number | 0 | Y | NULL
> id_anagrafica_sede_fiscale| number | 0 | Y | NULL
> intestazione | nvarchar2 | 100 | Y
> | NULL
> indirizzo | nvarchar2 | 100 | Y
> | NULL
> cap | nvarchar2 | 5 | Y
> | NULL
> comune | nvarchar2 | 100 | Y
> | NULL
> provincia | nvarchar2 | 2 | Y
> | NULL
> codice_fiscale | nvarchar2 | 16 | Y
> | NULL
> partita_iva | nvarchar2 | 11 | Y
> | NULL
> id_distretto | number | 0 | Y | NULL
> istat | nvarchar2 | 6 | Y
> | NULL
> iva | number | 0 | Y |
> '0.0'
> aliquota_iva | number | 0 | Y | NULL
> imponibile | number | 0 | Y |
> '0.0'
> enpav_iva | number | 0 | Y |
> '0.0'
> fuori_campo | number | 0 | Y |
> '0.0'
> enpav_fc | number | 0 | Y |
> '0.0'
> rif_nr_na | number | 0 | Y | NULL
> rif_aa_na | number | 0 | Y | NULL
> codice_cliente | nvarchar2 | 15 | Y
> | NULL
> codice_attivita | nvarchar2 | 10 | Y
> | NULL
> ts_ultima_modifica | timestamp(6) with time zone| 0 |
> Y | CURRENT_TIMESTAMP
> id_operatore | number | 0 | Y | NULL
> (34 rows)
>
> index_type | index_name | uniqueness| column_name| column_position
> -----------+ -------------+ ----------+ -----------+ ---------------
> primary key| sys_c00116651| unique | sezionale | 1
> primary key| sys_c00116651| unique | anno | 2
> primary key| sys_c00116651| unique | numero | 3
> --------------------------------------------------------------------------------------------------------------------
> thanks for any help.
>
> j
> --
> http://www.freelists.org/webpage/oracle-l
>

--
http://www.freelists.org/webpage/oracle-l
Received on Wed Feb 04 2015 - 14:43:49 CET

Original text of this message