Oracle PL/SQL Tutorial/SQL Data Types/Number

Материал из SQL эксперт
Перейти к: навигация, поиск

Compare Number type in where clause

SQL>
SQL>
SQL> -- create demo table
SQL> create table Employee(
  2    ID                 VARCHAR2(4 BYTE)         NOT NULL,
  3    First_Name         VARCHAR2(10 BYTE),
  4    Last_Name          VARCHAR2(10 BYTE),
  5    Start_Date         DATE,
  6    End_Date           DATE,
  7    Salary             Number(8,2),
  8    City               VARCHAR2(10 BYTE),
  9    Description        VARCHAR2(15 BYTE)
 10  )
 11  /
Table created.
SQL>
SQL> -- prepare data
SQL> insert into Employee(ID,  First_Name, Last_Name, Start_Date,                     End_Date,                       Salary,  City,       Description)
  2               values ("01","Jason",    "Martin",  to_date("19960725","YYYYMMDD"), to_date("20060725","YYYYMMDD"), 1234.56, "Toronto",  "Programmer")
  3  /
1 row created.
SQL> insert into Employee(ID,  First_Name, Last_Name, Start_Date,                     End_Date,                       Salary,  City,       Description)
  2                values("02","Alison",   "Mathews", to_date("19760321","YYYYMMDD"), to_date("19860221","YYYYMMDD"), 6661.78, "Vancouver","Tester")
  3  /
1 row created.
SQL> insert into Employee(ID,  First_Name, Last_Name, Start_Date,                     End_Date,                       Salary,  City,       Description)
  2                values("03","James",    "Smith",   to_date("19781212","YYYYMMDD"), to_date("19900315","YYYYMMDD"), 6544.78, "Vancouver","Tester")
  3  /
1 row created.
SQL> insert into Employee(ID,  First_Name, Last_Name, Start_Date,                     End_Date,                       Salary,  City,       Description)
  2                values("04","Celia",    "Rice",    to_date("19821024","YYYYMMDD"), to_date("19990421","YYYYMMDD"), 2344.78, "Vancouver","Manager")
  3  /
1 row created.
SQL> insert into Employee(ID,  First_Name, Last_Name, Start_Date,                     End_Date,                       Salary,  City,       Description)
  2                values("05","Robert",   "Black",   to_date("19840115","YYYYMMDD"), to_date("19980808","YYYYMMDD"), 2334.78, "Vancouver","Tester")
  3  /
1 row created.
SQL> insert into Employee(ID,  First_Name, Last_Name, Start_Date,                     End_Date,                       Salary, City,        Description)
  2                values("06","Linda",    "Green",   to_date("19870730","YYYYMMDD"), to_date("19960104","YYYYMMDD"), 4322.78,"New York",  "Tester")
  3  /
1 row created.
SQL> insert into Employee(ID,  First_Name, Last_Name, Start_Date,                     End_Date,                       Salary, City,        Description)
  2                values("07","David",    "Larry",   to_date("19901231","YYYYMMDD"), to_date("19980212","YYYYMMDD"), 7897.78,"New York",  "Manager")
  3  /
1 row created.
SQL> insert into Employee(ID,  First_Name, Last_Name, Start_Date,                     End_Date,                       Salary, City,        Description)
  2                values("08","James",    "Cat",     to_date("19960917","YYYYMMDD"), to_date("20020415","YYYYMMDD"), 1232.78,"Vancouver", "Tester")
  3  /
1 row created.
SQL>
SQL>
SQL>
SQL> -- display data in the table
SQL> select * from Employee
  2  /

ID   FIRST_NAME LAST_NAME  START_DAT END_DATE      SALARY CITY       DESCRIPTION
---- ---------- ---------- --------- --------- ---------- ---------- ---------------
01   Jason      Martin     25-JUL-96 25-JUL-06    1234.56 Toronto    Programmer
02   Alison     Mathews    21-MAR-76 21-FEB-86    6661.78 Vancouver  Tester
03   James      Smith      12-DEC-78 15-MAR-90    6544.78 Vancouver  Tester
04   Celia      Rice       24-OCT-82 21-APR-99    2344.78 Vancouver  Manager
05   Robert     Black      15-JAN-84 08-AUG-98    2334.78 Vancouver  Tester
06   Linda      Green      30-JUL-87 04-JAN-96    4322.78 New York   Tester
07   David      Larry      31-DEC-90 12-FEB-98    7897.78 New York   Manager
08   James      Cat        17-SEP-96 15-APR-02    1232.78 Vancouver  Tester
8 rows selected.
SQL>
SQL>
SQL> SELECT * FROM employee WHERE salary < 50000;

