Largest number of digits for the NUMBER data type?

What length more of a NUMBER that Oracle will "support"?

The documentation says the following:

Limitations of the data type says:

«Can be represented in a comprehensive precision 38 digits»

NUMBER of Data Types says:

"Oracle guarantees portability of numbers with precision of up to 20 digits of base-100, which equals 39 or 40 decimal digits according to the position of the decimal point."

I realize account that if I define a column as simply NUMBER, I can insert numbers with a size up to 126 characters.  However, Oracle seems to maintain only the first 40 digits in MOST cases.  The largest number of digits, it seems to allow is 40 before it begins to be replaced by 0.

With numbers that have more than 40 figures, Oracle will sometimes replace all numbers according to the 38th numbers with a 0 and sometimes replace 0 after the digit 39th or 40th.

Therefore, what is the largest number of digits, can be trusted to safely store Oracle?

This is the code I used for this testing process.

create the table max_num (num number);

declare

number of l_x;

Start

for x in 1.200

loop

l_x: = x;

insert into max_num values (rpad (1, x, 1));

end loop;

exception

while others then

dbms_output.put_line ('STOP: ' | l_x);

dbms_output.put_line (SQLERRM);

end;

/

Select num, length (replace (num, 0)) of max_num;

What length more of a NUMBER that Oracle will "support"?

You have already given your own answer. If 'length': the maximum number of digits is written the doc gives you the answer:

