Oracle PL/SQL Tutorial/SQL Data Types/Number
Содержание
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>