ID   FIRST_NAME LAST_NAME  START_DAT END_DATE      SALARY CITY       DESCRIPTION
---- ---------- ---------- --------- --------- ---------- ---------- ---------------
01   Jason      Martin     25-JUL-96 25-JUL-06    1234.56 Toronto    Programmer
02   Alison     Mathews    21-MAR-76 21-FEB-86    6661.78 Vancouver  Tester
03   James      Smith      12-DEC-78 15-MAR-90    6544.78 Vancouver  Tester
04   Celia      Rice       24-OCT-82 21-APR-99    2344.78 Vancouver  Manager
05   Robert     Black      15-JAN-84 08-AUG-98    2334.78 Vancouver  Tester
06   Linda      Green      30-JUL-87 04-JAN-96    4322.78 New York   Tester
07   David      Larry      31-DEC-90 12-FEB-98    7897.78 New York   Manager
08   James      Cat        17-SEP-96 15-APR-02    1232.78 Vancouver  Tester
8 rows selected.
SQL>
SQL> -- clean the table
SQL> drop table Employee
  2  /
Table dropped.


NUMBER(4,2) as column type

SQL>
SQL>
SQL> CREATE TABLE product_order_archive (
  2       product_name  VARCHAR2(25),
  3       salesperson   VARCHAR2(3),
  4       order_date DATE,
  5       quantity      NUMBER(4,2));
Table created.
SQL>
SQL> INSERT INTO product_order_archive VALUES ("Product 1", "BB", "21-JUN-01", 10);
1 row created.
SQL> INSERT INTO product_order_archive VALUES ("Product 2", "GA", "22-JUN-02", 50);
1 row created.
SQL> INSERT INTO product_order_archive VALUES ("Product 3", "LB", "23-JUN-03", 20);
1 row created.
SQL> INSERT INTO product_order_archive VALUES ("Product 4", "ZZ", "24-JUN-04", 80);
1 row created.
SQL> INSERT INTO product_order_archive VALUES ("Product 5", "CA", "25-JUN-05", 2);
1 row created.
SQL> INSERT INTO product_order_archive VALUES ("Product 6", "JT", "26-JUN-06", 50);
1 row created.
SQL>
SQL>
SQL> drop table product_order_archive;
Table dropped.
SQL>


Number column

SQL> CREATE TABLE myNumberColumnTable (
  2       product_name  VARCHAR2(25),
  3       product_price NUMBER(4,2));
Table created.
SQL>
SQL> INSERT INTO myNumberColumnTable VALUES ("Product Name 1", 1);
1 row created.
SQL> INSERT INTO myNumberColumnTable VALUES ("Product Name 2", 2.5);
1 row created.
SQL> INSERT INTO myNumberColumnTable VALUES ("Product Name 3", 50.75);
1 row created.
SQL> INSERT INTO myNumberColumnTable VALUES ("Product Name 4", 99.99);
1 row created.
SQL>
SQL> SELECT * FROM myNumberColumnTable;
PRODUCT_NAME              PRODUCT_PRICE
------------------------- -------------
Product Name 1                        1
Product Name 2                      2.5
Product Name 3                    50.75
Product Name 4                    99.99
4 rows selected.
SQL> DROP TABLE myNumberColumnTable;
Table dropped.
SQL>
SQL>


NUMBER data type

SQL>
SQL> CREATE TABLE precision (
  2     value NUMBER(38,5),
  3     scale NUMBER(10));
Table created.
SQL>
SQL> INSERT INTO precision (value, scale)
  2     VALUES (12345, 0);
1 row created.
SQL> INSERT INTO precision (value, scale)
  2     VALUES (123456, 0);
1 row created.
SQL> INSERT INTO precision (value, scale)
  2     VALUES (123.45, 0);
1 row created.
SQL> INSERT INTO precision (value, scale)
  2     VALUES (12345, 2);
1 row created.
SQL> INSERT INTO precision (value, scale)
  2     VALUES (123.45, 2);
1 row created.
SQL> INSERT INTO precision (value, scale)
  2     VALUES (12.345, 2);
1 row created.
SQL> INSERT INTO precision (value, scale)
  2     VALUES (1234.5, 2);
