47
Old Oracle Versions Top 20 Gotchas Jeffrey Kemp AUSOUG Perth Conference, October 2012

Old Oracle Versions

Embed Size (px)

Citation preview

Page 1: Old Oracle Versions

Old Oracle Versions Top 20 Gotchas

Jeffrey Kemp

AUSOUG Perth Conference, October 2012

Page 2: Old Oracle Versions

Poll

• Oldest Oracle database version worked with

• Past 12 months (approximately)

Page 3: Old Oracle Versions

Database Versions & Extended Support 1

99

2

20

15

20

10

20

00

20

05

19

95

v7

v8

8i

9i

9iR2

10g

10gR2

11g

11gR2

12c

Page 4: Old Oracle Versions

Disclaimer The following is intended to outline the general product direction way back in the distant past. It is intended for information purposes only, and may not always be perfectly syntactically correct. It is not a commitment to deliver any material, code, or functionality, and should not be relied upon in making purchasing decisions (if you’re thinking of buying 8i or 9i, you should probably get out from under that rock). The development, release, and timing of any features or functionality described for Oracle’s products remains at the sole discretion of Oracle… who cares, give us the new features now!

Page 5: Old Oracle Versions

“Be grateful for what you have...”

Page 6: Old Oracle Versions

vs.

Page 7: Old Oracle Versions

#20: insert from record type

INSERT INTO mytable

VALUES rec;

Page 8: Old Oracle Versions

#20: insert from record type

INSERT INTO mytable

VALUES rec;

INSERT INTO mytable (col1, col2, col3, …)

VALUES (rec.col1, rec.col2, rec.col3, …);

Page 9: Old Oracle Versions

#19: temporary tables

CREATE GLOBAL TEMPORARY TABLE t...

Page 10: Old Oracle Versions

#19: temporary tables

BEGIN

TRUNCATE TABLE ordinary_tmp;

INSERT INTO ordinary_tmp ...;

-- etc…

END;

Page 11: Old Oracle Versions

#18: error messages

EXCEPTION

DBMS_OUTPUT.put_line(

DBMS_UTILITY.format_error_backtrace

);

RAISE;

END;

Page 12: Old Oracle Versions

#18: error messages

EXCEPTION

DBMS_OUTPUT.put_line(

DBMS_UTILITY.format_error_backtrace

SQLERRM

);

RAISE;

END;

Page 13: Old Oracle Versions

#17: queries on DBMS_RANDOM

SELECT DBMS_RANDOM.value FROM dual;

ORA-00600 internal error

http://www.angelfire.com/home/jasonvogel/oracle_plsql_random_number_generator.html

Page 14: Old Oracle Versions

#16: TIMESTAMP & INTERVAL

the_exact_time TIMESTAMP := SYSTIMESTAMP;

Page 15: Old Oracle Versions

#16: TIMESTAMP & INTERVAL

the_exact_time TIMESTAMP := SYSTIMESTAMP;

Java - timestamp.getTime() (number of milliseconds since January 1, 1970, 00:00:00 GMT)

Page 16: Old Oracle Versions

#15: DIRECTORY objects CREATE DIRECTORY mydir AS '/usr/example';

Page 17: Old Oracle Versions

#15: DIRECTORY objects CREATE DIRECTORY mydir AS '/usr/example'; ALTER SYSTEM SET UTL_FILE_DIR='/usr/example' SCOPE=SPFILE; - restart database

f := utl_file.fopen( '/usr/example' , 'myfile.txt' , 'rw');

Page 18: Old Oracle Versions

#14: SQL analytic functions BEGIN FOR r IN ( SELECT RANK(a) OVER (PARTITION BY b ORDER BY c) q FROM t) LOOP ...

Page 19: Old Oracle Versions

#14: SQL analytic functions BEGIN FOR r IN ( SELECT RANK(a) OVER (PARTITION BY b ORDER BY c) q FROM t) LOOP ... CREATE VIEW v AS SELECT RANK(a) OVER (PARTITION BY b ORDER BY c) q FROM t; BEGIN FOR r IN (SELECT q FROM t) LOOP ... (alternatively, use dynamic SQL instead)

R2 Analytic functions were added in 8iR2, but they only work in plain SQL – PL/SQL embedded SQL didn’t use the same engine.

Page 20: Old Oracle Versions

#13: write BLOB to file l_file := UTL_FILE.fopen ('BLOBS','MyImage.gif','w', 32767); WHILE l_pos < l_blob_len LOOP DBMS_LOB.read(l_blob, l_amount, l_pos, l_buffer); UTL_FILE.put_raw(l_file, l_buffer, TRUE); l_pos := l_pos + l_amount; END LOOP; UTL_FILE.fclose(l_file);

Page 21: Old Oracle Versions

#13: write BLOB to file l_file := UTL_FILE.fopen ('BLOBS','MyImage.gif','w', 32767); WHILE l_pos < l_blob_len LOOP DBMS_LOB.read(l_blob, l_amount, l_pos, l_buffer); UTL_FILE.put_raw(l_file, l_buffer, TRUE); l_pos := l_pos + l_amount; END LOOP; UTL_FILE.fclose(l_file);

Java - http://www.oracle-base.com/articles/8i/export-blob.php

Page 22: Old Oracle Versions

#12: external tables CREATE TABLE t ... ORGANIZATION EXTERNAL

Page 24: Old Oracle Versions

#11: XMLTYPE

CREATE TABLE t (myxml XMLTYPE);

Page 26: Old Oracle Versions