999... (38 9's) x 10 value maximum125

The 38/39/40, hereinafter referred to as the doc means "significant digits". This is why rounding or truncation occurs if you provide more significant digits of 38/39/40.

Oracle stores the numbers internally in a binary format 21 bytes using a documented structure in the doc of the OIC in the section 'NUMBER'.

http://docs.Oracle.com/CD/E11882_01/AppDev.112/e10646/oci03typ.htm#i423684

Oracle database stores the values of the NUMBER data type in a variable length format. The first byte is the exponent and is followed by 1 to 20 mantissa bytes. The high bit of the exponent byte is the sign bit; It is defined for positive numbers, and it is cleared for negative numbers. The lower 7 bits represent the exponent, which is a number of base-100 with an offset of 65.

This article from doc continues to show you how to convert the internal format to the real value.

An additional byte of 1 is used for all types of data to store the length; That's why you often see docs saying numbers can take 22 bytes.

Tags: Database

Similar Questions

  • For the complex data type, how to generate the Dll with compatible interface to C/C++

    Hello

    I used the Labview FPGA module to develop test equipment. Now, I need to write a driver that is to be a Dll with compatible interface to C/C++ for this equipment. So that my client who is familiar with C/C++ can call the driver without any study on labview. But I had a few problem on how to convert labview for C/C++ data complex data type. To clearly explain to my question, I have attached a simple example. (see attachment) I try to generate a Dll for the attached example VI and get the the function prototype at the head of the files as below:

    ' void OpenFpgaReference (LStrHandle * RIODevice, TD1 * errorIn, LVRefNum * FPGAVIReferenceOut, TD1 * errorOut).

    As you have known, the type of data "LStrHandle * RIODevice" and "LVRefNum * FPGAVIReferenceOut" Labview data format are. C/C++ do not have this kind of data type and can not reconige it. As a result, I can't call the Dll of C/C++ programming language. How to convert these two data type of labview for the C/C++ compatible data format, and then build the Dll? Anyone know about this?

    The answer is really apprecaited! Thank you in advanced.

    Ivan.Chen wrote:

    As I found in the following article:

    http://digital.NI.com/public.nsf/WebSearch/FB001AA027C8998386256AAD006C142D?OpenDocument

    LVRefNum is the name of resource of LabVIEW VISA or refnum, and "it is impossible to convert LabVIEW VISA name of resource or refnum VISession valid ID."
    This means that external code modules can not access & control the session VISA which is open by labview. But for my purposes, I will not attempt to access this VISA extenal code(C/C++) session. I just hope that save this session VISA in the external code once I opened it in Labview dll; and pass it to the labview dll when needed. While I have not need to login again when I need to control the device. Is it possible to do?

    A LVRefNum is really just a single int32 value. Its meaning is useless for other environments than those who created it so that you Michael not any what in C/C++ caller but pass it back to other functions in your DLL, but this often isn't a problem at all.

    You can take the following statement of the LabVIEW extcode.h headers and add them to your delabviewed header files to make it work in such a way.

    #define Private (T) typedef struct T # _t {void * p ;} * T}

    Private (LVRefNum);

    The LStrHandle you must set a standard C string instead in your export DLL and document what is the size of the string buffer should have if it is an output parameter.

    TD1 error clusters should also be divided into their parameters (C compatible) separate for all items or just to the left of suite entirely.

    Rolf Kalbermatter

  • Boolean converter doesn't work is not for the string data type

    Hi gurus,

    I am creating a Boolean converter based on the O/N value for column EO, but every time I select the checkbox that's throwing error "attribute with the value false precision/scale not valid."

    If I add PrecisionRule = 'false' for TestFlag to the EO, I had ORA-12899: value too large for column 'XX '. "" "" FDY_TEST '. "" TEST_FLAG' (real:, maximum of 5: 1).

    Seems that it is still store 'true' / 'false' char to instead "Y/N", even if the POS in the converter class return System.out.println ("getAsObject - value is Y")

    If I use the transitional attribute (TestFlagDummy) and change the EOImpl to TestFlagDummy getter and setter, it works very well.

    I was wondering why the converted does not, in which case the other converter for string I test to convert the value entered for upper case works very well.

    Appreciate any help.

    Definition EO

    ------------------

    < attribute

    Name = "TestFlag.

    Precision = '1 '.

    ColumnName = "TEST_FLAG."

    SQLType = 'VARCHAR '.

    Type = "Java.lang.String"

    ColumnType = "VARCHAR2".

    TableName = "FDY_TEST" >

    < DesignTime >

    < name Attr = "_DisplaySize" Value = "1" / >

    < / DesignTime >

    < / attribute >

    Converter class

    -----------------------

    public class YNConverter

    implements the converter, ClientConverter

    {

    public Object getAsObject (FacesContext facesContext, UIComponent uiComponent, String value)

    {

    If (true".equals (value)) {" "}

    System.out.println ("getAsObject - value is Y");

    }

    else {}

    System.out.println ("getAsObject - value is N");

    }

    return "" true ".equals (value)?". Y":"N";

    }

    public String getAsString (FacesContext facesContext, UIComponent uiComponent, Object value)

    {

    System.out.println ("getAsString - Value is" + value.toString ());

    Return "Y".equals (value.toString ())? "true": "false";

    }

    public String getClientLibrarySource (FacesContext facesContext)

    {

    Returns a null value.

    }

    public Collection < String > getClientImportNames()

    {

    Return Collections.emptySet ();

    }

    public String getClientScript (FacesContext facesContext, UIComponent uiComponent)

    {

    Returns a null value.

    }

    public String getClientConversion (FacesContext facesContext, UIComponent uiComponent)

    {

    Returns a null value.

    }

    }

    USER INTERFACE

    ---

    < af:selectBooleanCheckbox

    label = "#{bindings." TestFlag.label}"id ="sbc1.

    value = "#{bindings." TestFlag.inputValue}.

    Converter = autoSubmit "YNConverter" = "true" / >

    Kind regards

    Ferrere

    Your link should look like this:

    
      
        
      
    
    

    VO attribute similar to the following:

      
    

    and EO attribute similar to the following:

    
      
        
      
    
    

    Dario

  • The number of heartbeat for the host data warehouses is 0, which is less than required: 2

    Hello

    I have trouble creating my DRS cluster + storage of DRS, I have 3 hosts esxi 5.1 for the task

    First, I created the cluster, no problem with that, so the DRS storage was created and now I can see in the Summary tab

    "The number of heartbeat for the host data warehouses is 0, which is less than required: 2".

    I search the Web and there are similar problems when people has only a single data store (the one that came with ESXi) and need to add another but in my case... vcenter detects any...

    In the views of storage I see the store of data (VMFS) but for some strange reason the cluster not

    In order to achieve data warehouses minimum (2) can I create an NFS and map it in THE 3 esxi hosts? Vcenter which consider a play config?

    Thank you

    You probably only have local data warehouses, which are not that HA would require for this feature (pulsations datastore) to work properly.

    You will need either 2 iSCSI, FC 2 or 2 NFS volumes... Or a combination of the any of them, for this feature to work. If you don't want to use this feature, you can also turn it off:

    http://www.yellow-bricks.com/2012/04/05/the-number-of-vSphere-HA-heartbeat-datastores-for-this-host-is-1-which-is-less-than-required-2/

  • Difference in the number of records for the same date - 11 GR 2

    Guy - 11 GR on Windows2005 2, 64-bit.

    BILLING_RECORD_KPN_ESP - is a monthly partitioned table.
    BILLING_RECORD_IDX #DATE - is a local index on "charge_date" in the table above.

    SQL > select / * + index (BILLING_RECORD_KPN_ESP BILLING_RECORD_IDX #DATE) * /.
    2 (trunc (CHARGE_DATE)) CHARGE_DATE;
    3 count (1) Record_count
    4. IN "RATOR_CDR". "" BILLING_RECORD_KPN_ESP ".
    where the 5 CHARGE_DATE = January 20, 2013.
    Group 6 by trunc (CHARGE_DATE)
    5 m

    CHARGE_DATE RECORD_COUNT
    ------------------ ------------
    2401 20 January 13-> > some records here.

    -> > Here I can see only '2041' records for Jan/20. But in the query below, it shows "192610" for the same date.

    Why is this difference in the number of records?

    SQL > select / * + index (BILLING_RECORD_KPN_ESP BILLING_RECORD_IDX #DATE) * /.
    (trunc (CHARGE_DATE)) CHARGE_DATE,
    2 count (1) Record_count
    3. FOR "RATOR_CDR." "" BILLING_RECORD_KPN_ESP ".
    "4 where CHARGE_DATE > 20 January 2013."
    Group of 5 by trunc (CHARGE_DATE)
    6 order by trunc (CHARGE_DATE)
    5 m

    CHARGE_DATE RECORD_COUNT
    ------------------ ------------
    192610 20 January 13-> > more records here
    JANUARY 21, 13 463067
    JANUARY 22, 13 520041
    23 JANUARY 13 451212
    JANUARY 24, 13 463273
    JANUARY 25, 13 403276
    JANUARY 26, 13 112077
    27 JANUARY 13 10478
    28 JANUARY 13 39158

    Thank you!

    Because in the second example you also select rows that have a nonzero component.

    The first example selects only rows that are 00:00:00

    (by the way, you should ask questions like this in the forum SQL)

  • convert the varchar2 data type to the data number type

    How to convert the varchar2 data type to the data type number.


    It looks like my data

    create table one)
    col1 varchar2 (50)
    col2 varchar2 (500);

    Insert in a (col1, col2) values ('1234 ', ' 2345');

    Select Column1 of number (19)) cast (to_number (col1);

    IAM getting error invalid number


    I need to create a table with the same columns with data like number types (19)

    can someone help me

    Thank you

    You have changed your original post, so now I see that you get the invalid number.

    This is why you should always avoid the varchar columns to store numbers or dates...

    Since your table source contains a nonnumeric value, you can write a pl/sql to convert data and see what records are false:

    SQL> insert into a (col1,col2) values ('xxxx','2345');
    
    1 row created.
    
    SQL> select * from a;
    
    COL1     COL2
    -------- --------
    1234     2345
    xxxx     2345
    
    2 rows selected.
    
    SQL> create table b (col1 number(19), col2 number(19));
    
    Table created.
    
    SQL> set serverout on
    
    SQL> declare
      2  cursor c is
      3  select * from a;
      4  begin
      5    for r in c loop
      6     begin
      7       insert into b values (to_number(r.col1), to_number(r.col2));
      8     exception
      9       when invalid_number then
     10        dbms_output.put_line('Row rejected: col1='||r.col1||' col2='||r.col2);
     11     end;
     12    end loop;
     13  end;
     14  /
    Row rejected: col1=xxxx col2=2345
    
    PL/SQL procedure successfully completed.
    
    SQL> select * from b;
    
          COL1       COL2
    ---------- ----------
          1234       2345
    
    1 row selected.
    

    Max

    Published by: Massimo Ruocchio, June 14, 2011 20:00
    Added the first query in the example

  • Convert or map Typedonnees decimal Transact-SQL for Oracle Number data type?

    MSSQL 2005
    Oracle 10.2 g

    In a MSSQL table, I have a column with the data type set on (decimal (1.0), null) with the values of line-1. (695 lines in total)

    In the Oracle table, the proposed mapped column is a number data type. When I import data, I received 695 errors with the message "invalid value for the field. How to properly convert or map Decimal (MSSQL) Transact-SQL for Oracle Number data type for a negative value?

    Thank you.

    How do you load data into Oracle? What tool or programming language you are using? Can you post something cause what you stated in your post should work, but there may be some ODBC, or other type of conversion factors to be taken into account.

     > create table t1 (field1  number(1,0));
    
    Table created.
    
     > insert into t1 values (-1);
    
    1 row created.
    
    UT1 > select * from t1;
    
        FIELD1
    ----------
            -1
    

    HTH - Mark D Powell.

  • Table of functions and direct requests for NUMBER data types database

    Hello. I call a number of functions table of our Enterprise BI server, and I chose to do this by using direct database requests (I believe you can also call functions table in the physical layer of the repository, but is not what I do). The problem is that whenever I go back any number of the table function which is not a whole number (1.23, for example), BI assigns the INTEGER data type to the field rather than the data type DOUBLE, rounded so my number to the nearest integer. Here is a short example:

    Create these 3 database objects:

    CREATE or REPLACE TYPE my_row AS OBJECT (my_num NUMBER);

    CREATE or REPLACE TYPE my_tab AS TABLE OF THE my_row;

    FUNCTION to CREATE or REPLACE my_table_function RETURN my_tab
    PIPELINED IS
    BEGIN
    PIPE ROW (my_row (1.23));
    END;
    /


    Make this your request at your request Direct to database:

    SELECT my_num FROM table (my_table_function);


    This query returns correctly '1.23' when it is called from the database. In BI, on the other hand, it returns a value of '1' (and the field of labels an INTEGER rather than data type DOUBLE). If at the request of data Direct you change column properties-> data-> decimal from 0 to 2 Format, then it displays is not surprising "1.00". I then tried to change MY_ROW. Data type of MY_NUM by explicitly specifying the precision and no luck. BI still labels this field as an INTEGER. Then I started to try to deceive BI massaging the SQL statement itself. None of the following worked:

    SELECT to_number (my_num) as my_num2 FROM table (my_table_function);
    SELECT my_num2 + 0.01 as my_num3 FROM (SELECT my_num - 0.01 AS my_num2 FROM table (my_table_function));
    SELECT to_number (to_char (my_num)) as my_num2 FROM table (my_table_function);
    SELECT to_number (substr (to_char ('x' | my_num), 2)) as my_num2 FROM table (my_table_function);

    Now, I found a solution, but I'm surprised that I have to resort to that:

    SELECT * FROM (SELECT / * + NO_MERGE * / table my_num (my_table_function));

    Is anyone out there knows a better way to do it? The above is a hack in my opinion. :)

    Thanks in advance for any input.

    -Jim

    Yes, it's really amazing.
    But I got it.

    CREATE OR REPLACE TYPE my_row AS OBJECT (my_num NUMBER(10,2));
    

    and in your SQL:

    SELECT cast(my_num as double precision) as my_num2 FROM table(my_table_function);
    

    I have the good result and I see the numbers after the decimal point.
    Very delicate!

    Published by: gerardnico on July 7, 2009 14:55 change number (10.2) in double precision... pffff

  • match the number with the varchar data type

    Hi all

    I want to compare the number data type with string. Is this possible? I use the function to_char. The example below.
    SQL> select * from tab_a;
     
     PLOT_NUMBER
    ------------
               1
               2
               3
               4
               5
               6
     
    6 rows selected
    SQL> select * from tab_b;
     
    PLOT_NAME       PLOT_NUMBER
    --------------- ------------
    seawods         5
    bridge cros     2,4
    hill park       1
    bash hunk       3,6
     
    SQL> select a.*, b.* from tab_a a, tab_b b where to_char(a.plot_number)=b.plot_number;
     
     PLOT_NUMBER PLOT_NAME       PLOT_NUMBER
    ------------ --------------- ------------
               1 hill park       1
               5 seawods         5
    as you can see here this number of parcel 2, 4, and plot_number 3.6 not reported because they are string.

    Can anyone please suggest what can do us in this case.

    I can't do chane data type.

    Thanks in advance
    SAZ

    What you can do in the case?

    Drop table table_b purge

    as the 'design' of this table is obviously out of whack, and the content should have been

    PLOT_NAME       PLOT_NUMBER
    --------------- ------------
    seawods         5
    bridge cros     2
    bridge cros     4
    hill park       1
    bash hunk       3
    bash hunk       6
    

    You now have the instr function to the "join".
    I would recommend standardization of the design. NOW

    -----------------
    Sybrand Bakker
    Senior Oracle DBA

  • HO to Comapre with Number data Type

    Hello

    My need is to perform validation in the ValidateEntity method.

    How to compare the data type number:

    For ex: number = gatAbc();

    If(a>10)
    {
    throw new oaExcption...
    }

    But while comapring got compiler error

    Error (218,17): not found >(oracle.jbo.domain.Number, int) method in the abc.oracle.apps.per.irc.pqr.schema.server.XxabcEOImpl class

    So please tell me how to compare integer value with the Number data type

    Thanx

    Check with the float. It will certainly work.

    float number = Float.parseFloat(HrsPerDay); //HrsPerDay is a String and I am converting it to float 
    
    if(( number <= 0) || (number >= 21))
                       {
                            throw new OAAttrValException(OAAttrValException.TYP_VIEW_OBJECT,
                                              "xxCopyResourceVO1",
                                              rowi.getKey(),
                                              "NoOfCopies",
                                              rowi.getAttribute("NoOfCopies"),
                                              "PA",
                                              "xx_xx_COPY_POSITIVE_NUM");
                       }
    

    Here in this code I also check the hours cannot be less then 0 and 20 above.

    Thank you
    -Anil

  • DLL for LabWindows/CVI 8.0 with the bool data type

    Hello

    I want to use a new SWIR camera in LabWindows/CVI 8.0 (Windows XP 32bits).

    The company delivered with the camera produced a 32-bit dll by using Microsoft Visual C++ 2010. The .dll and .lib and .h files include a working SDK/API (some functions with the bool data type)

    Compilation-online syntax error, variable Boolean is not a data type in LabWindows/CVI 8.0

    Generate the import of DLL-online syntax error library

    I tried to convert bool char (typedef unsigned char bool => no more syntax error but the functions does not work.)

    What can I do?

    Martin

    Hello again, Naumann!

    Microsoft Visual C++ 2010 represents Boolean using 1 byte, as stated by MSDN: https://msdn.microsoft.com/en-us/library/tf4dy80a(v=vs.100).aspx

    I guess that you import C++ functions using the syntax for extern "C". Otherwise, because of the C++ name mangling wouldn't you able to bind C++ library against your code CVI.

    You can also specify how you import C++ functions?

    In addition, because you have not described the problem as a corruption of heads or runtime error, I guess the C++ library function is called correctly the CVI. That said, I tend to believe that the problem is not really in the mechanism of interaction of C/C++, but in the C++ library. If you would start calling a dummy C++ function returning an integer from a simple CVI application that should work, because redefine bool in CVI 1 byte must ensure that settings are correctly transferred onto the stack.

    If you need to create a wrapper function of C++ that is not using bool and calls the C++ function, I expect to return the same result.

    Maybe you are missing a few prior initialization steps required? The provider of the camera also comes all example code?

    Best regards!

    -Johannes

  • Need to create a structure for the target data store?

    Hi Experts,

    If I create a structure for the target data store, and then load the data from source to target works fine. If I make mistakes.

    Is necessary to create a structure for target?

    Please help me...

    Thanks in advance.

    A.Kavya.

    I found the answer. No need to create the structure for target temporary data store. and we need to create the structure for the permanent target data store.

  • Need to retrieve the data for the current date.

    Hello

    I have a table which then retrieves information when using this command.

    Select ta_acct, shift, created_on track_alerts;

    Technicolor A 24 March 14

    Technicolor A 24 March 14

    Technicolor A 24 March 14

    Technicolor A 24 March 14

    Manitoba telecom a 24 March 14 system

    Technicolor A 24 March 14

    I used this statement to retrieve the data for the given date.

    Select ta_acct, shift, created_on track_alerts where created_on = 24 March 14 ';

    Its not data recovery.

    Need help.

    Kind regards

    Prasad K T,.

    984002170

    Prasad K T wrote:

    Yes the created data type is date.

    CREATED_ON DATE

    Partha thanks it works now.

    Select ta_acct, shift, created_on in track_alerts where to move is: Shift and TRUNC (created_on) = TO_DATE('24-MAR-2014','DD-MON-YYYY');

    Still, I made a small change to my querry.

    Select ta_acct, shift, created_on track_alerts where to move is: shft and TRUNC (created_on) = TO_DATE (select double sysdate,'MON-DD-YYYY "");

    For this statement, it does not work.

    of course not...

    first: sysdate returns a date so no need of conversion here

    and

    second SYSDATE includes time, so your application should look like this:

    Select ta_acct, shift, created_on in track_alerts where to move is: Shift and TRUNC (created_on) = trunc (sysdate)

    or

    Select ta_acct, shift, created_on in track_alerts where to move is: shft and created_on > = trunc (sysdate) and created_on<>

    HTH

  • ESXi is unable to install 'his place on the disk for the dump data' no ideas?

    It is an older server.

    Data sheet:

    GOING Linux 2200 series

    Intel P3 700 MHz x 2

    768 MB OF RAM

    9.1 GB SCSI x 3 (configured in RAID 5 now)

    I have attached a picture of the error message that is received and typed most of the message below.

    NOT_IMPLEMENTED /build/mts/release/bora-123629/bora/vmkernel/sched/sched.c:5075

    Frame 0x1402ce0 ip = 0x62b084 cr2 = cr3 = 0 x 0 = ox3000 cr4 = 0 x 20

    are is 0xffffffff ds is 0xffffffff fs = 0xffffffff gs = 0xffffffff

    EAX = 0xffffffff = 0xffffffff = 0xffffffff edx ecx ebx = 0xffffffff

    = 0x1402e3c = 0xffffffff edi esi EBP = 0xffffffff err =-1 eflags = 0xffffffff

    * 0:0 / & lt; NULL & gt;  1:0 / & lt; NULL & gt;

    0x1402e3c: battery: 0x830c3f, 0x1402e58, 0x1402e78

    VMK availability: 0:00:00:00.026 TSC: 222483259709

    No space on disk for the dump data

    Waiting for debugger... (World 0)

    Debugger is listening on the serial port...

    Press ESC to enter the local debugger

    This could be a simple problem or not, I'm not sure. I spent several hours already trying to reconfigure the readers to try to get the installation to recognize.

    Any help is greatly appreciated.

    I agree with Matt, the material can be simply too old-

    If you find this or any other answer useful please consider awarding points marking the answer correct or useful

  • What the best data type for storing jpeg/gif images?

    Hello
    What the best data type for storing jpeg/gif images?
    Idon't want to use the blob data type
    Ordimage is the best?
    Thank you.

    VDH says:

    What the best data type for storing jpeg/gif images?
    Idon't want to use the blob data type
    Ordimage is the best?

    Don't be stupid.

    If you do not want to use BLOBs then, or you can use the ordimage.

    It uses ordsys.ordsource for the storage of the image data type. This is a user defined Type of data in advance and has a property called LocalData that stores the actual image. And what is its data type? BLOB OBJECT.

Maybe you are looking for

  • Airport Express showing no light

    My Airport Express does not long green light solid (I got it a few years and it worked perfectly).  If I turn it on again it flashes green for a short time (not orange) then turns off completely.  Sometimes it flashes green again for a short period. 

  • TV reboot on its own

    Hi, recently new youtube app was loaded on my model of TV KDLHX850. Since then to the TV restarts on its own. Anyone else with similar problems?

  • Problem with assist on bike g 4g

    I had my motorcycle g 4 g for about 2 months, so far motorola assist worked fine, but suddenly, she developed a slight problem. I have the active setting House, it detects when I'm at home, but when I get a text it says the new XXX text to hear liste

  • HP ENVY 7640: Connection to the Scanner error

    I recently installed a new WANT to a new Mac printer/scanner. The print/scan function worked correctly during installation. After the upgrade to Yosemite, however, whenever I try to open the scanner, I get the following message: 'pending to scan' > '

  • I can't download service pack 3 (SP3), error 0 x 80070424

    I have Windows XP Home Edition (32 bit), I need to service pack 3, so I tried to use the Windows Update tool, but when I search the new updates, I get this error: [error number: 0 x 80070424] Please help me I need SP3 so I can download visual c++ 201