1 row created.
SQL>
SQL> commit;
Commit complete.
SQL>
SQL> SET SERVEROUTPUT ON
SQL>
SQL> DECLARE
  2     v_integer NUMBER(5);
  3     v_scale_2 NUMBER(5,2);
  4     v_real NUMBER;
  5
  6     CURSOR scale_0_cur
  7     IS
  8        SELECT value
  9        FROM precision
 10        WHERE scale = 0;
 11
 12     CURSOR scale_2_cur
 13     IS
 14        SELECT value
 15        FROM precision
 16        WHERE scale = 2;
 17  BEGIN
 18
 19     DBMS_OUTPUT.PUT_LINE("PRECISION 5 SCALE 0");
 20
 21     OPEN scale_0_cur;
 22
 23     -- Loop thorugh all records that have a scale of zero
 24     LOOP
 25     FETCH scale_0_cur INTO v_real;
 26     EXIT WHEN scale_0_cur%NOTFOUND;
 27
 28     -- Assign different values to the v_integer variable
 29     --  to see how it handles it
 30     BEGIN
 31        DBMS_OUTPUT.PUT_LINE("     ");
 32        DBMS_OUTPUT.PUT_LINE("Assigned: "||v_real);
 33
 34        v_integer := v_real;
 35
 36        DBMS_OUTPUT.PUT_LINE("Stored: "||v_integer);
 37     EXCEPTION
 38        WHEN OTHERS
 39        THEN
 40           DBMS_OUTPUT.PUT_LINE("Exception: "||sqlerrm);
 41     END;
 42     END LOOP;
 43
 44     CLOSE scale_0_cur;
 45
 46
 47  END;
 48  /
PRECISION 5 SCALE 0
Assigned: 12345
Stored: 12345
Assigned: 123456
Exception: ORA-06502: PL/SQL: numeric or value error: number precision too large
Assigned: 123.45
Stored: 123
PL/SQL procedure successfully completed.
SQL>
SQL>
SQL> drop table precision;
Table dropped.


NUMBER datatype: PRECISION 5 SCALE 2

SQL>
SQL> CREATE TABLE precision (
  2     value NUMBER(38,5),
  3     scale NUMBER(10));
Table created.
SQL>
SQL> INSERT INTO precision (value, scale)
  2     VALUES (12345, 0);
1 row created.
SQL> INSERT INTO precision (value, scale)
  2     VALUES (123456, 0);
1 row created.
SQL> INSERT INTO precision (value, scale)
  2     VALUES (123.45, 0);
1 row created.
SQL> INSERT INTO precision (value, scale)
  2     VALUES (12345, 2);
1 row created.
SQL> INSERT INTO precision (value, scale)
  2     VALUES (123.45, 2);
1 row created.
SQL> INSERT INTO precision (value, scale)
  2     VALUES (12.345, 2);
1 row created.
SQL> INSERT INTO precision (value, scale)
  2     VALUES (1234.5, 2);
1 row created.
SQL>
SQL> commit;
Commit complete.
SQL>
SQL> SET SERVEROUTPUT ON
SQL>
SQL> DECLARE
  2     v_integer NUMBER(5);
  3     v_scale_2 NUMBER(5,2);
  4     v_real NUMBER;
  5
  6     CURSOR scale_0_cur
  7     IS
  8        SELECT value
  9        FROM precision
 10        WHERE scale = 0;
 11
 12     CURSOR scale_2_cur
 13     IS
 14        SELECT value
 15        FROM precision
 16        WHERE scale = 2;
 17  BEGIN
 18
 19
 20     DBMS_OUTPUT.PUT_LINE("     ");
 21     DBMS_OUTPUT.PUT_LINE("PRECISION 5 SCALE 2");
 22
 23     OPEN scale_2_cur;
 24
 25     -- Loop through all records that have a scale of 2
 26     LOOP
 27     FETCH scale_2_cur INTO v_real;
 28     EXIT WHEN scale_2_cur%NOTFOUND;
 29
 30     -- Assign different values to the v_scale_2 variable
 31     --  to see how it handles it
 32     BEGIN
 33        DBMS_OUTPUT.PUT_LINE("     ");
 34        DBMS_OUTPUT.PUT_LINE("Assigned: "||v_real);
 35
 36        v_scale_2 := v_real;
 37
 38        DBMS_OUTPUT.PUT_LINE("Stored: "||v_scale_2);
 39     EXCEPTION
 40        WHEN OTHERS
 41        THEN
 42           DBMS_OUTPUT.PUT_LINE("Exception: "||sqlerrm);
 43     END;
 44     END LOOP;
 45
 46     CLOSE scale_2_cur;
 47
 48  END;
 49  /