#10: NULL datatype conversion

SELECT null, null, null FROM dual UNION ALL SELECT 'abc', 123, DATE '2012-01-01' FROM dual;

ORA-01790: expression must have same datatype as corresponding expression ?

Page 27: Old Oracle Versions

#10: NULL datatype conversion SELECT null, null, null FROM dual UNION ALL SELECT 'abc', 123, DATE '2012-01-01' FROM dual; SELECT null, TO_NUMBER(null), TO_DATE(null) FROM dual UNION ALL SELECT 'abc', 123, DATE '2012-01-01' FROM dual;

Page 28: Old Oracle Versions

vs.

Page 29: Old Oracle Versions

#9: MERGE MERGE INTO d USING (SELECT * FROM src) s ON (d.id = s.id) WHEN MATCHED THEN UPDATE d.a = s.a, d.b = s.b WHERE s.a = 'x' DELETE WHERE s.a = 'z' WHEN NOT MATCHED THEN INSERT (s.id, s.a, s.b) WHERE s.b = 'y';

WHEN MATCHED and WHEN NOT MATCHED are optional* * DELETE WHERE must be part of a WHEN MATCHED clause, however

Page 30: Old Oracle Versions

#9: MERGE MERGE INTO d USING (SELECT * FROM src) s ON (d.id = s.id) WHEN MATCHED THEN UPDATE d.a = s.a, d.b = s.b WHERE s.a = 'x' DELETE WHERE s.a = 'z' WHEN NOT MATCHED THEN INSERT (s.id, s.a, s.b) WHERE s.b = 'y';

WHEN MATCHED and WHEN NOT MATCHED are mandatory

Page 31: Old Oracle Versions

#9: MERGE MERGE INTO d USING (SELECT * FROM src) s ON (d.id = s.id) WHEN MATCHED THEN UPDATE d.a = s.a, d.b = s.b WHEN NOT MATCHED THEN INSERT (s.id, s.a, s.b); FOR s IN (SELECT * FROM src) LOOP UPDATE d SET d.a = s.a, d.b = s.b WHERE d.id = s.id; IF SQL%ROWCOUNT = 0 THEN INSERT INTO d VALUES (s.id, s.a, s.b); END IF; END LOOP;

Page 32: Old Oracle Versions

#8: FORALL on sparse array

FORALL i IN INDICES OF arr INSERT INTO t (arr(i));

Page 33: Old Oracle Versions

#8: FORALL on sparse array

FORALL i IN INDICES OF arr INSERT INTO t (arr(i));

un-sparse that array, then…

FORALL i IN 1..arr.COUNT INSERT INTO t (arr(i));

Page 34: Old Oracle Versions

#7: UTL_MAIL

Page 35: Old Oracle Versions

#7: UTL_SMTP

Page 36: Old Oracle Versions

#6: string literals

v_sql := q'[SELECT q'{She said 'Hello'.}' FROM t]';

Page 37: Old Oracle Versions

#6: string literals

v_sql := q'[SELECT q'{She said 'Hello'.}' FROM t]';

single-quotes-masquerading-as-double-quotes hell…

v_sql := 'SELECT ''She said ''''Hello''''.'' FROM t';

Page 38: Old Oracle Versions

#5: Regular Expressions

• REGEXP_INSTR

• REGEXP_REPLACE

• REGEXP_SUBSTR

Page 40: Old Oracle Versions

#4: PLS_INTEGER vs. BINARY_INTEGER

PLS_INTEGER = BINARY_INTEGER

Page 41: Old Oracle Versions

#4: PLS_INTEGER vs. BINARY_INTEGER

• PLS_INTEGER uses native arithmetic = faster

• PLS_INTEGER - overflow exception

• BINARY_INTEGER overflow - no overflow exception*

* If a 9i BINARY_INTEGER operation overflows, no exception is raised if the result is being assigned to a NUMBER. In 10g, this is not true – PLS_INTEGER and BINARY_INTEGER are identical, both raise an exception on overflow.

Page 42: Old Oracle Versions

#3: DBMS_OUTPUT

Max size: unlimited

Line size: 32KB

Page 43: Old Oracle Versions

#3: DBMS_OUTPUT

Max size: 1 million bytes*

Line size: 255 bytes

*default = 20,000 bytes

Page 44: Old Oracle Versions

#2, #1, #0

• no PL/SQL conditional compilation

• no Recycle Bin for dropped tables

• no flashback table*

*NOTE: in my original presentation I claimed “no flashback query” in 9i, but this is incorrect. (Thanks to Tom Kyte for the correction!)

Page 45: Old Oracle Versions

Moral of the story?

• Use appropriate features when available

• Be professional

• Keep old Oracle documentation URLs

Page 46: Old Oracle Versions

Images Attribution

http://4.bp.blogspot.com/-ib6RKHzuEaU/Tb4aaXaq-YI/AAAAAAAANVk/s5RPjflt4hU/s1600/cadillac-car-wreck.jpg

http://images.brisbanetimes.com.au/2012/03/08/3109605/Women%20vote.jpg

http://i47.photobucket.com/albums/f189/captjeremy/ace_ventura_pet_detective_fake_pict.jpg

http://rlv.zcache.com/vintage_business_mailman_mail_carrier_delivering_postcard-p239921576489667584envli_400.jpg

http://technology.amis.nl/2006/04/04/back-to-the-future-oracle-41-vm-appliance/

Page 47: Old Oracle Versions

Thank you

http://jeffkemponoracle.com