Oracle PL/SQL Tutorial/SQL Data Types/Number

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

Compare Number type in where clause

   <source lang="sql">

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.</source>


NUMBER(4,2) as column type

   <source lang="sql">

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></source>


Number column

   <source lang="sql">

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></source>


NUMBER data type

   <source lang="sql">

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.</source>


NUMBER datatype: PRECISION 5 SCALE 2

   <source lang="sql">

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></source>


Plus two number type columns together

   <source lang="sql">

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></source>


select 5.1d, 42f from dual;

   <source lang="sql">

SQL> SQL> select 5.1d, 42f from dual;

     5.1D        42F

----------
 5.1E+000   4.2E+001

SQL></source>


Use IN for number value

   <source lang="sql">

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></source>