Whether you are attending Oracle OpenWorld this year or not, here is how you can stay on top of breaking news and happenings from the conference:
I am not attending OpenWorld this year. I already miss the face to face networking with my fellow Oracle bloggers, ACEs and ACE Directors. Keep the Tweets and blog posts coming. The rest of the world is watching.
Comments Off | Filed in Oracle, Tips | Tags: oow10, openworld10SQL*Plus TIMING is a handy little utility that you can use to do a performance analysis on any commands or blocks run during a period. It is different from the SET TIMING command which is used to display timing data after each SQL command or PL/SQL block you run.
Here is an example:
TIMING SHOW lists the current timer’s name and timing data:
SQL> timing show
SP2-0325: no timing elements to show
TIMING START sets up a timer and makes t1 (or whatever timer name you like) the name of the timer:
SQL> timing start t1
SQL> timing show
timing for: t1
Elapsed: 00:00:06.95
Another call to TIMING SHOW displays the elapsed time since the start of the timer:
SQL> timing show
timing for: t1
Elapsed: 00:00:16.01
You can have more than one active timer by STARTing additional timers before STOPping the first; SQL*Plus nests each new timer within the preceding one. The timer most recently STARTed becomes the current timer:
SQL> timing start t2
t2 is the current timer now:
SQL> timing show
timing for: t2
Elapsed: 00:00:02.25
TIMING STOP lists the current timer’s name and timing data, then deletes the timer. If any other timers are active, the next most recently STARTed timer becomes the current timer, in this example it’s t1:
SQL> timing stop
timing for: t2
Elapsed: 00:00:18.81
SQL> timing show
timing for: t1
Elapsed: 00:01:14.18
SQL> timing stop
timing for: t1
Elapsed: 00:01:22.09
SQL> timing show
SP2-0325: no timing elements to show
TIMING with no clauses lists the number of active timers:
SQL> timing
no timing elements in use
SQL> timing start t1
SQL> timing
1 timing element in use
SQL> timing start t2
SQL> timing
2 timing elements in use
CLEAR TIMING deletes all timers:
SQL> clear timing
timing for: t2
Elapsed: 00:22:38.36
timing for: t1
Elapsed: 00:22:53.96
Sources and Resources:
Comments Off | Filed in Oracle, Tips | Tags: sqlplusSteven Feuerstein published a new presentation titled: Golden Rules for Developers [PDF].
Here is a summary of his seven “golden rules” that will help you write better code:
Agreed with all. I would also add an eighth one: Understand your data.
What would you add?
11 Comments | Filed in Oracle, Tips | Tags: pl/sqlHere is something you need to be aware of when you use the EXECUTE IMMEDIATE … USING and OPEN FOR … USING statements in PL/SQL.
Let’s execute this simple anonymous PL/SQL block:
eddie@db11gr2> DECLARE
2 l_string VARCHAR2 (4000);
3 l_rc sys_refcursor;
4 BEGIN
5 l_string := RPAD (' ', 4000);
6 OPEN l_rc FOR 'select :1 from dual' USING l_string;
7 EXECUTE immediate 'select :1 from user_objects where rownum = 1'
8 INTO l_string USING l_string;
9 END;
10 /
PL/SQL procedure successfully completed.
The EXECUTE IMMEDIATE and OPEN FOR statements are used with the USING clause. USING supplies a bind argument for the SQL string. In this example the value of the bind argument is a 4,000 character string.
Now, let’s pass a string greater than 4,000 characters to the OPEN FOR statement:
eddie@db11gr2> DECLARE
2 l_string VARCHAR2 (4001);
3 l_rc sys_refcursor;
4 BEGIN
5 l_string := RPAD (' ', 4001);
6 OPEN l_rc FOR 'select :1 from dual' USING l_string;
7 END;
8 /
DECLARE
*
ERROR at line 1:
ORA-01460: unimplemented or unreasonable conversion requested
ORA-06512: at line 6
Oops, got an error. Let’s also try the EXECUTE IMMEDIATE statement with a string greater than 4,000 characters:
eddie@db11gr2> DECLARE
2 l_string VARCHAR2 (4001);
3 BEGIN
4 l_string := RPAD (' ', 4001);
5 EXECUTE immediate 'select :1 from user_objects where rownum = 1'
6 INTO l_string USING l_string;
7 END;
8 /
DECLARE
*
ERROR at line 1:
ORA-01460: unimplemented or unreasonable conversion requested
ORA-06512: at line 5
Got the same error: “ORA-01460: unimplemented or unreasonable conversion requested”.
How about if we pass a NULL:
eddie@db11gr2> DECLARE
2 l_rc sys_refcursor;
3 BEGIN
4 OPEN l_rc FOR 'select :1 from dual' USING NULL;
5 END;
6 /
OPEN l_rc FOR 'select :1 from dual' USING NULL;
*
ERROR at line 4:
ORA-06550: line 4, column 45:
PLS-00457: expressions have to be of SQL types
ORA-06550: line 4, column 3:
In this case we get “PLS-00457: expressions have to be of SQL types”.
Well, there is a restriction on what values you can bind: When binding values to dynamic SQL, only SQL datatypes are supported. You can bind strings, numbers, dates, collections, LOBs, XML documents… However, you cannot bind values having a PL/SQL specific datatype such as Booleans, associative arrays and varchar2 values greater than 4000.
Make sure you keep the above restriction in mind when you use the EXECUTE IMMEDIATE … USING and OPEN FOR … USING statements.
Source and resources:
I have been playing the PL/SQL Challenge quiz every day. It’s a great way to brush up on my PL/SQL skills. After many years of using PL/SQL, I am still learning about features that I have never known before or totally forgotten about. Take for example one of last week’s quiz questions:
What is the output of this PL/SQL block?
eddie@db11gr2> DECLARE
2 aname varchar2 (5);
3 BEGIN
4 DECLARE
5 aname varchar2 (5) := 'Big String';
6 BEGIN
7 DBMS_OUTPUT.put_line (aname);
8 EXCEPTION
9 WHEN VALUE_ERROR
10 THEN
11 DBMS_OUTPUT.put_line ('Inner block');
12 END;
13 DBMS_OUTPUT.put_line ('What error');
14 EXCEPTION
15 WHEN VALUE_ERROR
16 THEN
17 DBMS_OUTPUT.put_line ('Outer block');
18 END;
19 /
Instead of telling you what the answer is, I will point you to the documentation:
In declarations, faulty initialization expressions can raise exceptions, but exception handlers cannot handle them… Handlers in the current block cannot catch the raised exception because an exception raised in a declaration propagates immediately to the enclosing block.
Even though I selected the wrong choice when I took the quiz, adding the above fact to my PL/SQL knowledge and sharing it with you is a big win for me.
By the way, should we consider initializing variables in the declaration section a bad practice?
3 Comments | Filed in Oracle, Tips | Tags: pl/sqlJoel Kallman lists steps to make apex.oracle.com run faster, like turning on the KeepAlive setting in Oracle HTTP Server, reducing the open window for Web crawlers in robots.txt, replacing a Database Access Descriptor with an httpd.conf rewrite rule and increasing file system caching and memory size. Read the details at Making apex.oracle.com fast (again).
Comments Off | Filed in Oracle, Tips | Tags: apexIn this video interview with ZDNet.com.au, Kyte explains how many questions he receives equate to “my car won’t start”. “I’m going to do it to you — my car won’t start, why? Give me the solution. I’m not going to tell you what errors I see on the dashboard; I’m not going to tell you if I filled the car up with gas recently; I’m not going to tell you if it’s making a noise or not making a noise; but my car won’t start, why not? There’s insufficient data to even begin to answer a question like that.” Kyte also explains how the internet has changed how questions are asked, and how he doesn’t reply with RTFM.
via How developers should ask for help: Blogs – Null Pointer – ZDNet Australia (via)
Comments Off | Filed in Oracle, Tips | Tags: asktom, tom kyte, videoThe following are 10 blogging tips I extracted from Tim Ferriss‘s presentation (video below) originally titled “Scalable Blogging Behaviors: How to Grow from 1 to 1,000,000 Readers”, then re-titled to “How to Blog without Killing Yourself“:
Of course the above tips worked for Tim but they may or may not work for you and me.
Here is Tim’s full 50 minute presentation:
Comments Off | Filed in Tips | Tags: blogging