PRECISION 5 SCALE 2
Assigned: 12345
Exception: ORA-06502: PL/SQL: numeric or value error: number precision too large
Assigned: 123.45
Stored: 123.45
Assigned: 12.345
Stored: 12.35
Assigned: 1234.5
Exception: ORA-06502: PL/SQL: numeric or value error: number precision too large
PL/SQL procedure successfully completed.
SQL>
SQL> drop table precision;
Table dropped.
SQL>


Plus two number type columns together

SQL>
SQL>
SQL>
SQL>
SQL> CREATE TABLE myTable (
  2       name  VARCHAR2(25),
  3       price NUMBER(4,2),
  4       sales_tax     NUMBER(4,2),
  5       start_date DATE,
  6       salesperson   VARCHAR2(3));
Table created.
SQL>
SQL> INSERT INTO myTable VALUES ("Product Name 1", 1, .08, "5-NOV-04", "AB");
1 row created.
SQL> INSERT INTO myTable VALUES ("Product Name 2", 2.5, .21, "29-JUN-05", "CD");
1 row created.
SQL> INSERT INTO myTable VALUES ("Product Name 3", 50.75, 4.19, "10-DEC-06", "EF");
1 row created.
SQL> INSERT INTO myTable VALUES ("Product Name 4", 99.99, 8.25, "31-AUG-07", "GH");
1 row created.
SQL> SELECT * FROM myTable;

NAME                           PRICE  SALES_TAX START_DAT SAL
------------------------- ---------- ---------- --------- ---
Product Name 1                     1        .08 05-NOV-04 AB
Product Name 2                   2.5        .21 29-JUN-05 CD
Product Name 3                 50.75       4.19 10-DEC-06 EF
Product Name 4                 99.99       8.25 31-AUG-07 GH
4 rows selected.
SQL> SELECT name, price + sales_tax FROM myTable;

NAME                      PRICE+SALES_TAX
------------------------- ---------------
Product Name 1                       1.08
Product Name 2                       2.71
Product Name 3                      54.94
Product Name 4                     108.24
4 rows selected.
SQL>
SQL>
SQL> drop table myTable;
Table dropped.
SQL>


select 5.1d, 42f from dual;

SQL>
SQL> select 5.1d, 42f from dual;
      5.1D        42F
---------- ----------
  5.1E+000   4.2E+001
SQL>


Use IN for number value

SQL>
SQL> CREATE TABLE promotion(
  2    title_id     CHAR(3)      NOT NULL,
  3    advance      DECIMAL(9,2) NULL    ,
  4    royalty_rate DECIMAL(5,2) NULL);
Table created.
SQL>
SQL>
SQL> INSERT INTO promotion VALUES("T01",10000,0.05);
1 row created.
SQL> INSERT INTO promotion VALUES("T02",1000,0.06);
1 row created.
SQL> INSERT INTO promotion VALUES("T03",15000,0.07);
1 row created.
SQL> INSERT INTO promotion VALUES("T04",20000,0.08);
1 row created.
SQL> INSERT INTO promotion VALUES("T05",100000,0.09);
1 row created.
SQL> INSERT INTO promotion VALUES("T06",20000,0.08);
1 row created.
SQL> INSERT INTO promotion VALUES("T07",1000000,0.11);
1 row created.
SQL> INSERT INTO promotion VALUES("T08",0,0.04);
1 row created.
SQL> INSERT INTO promotion VALUES("T09",0,0.05);
1 row created.
SQL> INSERT INTO promotion VALUES("T10",NULL,NULL);
1 row created.
SQL> INSERT INTO promotion VALUES("T11",100000,0.07);
1 row created.
SQL> INSERT INTO promotion VALUES("T12",50000,0.09);
1 row created.
SQL> INSERT INTO promotion VALUES("T13",20000,0.06);
1 row created.
SQL>
SQL>
SQL> SELECT title_id, advance
  2    FROM promotion
  3    WHERE advance IN
  4          (0.00, 1000.00, 5000.00);
TIT    ADVANCE
--- ----------
T02       1000
T08          0
T09          0
SQL>
SQL>
SQL> drop table promotion;
Table dropped.
SQL>