Home>Question Details



Alex -- Thanks for the question regarding "What don't you like about Oracle?", version 8.1.7

Submitted on 28-Sep-2005 18:54 Central time zone
Last updated 15-Nov-2009 12:34

You Asked

Hi Tom,

I was wondering if there are some thing you don't like about Oracle?
I personally wish more things came setup, out of the box such as autotrace, intermedia 
text, scott schema etc. Any thoughts on this?

-Alex 

and we said...

Well, Oracle text does (dba just needed to have selected it). Scott schema does (ditto, 
dba just needs to have installed the demos)

Autotrace - yes, be nice if it were there HOWEVER, on a production system - it shouldn't 
necessarily be there so..... Maybe that is good.

What would I change....

Actually, many of those things I would change are being addressed - a better sqlplus that 
is still sqlplus (coming, code name "raptor", previewed at OOW)...

htmldb - that was a big one.

Most of the things I would change are "political", the DBA/Developer relationship (or 
lack thereof).  The (sometimes) developer approach of "I don't need to learn the 
database"

There is so much in there - what I would change is peoples knowledge level of what is 
actually available.

I would appreciate better error messages sometimes - I can usually figure them out, 
but.... ;)

I'll publish this to see what others add - maybe some have been addressed and we can 
point it out - others, I'll file away for the days when I'm asked "what would you 
add...."
 

Reviews    
4 stars Things we DON'T like   September 29, 2005 - 10pm Central time zone
Reviewer: Mike Friedman from Shenzhen, China
1.  Lack of proxy capability within the DB - we should be able to log onto a non-[rivileged 
account, authenticate ourselves, and then have our connection switched to a selected privileged 
account.

2.  Merge statement should take multiple actions just like Insert

3.  The current move away from PL/SQL and transactional interfaces to many components needs to be 
reversed.  For example, there is no way to make use of CDM SDK direct from PL/SQL while maintaining 
transaction atomicity, etc. 


Followup   September 30, 2005 - 8am Central time zone:

1) that is not within the database.  We have that ability in the database, sqlplus doesn't "do it"

2) it does - when matched, when not matched.  you can insert and update and delete from a table ??? 
 

Don't know what you mean

3) that seems to be a contradictory statement?  You say "don't go components" but then say "we need 
interface to components"?  (frankly, I don't know what the CDM SDK is..) 

5 stars Wow! You Let me Build my Wishlist?   September 29, 2005 - 11pm Central time zone
Reviewer: Arup Nanda from Danbury CT USA
Oh, I could go on forever. Here are some:

1. SQL*Plus with a built-in tabular format output; useful for rows that span across many lines. No, 
Grid Control SQL Output just doesn't cut it; it's a static output of the entire table. It doesn't 
have the powerful SQL*Plus commands.

2. An unloader utility that reads at the block level and dumps data as plaintext ASCII much faster 
than the SQ*Plus or Pro*C programs can do.

3. I miss the SQL*Forms 3.0 (if anyone is old enough to remember that)which allowed me to do quick 
and dirty data entry screens for dat manipulations. And, sweet oh sweet, I could edit the INP files 
for quick modifications. Master detail forms were a snap.

4. Separation of roles where DBA can see the data files, dictionary, etc., but not the actual data. 
A separate role will allow the data to be seen and allow privileges. A third account type will have 
access to audit trails only. I understand this is being addressed in Data Vault.

5. PL/SQL compilation where the decision to make the dependent objects such as triggers, functions, 
etc invalid due to table alters are controlled by DBA. When a table column data type is modified, 
the dependednt objects are immediately modified; however, sometimes the changes to the table do not 
alter the contents of the object and it need not be invalidated. This will help immensly in keeping 
the uptime of the system.

6. Batch commits. When I should be able to do a mass update but ask Oracle to commit at a certain 
frequency only. I could do this by cursors; but a simple SQL will be very useful. Something very 
similar to the commit frequency setting in COPY command.

7. Conditional Shared Pool manipulations. Shared pool contains SQL statements that should have been 
aged out eons ago; but linger about and cause the ORA-4031 error. How about allowing the DBA to age 
certain SQLs, either explicitly or via some pattern matching or both.

8. Ability to use different userids in unix for the oracle owner and the user whos owns the logs 
such as alert log, listerner log, crs log, etc. This will allow the separation of roles - the DBA 
can perform database maintenance but a different user owns the logs. So the oracle software owner 
can't delete logs. The process of logging can be performed by a root-owned process, installed 
during the execution of root.sh.

... there is more; but I leave it to others how they feel. 


Followup   September 30, 2005 - 8am Central time zone:

(1, 2) => raptor

(3) => htmldb!


4, You can create your own DBA role "my_dba" and grant it select on the dictionary objects you want 
-- but not the "select any table" and such.  Meaning - you can accomplish this today?

6, I disagree, that would be excessively dangerous.  How do you restart safely such an operation?


7, I'd sort of like a "don't share" hint :) for applications that don't bind - don't have their sql 
even go there....


 

3 stars Things we don't like   September 30, 2005 - 12am Central time zone
Reviewer: Jim Weatherly from Atlanta, GA
1. Cross-platform data file incompatibility. With the size of databases these days export/import 
takes too long. Transportable tablespaces require 10g to cross platforms and have to go through an 
extra RMAN process--and as of 9.2.0.5 the process is still buggy.

2. Single oracle.exe on 32-bit windows. Context switching among threads may be faster, but the 
limits of addressable memory render this less imporant, even with the /3GB switch. 64bit Windows 
should address this, but not without upgrading hardware.

3. Inability to bypass redo for statements that don't need recovery (for example, the insert /*+ 
append */ into the Hits table for Tom's pagination solution). Always writing above the high 
watermark can eat up space quickly and like a temporary tablespace, I don't care if I can't recover 
it. Create a new kind of tablespace of type unrecoverable and stick segments you don't care about 
here.  Just a thought.

4. Lackluster management tools. While grid control is promising, it has taken a long time to get 
there. After paying the price for the best database on the planet it's annoying to have to pay such 
a premium for the tools to manage it. Also, more stable Intelligent Agents would be nice.

5. Lack of dynamically expandable OCFS. It would be nice to be able to resize an OCFS drive on the 
fly as with other file systems. ASM on raw devices may make this moot, but not on 9iR2. 


Followup   September 30, 2005 - 9am Central time zone:

1) 10gR2 has full database transports across platforms with the same endianess now.

2) multi-process would be horrendous on windows - it would not perform even a little bit.  
 

5 stars ...   September 30, 2005 - 12am Central time zone
Reviewer: Bob B from Albany, NY
I'd like to concur and extend Tom's point further.  As the database becomes more "self-managing" it 
becomes more user friendly.  Also, providing better Oracle supplied tools (e.g. Raptor) to use 
Oracle also improves the user friendliness.  The end result will (hopefully) be a better learning 
curve for Oracle users.  HtmlDB was also another step in the same direction.

If you know how to use it, Oracle can do some amazing things.  By making Oracle easier to use for 
more people, you increase the number of people who know how to use it.  More people kicking a$$ 
with Oracle will lead to more kick a$$ applications.  This opinion is a take off from the Creating 
Passionate Users blog (see Tom's blog for the url) 


3 stars Amen   September 30, 2005 - 12am Central time zone
Reviewer: Tony 
<quote>
1. SQL*Plus with a built-in tabular format output; useful for rows that span 
across many lines. No, Grid Control SQL Output just doesn't cut it; it's a 
static output of the entire table. It doesn't have the powerful SQL*Plus 
commands.

2. An unloader utility that reads at the block level and dumps data as plaintext 
ASCII much faster than the SQ*Plus or Pro*C programs can do.
</quote>

1.  I couldn't agree more.  Occassionally I need to look at some very wide tables  (135 columns) 
and SQL*Plus doesn't really cut it.  I use SQL*Plus for 98% of my work, the other 2% is JDeveloper 
just to see these wide tables.  I wish I could just stay in my terminal window.

2.  Not only something that is easy and fast but provides some good error handling.   


4 stars Peevs and Wants   September 30, 2005 - 2am Central time zone
Reviewer: Billy from Cape Town, ZA
My biggest pet peeve is that grants assigned via roles do not work in named PL/SQL (despite working 
in anonymous PL/SQL) - which means those grants have to explictly granted to the user/schema. I 
have never really seen a sensible explanation for this in any Metalink material.. Tom have you 
perhaps addressed this here? (had a brief look some time ago and did not see any specific from you 
on this).

On the Wanted List, no-one yet mentioned O-O (or O-R) in Oracle. I'm nuts about ADTs. It is one of 
the best features of Oracle.. and one of the most ignored.

But I want loads more. In an ATD I want to be able to define private, protected and public 
properties and methods. I want to be able to define Getters and Setters for properties. Most of 
all, I want to be able to call a parent constructor in a child class's constructor without having 
to resort to ugly hacks. Went into some detail on this in Usenet: 
http://groups.google.com/group/comp.databases.oracle.server/browse_frm/thread/c62736aa46a3c46b/de3e8
541b26d2364

The PL/SQL team should have a close look at Delphi and C# features and think of implementing some 
of the most useful ones into PL/SQL.
 


Followup   September 30, 2005 - 9am Central time zone:

(I'm nuts the other way on ADT's in Oracle personally ;)



I did address this role thing in my book Expert one on one Oracle:

<quote>
What happens when we compile a Definer rights procedure

When we compile the procedure into the database, a couple of things happen with regards to 
privileges.  We will list them here briefly and then go into more detail:

q    All of the objects the procedure statically accesses (anything not accessed via dynamic SQL) 
are verified for existence. Names are resolved via the standard scoping rules as they apply to the 
definer of the procedure.
q    All of the objects it accesses are verified to ensure that the required access mode will be 
available. That is, if an attempt to UPDATE T is made - Oracle will verify the definer or PUBLIC 
has the ability to UPDATE T without use of any ROLES.
q    A dependency between this procedure and the referenced objects is setup and maintained. If 
this procedure SELECTS FROM T, then a dependency between T and this procedure is recorded

If, for example, I have a procedure P that attempted to 'SELECT * FROM T', the compiler will first 
resolve T into a fully qualified referenced.  T is an ambiguous name in the database - there may be 
many T's to choose from. Oracle will follow its scoping rules to figure out what T really is, any 
synonyms will be resolved to their base objects and the schema name will be associated with the 
object as well. It does this name resolution using the rules for the currently logged in user (the 
definer). That is, it will look for an object owned by this user called T and use that first (this 
includes private synonyms), then it will look at public synonyms and try to find T and so on. 

Once it determines exactly what T refers to - Oracle will determine if the mode in which we are 
attempting to access T is permitted.   In this case, if we as the definer of the procedure either 
owns the object T or has been granted SELECT on T directly or PUBLIC was granted SELECT, the 
procedure will compile.  If we do not have access to an object called T by a direct grant - the 
procedure P will fail compilation.  So, when the object (the stored procedure that references T) is 
compiled into the database, Oracle will do these checks - and if they "pass", Oracle will compile 
the procedure, store the binary code for the procedure and set up a dependency between this 
procedure and this object T.  This dependency is used to invalidate the procedure later - in the 
event something happens to T that necessitates the stored procedures recompilation.  For example, 
if at a later date - we REVOKE SELECT ON T from the owner of this stored procedure - Oracle will 
mark all stored procedures this user has that are dependent on T, that refer to T, as INVALID. If 
we ALTER T ADD  some column, Oracle can invalidate all of the dependent procedures. This will cause 
them to be recompiled automatically upon their next execution.

What is interesting to note is not only what is stored but what is not stored when we compile the 
object. Oracle does not store the exact privilege that was used to get access to T. We only know 
that procedure P is dependent on T. We do not know if the reason we were allowed to see T was due 
to:

q    A grant given to the definer of the procedure (grant select on T to user) 
q    A grant to public on T (grant select on T to public)
q    The user having the SELECT ANY TABLE privilege

The reason it is interesting to note what is not stored is that a REVOKE of any of the above will 
cause the procedure P to become invalid. If all three privileges were in place when the procedure 
was compiled, a revoke of ANY of them will invalidate the procedure - forcing it to be recompiled 
before it is executed again. Since all three privileges were in place when we created the procedure 
- it will compile successfully (until we revoke all three that is). This recompilation will happen 
automatically the next time that the procedure is executed.

Now that the procedure is compiled into the database and the dependencies are all setup, we can 
execute the procedure and be assured that it knows what T is and that T is accessible. If something 
happens to either the table T or to the set of base privileges available to the definer of this 
procedure that might affect our ability to access T -- our procedure will become invalid and will 
need to be recompiled. 

This leads into why ROLES are not enabled during the compilation and execution of a stored 
procedure in Definer rights mode. Oracle is not storing exactly WHY you are allowed to access T - 
only that you are. Any change to your privileges that might cause access to T to go away will cause 
the procedure to become invalid and necessitate its recompilation. Without roles - that means only 
'REVOKE SELECT ANY TABLE' or 'REVOKE SELECT ON T' from the Definer account or from PUBLIC. With 
roles - it greatly expands the number of times we would invalidate this procedure. If some role 
that was granted to some role that was granted to this user was modified, this procedure might go 
invalid, even if we did not rely on that privilege from that role. ROLES are designed to be very 
fluid when compared to GRANTS given to users as far as privilege sets go. For a minute, let's say 
that roles did give us privileges in stored objects. Now, most any time anything was revoked from 
ANY ROLE we had, or any role any role we have has (and so on -- roles can and are granted to roles) 
-- many of our objects would become invalid. Think about that, REVOKE some privilege from a ROLE 
and suddenly your entire database must be recompiled! Consider the impact of revoking some system 
privilege from a ROLE, it would be like doing that to PUBLIC is now, don't do it, just think about 
it (if you do revoke some powerful system privilege from PUBLIC, do it on a test database). If 
PUBLIC had been granted SELECT ANY TABLE, revoking that privilege would cause virtually every 
procedure in the database to go invalid. If procedures relied on roles, virtually every procedure 
in the database would constantly become invalid due to small changes in permissions. Since one of 
the major benefits of procedures is the 'compile once, run many' model - this would be disastrous 
for performance.

Also consider that roles may be

q    Non-default: If I have a non-default role and I enable it and I compile a procedure that 
relies on those privileges, when I log out I no longer have that role -- should my procedure become 
invalid -- why? Why not? I could easily argue both sides.
q    Password Protected: if someone changes the password on a ROLE, should everything that might 
need that role be recompiled?  I might be granted that role but not knowing the new password - I 
can no longer enable it. Should the privileges still be available?  Why or Why not?  Again, arguing 
either side of this is easy. There are cases for and against each. 

The bottom line with respect to roles in procedures with Definer rights are:

q    You have thousands or tens of thousands of end users. They don't create stored objects (they 
should not). We need roles to manage these people. Roles are designed for these people (end users).
q    You have far fewer application schema's (things that hold stored objects). For these we want 
to be explicit as to exactly what privileges we need and why. In security terms this is called the 
concept of 'least privileges', you want to specifically say what privilege you need and why you 
need it. If you inherit lots of privileges from roles you cannot do that effectively. We can manage 
to be explicit since the number of development schemas is SMALL (but the number of end users is 
large)...
q    Having the direct relationship between the definer and the procedure makes for a much more 
efficient database. We recompile objects only when we need to, not when we might need to. It is a 
large efficiency enhancement.
</quote>

 

4 stars Raptor?   September 30, 2005 - 2am Central time zone
Reviewer: Iru from Madrid, Spain
Hello to everyone.
I don't know about you, but i would like a lot to hear more about this 'Raptor'.

Please Tom?
Thanks a zillion for being there. 


3 stars Raptor   September 30, 2005 - 3am Central time zone
Reviewer: Tarry Singh from Assen, Netherlands
See here, this guy has been to the OOW as well 
http://www.oratransplant.nl/2005/09/20/openworld-project-raptor-%e2%80%93-watch-out-toad/
I don't know about cool, it's just another tool and I guess they want the Raptor to devour the 
Frog(TOAD).

I'm curious though, I'd like to see it work. 


Followup   September 30, 2005 - 9am Central time zone:

(you beat me to it!) 

4 stars I don't like Oracle's DESC functionality all that much   September 30, 2005 - 3am Central time zone
Reviewer: Hans Wijte from The Netherlands
Hi Tom,

In my opinion the DESC command lacks several useful features when used to describe a table or a 
view.
When it is a table I'd like to know its PK columns and
which columns are FK columns; from the DESC it is also not clear whether the described object is a 
table or a view and you have to know in advance who owns the described object. 

However, I found a very nifty procedure created by a Swiss
programmer (Rene Nyffenegger) at this URL
http://www.adp-gmbh.ch/
which does everything described above.

Regards
HAnS 


4 stars Thanks Tarry   September 30, 2005 - 3am Central time zone
Reviewer: Iru from Madrid, Spain
Thanks a lot. From what i've seen there looks a lot like they want to smash the frog, yes. Maybe a 
lot of people out there who won't use Toad because of some limitations it have would use Raptor 
because it's from Oracle itself. I think that is what Larry may have think of.

Saludos. 


3 stars Oracle is improving all the time, but...   September 30, 2005 - 3am Central time zone
Reviewer: mobra from Norway
... I wish that the following could soon be addressed:

1. The 32K limit on strings in PL/SQL.

2. The "table or view does not exist" error message should include the name of the invalid 
table/view. This would be very helpful in a huge query. Similar for non-existent columns, and value 
errors (string to number conversions, etc.). 


4 stars Wishlist   September 30, 2005 - 4am Central time zone
Reviewer: Marc Blum from Aachen, Germany
- BEFORE COMMIT TRIGGER
- disable asynchronous commits
- robust timestamp arithmetics
- robust daylight saving support 


Followup   September 30, 2005 - 9am Central time zone:

timestamp and daylight saving?  what is missing in 9i and above? 

5 stars I do not like COMPRESS=Y as default (EXP-ort)   September 30, 2005 - 5am Central time zone
Reviewer: Kim Anthonisen from Denmark
Hi Tom

I am a really big fan of Oracle, but I have never understood why COMPRESS=Y is the default. Have 
never used it, but have felt the pain from it several times, when people (including myself) have 
forgot to set it to N during export. 


Followup   September 30, 2005 - 9am Central time zone:

because EXP is a tool as old as dirt and to change a default is something they are very hesitant to 
do.  

EXPDP got to do it over. 

5 stars wishlist   September 30, 2005 - 5am Central time zone
Reviewer: A reader 
asynchronous rollback 


Followup   September 30, 2005 - 9am Central time zone:

That can be achieve by this C code:


 *((char*)0) = "go away";


:) 

5 stars beauty Insert   September 30, 2005 - 8am Central time zone
Reviewer: Alvaro from Argentina
How about an alternative for insert sintax. I know that is not ANSI SQL but...

We can do 
 UPDATE tTable a
 SET a.col1 = '1'
 ,    a.col2= 2
 .
 .
 .
 , a.coln = 'n';

but we can not do
 INSERT INTO tTable a
 SET a.col1 = '1'
 , a.col2 = 2
 .
 .
 .
 ,a.coln = 'n';

We must read complex and large insert like:
INSERT INTO tTable 
(col1, col2, ... , coln)
VALUES
('1', 
2, 
.
.
.
, 'n')

In this way, we can not associate destination column with value for it (who is who), except we add 
some comments or something else. 


5 stars   September 30, 2005 - 9am Central time zone
Reviewer: Alex 
Well this thread sure blew up pretty quick.  I didn't put too much thought into the things I don't 
care for, I just wanted to provoke some thought.  However, you brought up some things I missed.  
(Statspack was another thing I was thinking of, but maybe the DBA can enable too?)  

Good call on the error messages.  I agree there.  I had not heard of the new and improved sqlplus, 
that's a great idea.

I am just getting a feel for the DBA/developer relationship, this is my first job, coming up on two 
years.  It's tough though, trying to explain the importance of preparedStatements without sounding 
like a database Nazi or using confusing (to them) technical terminology.

I had a crazy thought about binds while on the subject of Oracle improvements and;  I wonder why it 
is not considered syntactically incorrect to write code in Oracle without binds where they are 
necessary.  I've heard and seen enough to know now that code without binds is just wrong.  Is it 
nuts to suggest this?  I know it's possible to overbind, so maybe it's unrealistic to ask the 
compiler to be able to know when they should be used and when not?  Although if we as people know, 
I would think we could program the rules and circumstances?  It's just some insane idea I was 
thinking of.  I just think that code open to sql injection is serious enough that it shouldn't even 
compile.

Looking forward to reading your new book. 


Followup   September 30, 2005 - 10am Central time zone:

... (Statspack was another thing I was 
thinking of, but maybe the DBA can enable too?)...

yes, they are the ones that would either 

a) include it
b) or not


.... I wonder why it is not considered syntactically incorrect to write code in 
Oracle without binds where they are necessary.....

there is never a case where they *have* to be used.  It is that they better be used if you want 
more than one user ;0


It is impossible for us to detect SQL that has been sql injected, to the database it is just more 
code to run. 

5 stars   September 30, 2005 - 9am Central time zone
Reviewer: Von 
I wish oracle has an easy way of grabbing the source_code
from the database for procs/functions/packages 


Followup   September 30, 2005 - 11am Central time zone:

------------- getcode.sql --------------------------
set feedback off
set heading off
set termout off
set linesize 1000
set trimspool on
set verify off
spool &1..sql
prompt set define off
select decode( type||'-'||to_char(line,'fm99999'), 
               'PACKAGE BODY-1', '/'||chr(10), 
                null) ||
       decode(line,1,'create or replace ', '' ) || 
       text text 
  from user_source 
 where name = upper('&&1') 
 order by type, line;
prompt /
prompt set define on
spool off
set feedback on
set heading on
set termout on
set linesize 100
-------------------------------------------------------





-------------------- getallcode.sql -------------------
set termout off
set heading off
set feedback off
set linesize 50
spool xtmpx.sql
select '@getcode ' || object_name
from user_objects 
where object_type in ( 'PROCEDURE', 'FUNCTION', 'PACKAGE' )
/
spool off
spool getallcode_INSTALL
select '@' || object_name
from user_objects 
where object_type in ( 'PROCEDURE', 'FUNCTION', 'PACKAGE' )
/
spool off
set heading on
set feedback on
set linesize 130
set termout on
@xtmpx.sql
------------------------------------------------------
 

5 stars   September 30, 2005 - 9am Central time zone
Reviewer: dave 
[quote]
I wish oracle has an easy way of grabbing the source_code
from the database for procs/functions/packages 
[/quote]


there is, it is called user/dba_source 


4 stars   September 30, 2005 - 10am Central time zone
Reviewer: David Aldridge http://oraclesponge.blogspot.com from Colorado Springs
I hope that everyone who has posted an enhancement request here has also officially raised it on 
MetaLink ... ? 


Followup   September 30, 2005 - 11am Central time zone:

(i've sent this link onto the raptor guys - many of the ideas would fall in there)...

but yes, metalink with a business case is the official way, this is just ideas being thrown out 
there.  They'll get read and all, but no "promises" :) 

5 stars   September 30, 2005 - 10am Central time zone
Reviewer: Vipin from Canada
I would like to have something like db2look ( a db2 utility which dumps whole database definition 
really quick) in Oracle .  I know we have exp/imp but the output is not user friendly - the user 
should not have to format the output before using it .

Backup/restore could be made more easier .

Finally i am waiting eagerly to have an improved sqlplus -  with the capability to display wide 
outputs without wrapping at the end .

After venturing briefly into db2 & sqlserver worlds , I can safely say oracle is a much better 
product then the other two in my opinion.

 


Followup   September 30, 2005 - 11am Central time zone:

(have you looked at rman?  it really isn't that "complex")


dbms_metadata.get_ddl is fairly useful these days.. 

5 stars wishlist   September 30, 2005 - 10am Central time zone
Reviewer: A reader 
that quality of asktom stops decreasing with this enormous speed 


5 stars Cols_as_rows   September 30, 2005 - 10am Central time zone
Reviewer: Bhavesh from Junagadh,Gujarat,India
hi tom,
I just need cols_as_rows() function built-in in oracle...
;-)
Bhavesh 


3 stars Benthic Software Golden32   September 30, 2005 - 11am Central time zone
Reviewer: A reader 
<quote>
1.  I couldn't agree more.  Occassionally I need to look at some very wide 
tables  (135 columns) and SQL*Plus doesn't really cut it.  I use SQL*Plus for 
98% of my work, the other 2% is JDeveloper just to see these wide tables.  I 
wish I could just stay in my terminal window.
<quote>

Benthic software has a tool called Golden32. Its not just another query tool. It has multiple 
tab(one table per tab) capability(and keeps queried data even after you switch tabs)...

Not only can you run querys but you can also:
- Create database objects(tables, stored proc/func/pack, collections so on...)
- Run plsql stored procedures/functions, pl/sql anon blocks
- You can automatically export data to excel spreadsheet, csv, xml(no tool configuration required)
- You can do table data import/export(csv format) from tool
- You can do automatic editing of table data within tool(within the data output grid itself)
- You can if you dont know sql tool comes with sql builder that allows you to point click build sql 
statement with mouse. 
- You can from sql builder query/search user, all_objects, dict objects in order to view tables, 
views, store procedures, triggers, functions. Or you can simply click on table_name and it pulls up 
all corresponding columns
- You can do searches of particular table columns

I started using tool back in 1999 and for 35 dollars its the best db tool for price/functionality I 
ever used.

And its free 30 day trial...

Just google benthicsoftware and you will find the website!


 


5 stars PL/SQL improvement   September 30, 2005 - 11am Central time zone
Reviewer: Menon 
I wish the following two cases would not compile - too often I have been bitten by this.

scott@MYORA92> create or replace function f (x number )
  2  return number
  3  is
  4    l_ret number;
  5  begin
  6    if x = 1then
  7      l_ret := 2;
  8    elsif x = 2then
  9      l_ret := 3;
 10    else
 11      l_ret := -1;
 12    end if;
 13  end f;
 14  /

Function created.

create or replace function f (x number )
return number
is
  l_ret number;
begin
  if x = 1then
    l_ret := 2;
  elsif x = 2then
    l_ret := 3;
  else
    l_ret := -1;
  end if;
end f;
/
show errors;

scott@MYORA92> create or replace package pkg
  2  as
  3    g_const varchar2(1) := '22';
  4  end pkg;
  5  /
Package created.

Similarly, one of the favorite peeves with PL/SQL abou not having a good way of getting stack trace 
is taken care of in 10g. 


5 stars a native stragg would be nice too   September 30, 2005 - 11am Central time zone
Reviewer: A reader from Toronto, Canada
I often need to display values from multiple rows as a single column value.  Judging from the 
number of times people ask how to do this on askTom and the OTN SQL/PLSQL discussion forums, it 
seems many others need this too.

Your "stragg" function does the trick, but a native function would be better.  I'm thinking of 
something like an aggregate version of the single-row function CONCAT, with a parameter for a 
separator string.  The aggregate COLLECT function comes close, but it only returns a nested table.  
We need a COLLECT that returns a VARCHAR2.  Barring that, a native way to cast a nested table into 
a VARCHAR2 string could be used with COLLECT to achieve acceptable results.
 


5 stars   September 30, 2005 - 11am Central time zone
Reviewer: Alex 
"It is impossible for us to detect SQL that has been sql injected, to the database it is just more 
code to run. "

Just to clarify Tom, I didn't mean the injected code itself, I meant the code that leaves your app 
open to injection such as an execute immediate without a USING clause.  But I realize that doesn't 
make sense because what if we wanted to code a literal?  Then we don't want to bind there. 


Followup   September 30, 2005 - 12pm Central time zone:

right, and I use sys_context to "bind" all of the time - because I don't know at compile time how 
many binds I'll actually have! 

5 stars Re: PL/SQL improvement   September 30, 2005 - 11am Central time zone
Reviewer: Menon 
Sorry I repeated the function f twice -  Just ignore the second one.
Interestingly, notice that the function compiled even though I said 
"if x = 1then" - no space between the 1 and then.

That was not the error I wanted the compiler to catch though. 


Followup   September 30, 2005 - 12pm Central time zone:

that was the error I thought you wanted - but you mean "a function that forgets to return a value" 

4 stars   September 30, 2005 - 11am Central time zone
Reviewer: A reader 
Some utility or function to automatically calculate the bucket size for histograms, depending on 
the data distribution 

Anto 


Followup   September 30, 2005 - 12pm Central time zone:

done, dbms_stats does that. 

4 stars   September 30, 2005 - 11am Central time zone
Reviewer: Anto 
Another one - To get the 10046 trace(as a single file) for parallel queries,

Anto 


4 stars   September 30, 2005 - 11am Central time zone
Reviewer: A reader 
Another one - sorry for not putting it all together in one place

Making the Ora-600 and Ora-7445 errors more specific and detailed - splitting the Ora-600 and 
Ora-7445 errors into sub categories with separate error numbers

Anto 


Followup   September 30, 2005 - 12pm Central time zone:

by definition these are "oh crud" errors - they are not anticipated.  Hard to make the 
unanticipated more specific and more detailed, you don't really know what happened (thats the point 
of those two) 

5 stars what I don't like   September 30, 2005 - 12pm Central time zone
Reviewer: Andrew from temecula ca
Plsql and oracle sql should have a option to disable implicit type casting.  make it strongly 
typed.   


5 stars select into...   September 30, 2005 - 12pm Central time zone
Reviewer: Mariano from Córdoba, Argentina (hoje em São Paulo)
I wish that in PL/Sql we could test if a value exists in a table without select .. into .., just:
 if (select x from v = true) (or whatever) then
  ...
 
 


5 stars Restartable Batch Process   September 30, 2005 - 1pm Central time zone
Reviewer: Bob B from Albany, NY
create table batches(
  batch_id number primary key,
  db_procedure_name varchar2(100) not null,
  driving_table varchar2(100) not null,
  starting_scn number not null,
  last_rowid rowid -- not sure if this is a ligit datatype
)

create sequence batch_id_seq;

create or replace package batch_pkg as
  procedure create_batch(
    p_db_procedure_name in batches.db_procedure_name%type,
    p_driving_table in batches.driving_table%type,
    p_starting_scn in batches.starting_scn%type,
    p_last_rowid in batches.last_rowid%type,
    p_batch_id out batches.batch_id%type
  );

  procedure execute_batch(
    p_batch_id in bathes.batch_id%type
  );

  procedure commit_batch(
    p_last_rowid in batches.last_rowid%type
  );

end batch_pkg;

"create_batch" 
  Insert the batch into the batches table.  

"execute_batch" 
  Create a query from the driving_table as of the starting_scn and add a "rowid > last_rowid" when 
the last_rowid is not null.  Select out the rowid and all columns of the driving table, order by 
rowid, and set a private global variable "g_batch_id" (exists only in the package body).  It will 
then open this query as a ref cursor and pass it as a parameter to the db_procedure_name defined 
for the batch.

"commit_batch"
  Called by the procedure doing the batch process to commit.  The procedure updates the batch with 
the last_rowid and then commits.

Each batch process would need a wrapper to call the create_batch and execute_batch routines and 
then a batch_processor that would take a ref cursor as parameter, process it and use 
"batch_pkg.commit_batch" whenever it wants to commit.

There are some issues that I can think of off the top of my head and I'm sure there are a ton more:

1) Row movement may affect this
2) Must have enough rollback to flashback to the given scn.  
This could be a problem when running the batch process without any failures.  It is worsened if it 
does have to be restarted (the longer it went without failing, the worse it is)
3) Performance might be an issue when ordering by rowid for larger result set 


Followup   September 30, 2005 - 2pm Central time zone:

1) yes it could
2) correct
3) why order? 

I'd rather use rowid RANGES - use between low and high 

4 stars Some more requests   September 30, 2005 - 1pm Central time zone
Reviewer: Sergei Agalakov from Calgary, Canada
I would like to lift a restriction of 30 characters for object names, I have situations when I 
can't create a good descriptive name just 30 characters long.

I do have problems with inability to see individual procedures/functions in PL/SQL package in 
errors and profiler information. When I do see a profiler information that 95% of the time was 
consumed in the package PCK1 and this package has 100 procedures and functions - it doen't help 
much. I do see a time distribution by line number in package but againt I can't even reliably 
combine them and tell that the most time consuming lines 1125, 1201 and 1245 belongs to just one 
procedure in package or to three different procedures in this package.
It would be nice to have something like DBA_SUBROUTINES view where you can see first/last line of 
every procedure in the package, names and parameters of this procedures. Then at last profiler 
would be able to report that 80% of time was consumed by PCK1.PRC1 procedure, 12% in PCK1.PRC2 
procedure and 3% in PCK1.PRC3 procedure instead of the current that 95% of the time was spent 
somewhere in PCK1. The same applies to Oracle types.

Encrypting of network traffic has not to be an Advanced Security option on the top of Enterprise 
Edition - it is must have, very basic security measure. A simple test: enable sqlnet tracing and 
send a command 'ALTER USER SCOTT IDENTIFIED BY TIGER' and then take a look at a trace file - here 
you have a new password for a SCOTT guy. 

Oracle doesn't have a thin .NET data provider. Oracle's .NET data provider doesn't support Oracle 
objects. All that exists for JDBC, but does Oracle really believe that all applications for MS 
Windows have to be written on Java?
 


5 stars   September 30, 2005 - 1pm Central time zone
Reviewer: Jon Roberts 
1.  PL/SQL development tool with tight integration with version control like VSS (I sure hope you 
say Raptor).

2.  OCA (Open Client Adapter) brought back.  It was nice when building Oracle Reports that I could 
open a connection with SQLPlus and run the exact SQL that I am going to run in the report.  With 
Reports now, you have to use JDBC which means more configuring on the client and the server than 
the old days with OCA.  Or you could use HS to connect to a different database but that has its 
problems too because now I have an additional database to manage.

With Oracle Forms, you have to use HS to connect to a different database.  With Forms 6i, I could 
use OCA to connect to a different database.

Discoverer too was nice with the OCA and now I have to create the EUL in an Oracle database only.  
I see the point but it was nice to be able to install the EUL in a SQL Server database when it was 
more appropriate.

3.  Ref Cursor support in Discoverer.

4.  Oracle Text support in Discoverer.

5.  Better patching in Application Server.  When a new release comes out, many times it means 
installing a new version where in the database world, Oracle supplies a patch.  
1.0.2.2.0 couldn't be patched to 1.0.2.2.2. 
1.0.2.2.2 couldn't be patched to 9.0.2
9.0.2 couldn't be patched to 9.0.4.  
9.0.4 couldn't be patched to 10.1.2.0.  
10.1.2.0 can't be patched to 10.1.2.0.2.  

I understand why 9iAS R1 couldn't be patched to 9iAS R2 as it was a major change but there should 
have been patches for things like 9.2.0.2 to 9.2.0.4.

6.  A real Access killer version of HTML DB.  The current version is great for building apps but a 
lot of people use Access to just load tables and analyze data.  You must be a developer in HTML DB 
before you can create a table and load data to it which means more management on top of the 
database someone is already managing.  

It would be nice if I could just grant a user rights in the database, let the user log into the web 
application with the database username and password, and then based on database security, be able 
to create and load tables into the database.
 


Followup   September 30, 2005 - 2pm Central time zone:

1) i wont....

 

4 stars   September 30, 2005 - 1pm Central time zone
Reviewer: Anto 
Some option in sqlplus to return only 'n' rows of output ( instead of giving rownum in each query), 
for all the queries, given hereafter for the session.  


4 stars   September 30, 2005 - 1pm Central time zone
Reviewer: Anto 
Some dictionary view(s) to see all the SQLs executed by each user,after the instance startup, and 
the 'actual' explain plans those queries had used. 


5 stars My wish list...   September 30, 2005 - 2pm Central time zone
Reviewer: Philip Moore from Cincinnati, Ohio USA
Hi Tom,

My wish list is as follows:

1) Star-transformation with bind variables - the reason I ask for this is that we have a 
datawarehouse with Siebel Analytics (which you guys now own) as our primary reporting tool.  We 
have thousands of users issuing relatively similar SQL queries, often differing only by literals in 
the WHERE clause.  Our shared pool is getting killed with unique SQL due to the fact that Analytics 
does not bind - as it shouldn't since this is a DSS (a "seconds-per-query" system).  But I think 
the mentality should shift by Oracle putting a "blind_star_transformation" parameter or something 
of the like that allows the very powerful star-join technique to take place - with Binds.  I 
realize that in some cases, it might not be optimal - but having such a feature would allow to 
prove the case for/against blindly star-transforming queries with binds.  With such a feature - I 
could force Siebel Analytics to bind by using cursor-sharing, until you get ahold of them, Tom ;)

2) Cascading Updates to child tables - I know you've put code on asktom for doing this - but it is 
a tricky workaround to the mutating table error.  Why not build it in the database?  My argument is 
that my $200 Axxess database can do it, why not my $40,000 (per cpu) Oracle database do it? (please 
be gentle here, Tom) :)

3) PIVOT features built into SQL - without the use of Analytical functions.  You have a handy pivot 
routine (in Expert Oracle Signature Edition) - but why not make this a built in feature of the 
RDBMS?  Again - my $200 Axxess database can do it, why not my $40,000 (per cpu) Oracle database do 
it?

4) Why doesn't Oracle mow my grass for me, my $200 Axxess database does, why not Oracle?  Just 
kidding...

5) Hmm, nevermind - 10G R2 has taken care of a lot of my wants :)

Thanks as always Tom, you da man...

Sincerely,

Philip 


Followup   September 30, 2005 - 2pm Central time zone:


2) because it would just be *wrong* ;)

 

3 stars sqlldr log file in XML   September 30, 2005 - 2pm Central time zone
Reviewer: Alex from Riverside
1 how about XML format for sqlldr log output.  

  The current report format is difficult to parse.

2  Execution Plan - REMOTE path (via db link); this should be further expanded.

3  An easier to program and understand DBMS_JOB package

 


Followup   September 30, 2005 - 2pm Central time zone:


3) dbms_scheduler?

easier to program, but a lot more feature rich so harder to understand.

(i thought dbms_job was fairly "straight forward", the hardest thing was the interval and the 
scheduler has that fairly well knocked down I think) 

5 stars   September 30, 2005 - 2pm Central time zone
Reviewer: David Aldridge from Colorado Springs
"4) Why doesn't Oracle mow my grass for me, my $200 Axxess database does, why not Oracle?"

Or dig trenches and move piles of wood ...

:D 


Followup   October 1, 2005 - 8pm Central time zone:

lots of wood, I hurt very much right now, but a good hurt :)  (except for that piece of wood that 
banged off my kneecap, that wasn't a good hurt, that was more like a blinding shot of pain....)

Thought I could move it all in a day - I was wrong, next weekend is yet another weekend....  Almost 
done. 

5 stars   September 30, 2005 - 2pm Central time zone
Reviewer: Lev from Toronto
Hi Tom,

It looks like you opened Pandora’s Box.

 1) I'd like to be able to kill a session without orakill (in windows). Something like:
  alter session ... kill now 
 and all recourses (locks especially) are free

 2) More detailed error messages, probably as an xml document - application will be able to analyze 
it and heal itself.

Thanks,
 Lev
 


Followup   October 1, 2005 - 8pm Central time zone:

1) that is alter system kill session -- that releases the resources such as locks.

It won't release the SESSION entirely until the client says something to us (else we would be 
overwhelmed with "i'm getting 3113's all of the time, whats up with that)



Love pandora's box, I've sent this url to more than one person, They'll see the feedback and take 
it into consideration.


Let is never be said that I've said "this is perfect, we are done".... 

4 stars   September 30, 2005 - 2pm Central time zone
Reviewer: Anto 
To execute all operations in the least possible time and most efficient way - (we have to do away 
with statistics collection,  varying the values of init.ora parameters etc ;-)). 

It has to automatically set the best values for the various init.ora parameters, for any system - 
maybe after the system has been UP for a decent amount of time  


Followup   October 1, 2005 - 8pm Central time zone:

I believe we are getting there for many types of systems - there will likely always be exceptions.

For some systems - all you need to tell us is how much memory to use (pga/sga targets) and that is 
about it - today (10gr1/10gr2).   

4 stars   September 30, 2005 - 2pm Central time zone
Reviewer: Anto 
Never saw a thread so 'hot' other than the "Undocumented secrets for super-sizing your PGA" and 
"Predictive reorganization" for obvious reasons ;-) 


Followup   October 1, 2005 - 8pm Central time zone:

Seems like controversy brings out everyone :)

but yes, this is the 2nd "hottest" thread right now.... 

4 stars sql loader control file generator   September 30, 2005 - 4pm Central time zone
Reviewer: Jim from Portland, OR
Nice little tool (sort of like how htmldb does it) that will generate the sqlloader control file.  
Allow a browse to the file, and show the begining of the file.  Make a guess on the parse, but 
allow changes etc.  Then save the control file.  It could be in Java (not a requirement) so you 
wouldn't have to have it reqritten for each platform.

Oh, yes.  The problem was chained rows and IO queue length.  Thanks for the possibilities of things 
to look for. (We spoke briefly at the Oracle Book Store Wed. at OOW.) 


Followup   October 1, 2005 - 8pm Central time zone:

I remember you -- we were guessing :)  Glad to hear we guessed right.... 

4 stars bulk collect into   September 30, 2005 - 4pm Central time zone
Reviewer: Art from Chicago, IL
I would like to be able to

select a, b, c
bulk collect into my_table_type index by d 
from my_table

where d would set my_table_type's index
 


5 stars I wish ....   September 30, 2005 - 4pm Central time zone
Reviewer: Enayet from Virginia
I wish .. I am hesitant to spell out... Oracle has another nifty version for DW. Often I heard, 
Oracle underperform in DW arena. 

I wish, Oracle would be as easy as .NET + SQLServer duo; Oracle should be sweet as a pie; so 
Developers (.NET + Java dudes) can sucumbs into it like VB developers sucks into SQLServer. There 
should be native API (like ADO) to connect to Oracle.

I wish Larry 'walmart'ize' Oracle as a de-facto database; one can buy Oracle from Bestbuy :))

 


Followup   October 1, 2005 - 8pm Central time zone:

... Often I heard, Oracle underperform in DW arena. ...


don't hear things, experience them.  If it were so, well, we'd be hurting big time.


 

4 stars I wish,,,,   September 30, 2005 - 4pm Central time zone
Reviewer: sns from austin,tx
When I do deletes and inserts of my table every day (I couldn't partition it and trucate the 
partition), I perfer Oracle would have the facility to "exchange" the record .  This way the delete 
from my base table is not required and insert from the incremental can be avoided too.

Something like this:
exchange base_table with inc_table on base_table.column_name = inc_table.column_name.

I know partitions can be exchanged with other tables.

boom......


 


Followup   October 1, 2005 - 8pm Central time zone:

we call this "merge"??? 

5 stars rough interface   September 30, 2005 - 5pm Central time zone
Reviewer: Alberto Dell'Era from Milan, Italy
Instrumentation:
(a) we have bind variables peeking but "explain plan" and "autotrace" don't 
    peek;
(b) we have session cached cursors but we can't distinguish them in 
    v$open_cursors;
(c) we have dbms_xplan to wonderfully format plans but until 10gR2, 
    "explain plan" and "autotrace" didn't use the same rich-information format;
(e) we have parallel execution, but getting the plans of slave sql is an art 
    in itself;
(f) we have tkprof, but its plan dumps don't use dbms_xplan rich format;
(etcetera)

DBA interface:
(g) to rebuild a non-parallel index in parallel, we must "alter index rebuild 
    parallel" it, then set it back to noparallel - why we can't simply specify 
    the parallel degree to use for the rebuild ? Same for "alter table move".
(h) why an insert/*+append*/ into an *empty* table has to maintain indexes 
    (basically) row-by-row, instead of rebuilding them at the end, thus saving 
    tons of redo, cpu etc ? I'm tired of setting them UNUSABLE ...
(etcetera)

That's the hardest part of working with the Oracle database for me. 

I think that I spend 40% of my time coping with limitations similar to the ones above, when 
implementing/testing a design, diagnosing a problem, explaining Oracle to juniors ... 

In other words - working with Oracle is 40% learning about the dashboard, and the rest about the 
engine, suspensions, driving techniques - in my car, the ratio is something around 1%. 


Followup   October 1, 2005 - 8pm Central time zone:

(e) have you seen the slave sql in 10g?  totally redone from 9i?

(h) it doesn't - it does a MERGE of the index - the append builds the index off to the side and 
merges with an empty index in this case. 

5 stars Right on Tom!   September 30, 2005 - 6pm Central time zone
Reviewer: Menon 
"that was the error I thought you wanted - but you mean "a function that forgets 
to return a value" 

Yup - left that detail out for the reader to appreciate it is easy to miss it out.

 


5 stars A real whoami   September 30, 2005 - 6pm Central time zone
Reviewer: Todd from Los Angeles, CA
A built-in function that would return the name of the current function/procedure, even within 
packages.

schema.funcproc_name
or
schema.package_name.funcproc_name

Hard to believe we're at 10GR2 and still don't have this yet... 


Followup   October 1, 2005 - 8pm Central time zone:

hey, whoami isn't imaginary ;) 

5 stars Obvious one....   September 30, 2005 - 7pm Central time zone
Reviewer: David Rydzewski from Lexington, MA
new init.ora setting

FAST=TRUE

Dave 


Followup   October 1, 2005 - 8pm Central time zone:

;)
5 stars wishlist   September 30, 2005 - 7pm Central time zone
Reviewer: Yelena from Seattle, WA
Statement and row level database triggers on SELECT. 


Followup   October 1, 2005 - 8pm Central time zone:

what would you do with the row level trigger? 

4 stars Whishlist keeps growing.. keeps growing   September 30, 2005 - 9pm Central time zone
Reviewer: Raj Kathamuthu from Fairfax,VA
* To Able to rename a schema (just got the rename TBS wish granted in 10gR2..).

* Making HTML_DB able to work with other web servers.. (or have some kind of a PL/SQL container in 
the middle to make it true 3-tier environment)

* Wouldn't it be nice if OID is self contained like any other LDAP servers without requiring a DB 
instance? Some security admins have rules (I'd say blind rules).. like 
 <1> There shouldn't be no databases hosted in the application layer..
 <2> Web layer shouldn't directly talk to DB layer..
 <..>
Sometimes it's hard to convince them and get the waiver..
   Just wondering though.. storing hierarchical data into a relational structure (in case of OID), 
what exactly we're gaining?

        


Followup   October 1, 2005 - 8pm Central time zone:

OID - it'll never happen, you know what you need for LDAP.....


umm, it is called a database, you can call it whatever you like but it is A DATABASE...

Hierarchical data goes well into "relational databases", it is where most of it is anyway.

You gain security, scalability, concurrency, backup, RECOVERY, replication, etc etc etc - without 
actually having to reinvent it all over again.

 

5 stars Enhancement Requests   September 30, 2005 - 11pm Central time zone
Reviewer: A reader from Toronto
How about an area in OTN where enhancment requests for all products can be entered, queried, and 
voted on (one vote per OTN member). This way we don't have to fill up poor Tom's forum with our 
wish list rants. ;-) 


Followup   October 1, 2005 - 9pm Central time zone:

metalink - it does that. voting, no, but the only voting is done by customer advisory boards. 

4 stars What I would like?   October 1, 2005 - 3am Central time zone
Reviewer: Joris from Belgium
1) Macros in plsql. Like #define in C.
2) Bash shell style command history and tab-autocomplete in sqlplus.
3) Ability to flush individual statements from the sqlarea. Sometimes a statement with a bad plan 
sits there because the first time it was executed the values in the binds were unusual. 


Followup   October 1, 2005 - 9pm Central time zone:

1) there is conditional compilation in 10gr2 - like #ifdef, but no macros.....

3) agreed. 

5 stars Improved plsql namespaces   October 1, 2005 - 6am Central time zone
Reviewer: Tom 
Couple of wishes which come from doing a lot of plsql work in the database.

Better Namespaces
-----------------
I would like to be able to actually have package hierarchies so I can create packages

testapp.crm.model.accountapi
testapp.crm.model.contactapi

Obviously this wouldn't be a small change :-) but pretty much all languages have the ability to 
subdivide code into namespaces like this.  Unfortunately the best we can do in Oracle is separate 
schemas with all the related grant management etc.

Check Constraint Error Messages
-------------------------------
Easy one to implement I would think.  I want to type the following

alter table widgets add constraint cost_chk check (cost < 100) error "Widget cost must be less than 
$100";

so I can catch check constraint violations and return a friendly message to the user.

Where do you go in Metalink to log enhancement requests?
 


Followup   October 1, 2005 - 9pm Central time zone:

it is done via the regular ITAR process..


I like that last idea myself. 

5 stars hierarchical queries to xml   October 1, 2005 - 8am Central time zone
Reviewer: arnaud from NL
turn the result of a "connect by" query into xml 


3 stars   October 1, 2005 - 12pm Central time zone
Reviewer: A reader 
sometimes i don't like the support provided by metalink :o) 


4 stars And now to lose some friends.   October 1, 2005 - 12pm Central time zone
Reviewer: Niall Litchfield from Hants,UK
OEM. Its just horrid. I'm yet to be convinced 10g is better than 9i rather than just a backwards 
step. OK I might not lose too many friends for that one but

BINDS 

I really don't see why 

select cols from tab where pk = 10;

should be radically worse than 

select cols from tab where pk = :b1;

I know why it is, I just wish it wasn't. 
 


Followup   October 1, 2005 - 9pm Central time zone:

Niall, 

you won't lose friends by expressing lucid opinions based on your experiences...


But on the bind thing - you and I see opposites I think.  Maybe - when I come to the UKOUG - you 
can sit in on my "all about binds" session and I'll describe "why"


the first time around, "where pk = 10" is not any different from "where pk = :b1"

Even on the 1000th time, "where pk = 10" is not any different from "where pk = :b1"

However, you don't tend to submit "where pk = 10" 1000 times, you tend to do it once and it must be 
compiled (hard parsed)


so, it is the difference between:

where pk = 10
where pk = 11
....
where pk = 10000
where pk = 10001
...
where pk = .............


and 

where pk = :b1



Think about a developer writing a SUBROUTINE for each unique set of inputs and calling them:

subroutine_1
subroutine_2
subroutine_3
.....


that is the logical equivalent. 

4 stars rman improvements   October 1, 2005 - 1pm Central time zone
Reviewer: Chris Crisante from london, ontario
I have liked the improvments in 9i and 10g.  Some of the things that were available in mainframe 
DBMSs I have supported have slowly made their way into Oracle.  

One useful feature still missing is Change Accumulation. This would be an RMAN function to go 
through the archivelogs for a time period and accumulate all the physical changes for each block.  
Subsequent restore could then use an incremental level 0 or full backup, and recovery would apply 
the 'change accumulation' file (and possibly whatever logs accumulated after the change accum 
utility had run.  This would reduce the need for incremental level '>0' backups.  It could also be 
done using only archive logs, no need to use the DB datafiles, and possibly even run on a different 
machine.   And if you have a DB with multiple updates to the same blocks, it could speed up 
recovery (If the block changed every day, only one block image would need to be applied during 
recovery).

I also don't like much about the installation, cost and licensing of Oracle DB.  Especially I 
dislike the way we must license individual 'options' such as partitioning, RAC, Parallel Query, 
OLAP, etc.  I can understand some things such as Advanced Security or OLAP being add-ons. But 
Partitioning?? Parallel Query?? These should be a basic part of any DBMS these days.  There is 
already the additional cost for 'Enterprise' edition which should cover the features such as 
Partitioning that most "enterprises" would need.

When I watch a sporting event these days, there is usually  an Oracle commercial talking about the 
"low-cost" Grid - I see about 16 processors on the screen and do the math in my head. Processor 
licenses, partitioning liccenses, RAC Licenses, Parllel Query licenses, license the hot standby 
site at the exact same cost as production even though there are no users, etc, etc, etc.     




    

 


Followup   October 1, 2005 - 9pm Central time zone:

well - a physical standby does change accumulation and since you can backup from standby and 
restore to production - you sort of have that concept today.


PQ is a feature of Enterprise edition, not an option (hasn't been for a while).  The license 
options are based on market - what do the others have or not have as well drives this. 

5 stars Queue DDL statements.   October 1, 2005 - 3pm Central time zone
Reviewer: Sai from San Jose, CA USA.
Hi,

My wishlist is to have the ability to run some DDL commands like "alter table add column...." on a 
busy table and let it queue along with other DML statements hitting this table. I know 
dbms_redifinition does it, but how about recreating a 300G table every now and then with each 
application release and take the performance hit whie the rebuild is going on. 

This is in the lines of what online index rebuild does, it queues with DML statements to get a lock 
on the table and start recording changes happening in a journal table.

We have already filed enhancement request for this.

Tom, do you see any downside of having this feature? 


Followup   October 1, 2005 - 9pm Central time zone:

well, it could lead to a logjam.

In order to queue in there, you prevent further updates from starting (they block on the ALTER), 
but if the alter is blocked long enough - bamm, the system sort of stops dead.

that is one potentional downside - and since an add columm with a default could take a really 
really long time.....

that would be another. 

3 stars Standby <> Change Accum   October 1, 2005 - 9pm Central time zone
Reviewer: Chris from london, ont
You have a point in theory i guess, but in practise:

1. Standby requires another physical copy of the database, whereas a 'change accum' would not 
require this disk space.  Just sufficient sort space to go through the logs.   Sort of  like an 
incremental backup requires less tapes than a full backup (in most cases).

2.  Running a standby DB on a remote system requires a full production license for that system.   
Double the cost. A 'change accum' function could be run on the same system as the primary DB (or 
maybe on an offsite system configured in a less costly way to offload the work).

Other DBMS's i have used had both of these functions (standby and change accum) and we could use 
whichever was a better fit for us.  It would be nice if Oracle did the same.

As for the licensing rant, i was just venting.  Of course Oracle has the right to charge whatever 
the market will bear.  But it is an inconvenience of having to go ask for more money from mgmt or 
users when we figure out, say, that partitioning would be helpful.   

But I do wonder how well Grid computing is catching on with the average company when each processor 
in the Grid requires a processor license?   


Followup   October 2, 2005 - 10am Central time zone:

Agreed, I was just pointing out that while not identical, you can achieve a very similar goal.

It is not double the cost, standby machines are typically a fraction of the size.


Another "accum" approach is the improved incrementals in 10g -- where we catch a backup up on disk.


Each processor in a NON-GRID environment requires a license too.  At the end of the day, you either 
have 16 cpus in a single big machine or 16 cpus in 4 small very cheap machines.  You still have 
"16" 

5 stars Reduce/Eliminate parsing of REF CURSORS   October 1, 2005 - 10pm Central time zone
Reviewer: A reader 
It would be nice to have an "option" that would prevent parsing of the same SQL statement in a 
reference cursor.  While I use them in specific places for specific problems with bind variables 
and session_cache_cursors, executions from multiple sessions can hit the library cache latch pretty 
hard.

Having the option to specify that a reference cursor is weak, strong, or static would be really 
nice! 


5 stars just a couple of things   October 1, 2005 - 11pm Central time zone
Reviewer: Mark Wooldridge from Warrenton VA.
Well there are probably others but this is all I can think of now.

1.  insert into tab values my_rec overiding col1 with myseq.nextval;

1.b  assign user object = user rec, mapping the columns where the names are the same.  ability to 
also assign rec = obj.

2.  parametric search indexing similar to Verity's where you can refine a result search using 
predefined parametric values.  Implemented this with an IOT which is maintained using a PL/SQL api 
for insert/update on the table.  Just would like to see this more integrated with Oracle text. 


4 stars   October 2, 2005 - 12am Central time zone
Reviewer: Robert from CT
>>1.  PL/SQL development tool with tight integration with version control like VSS <<

the new and free JDeveloper ?

>>
create or replace function f (x number )
return number
is
  l_ret number;
begin
  if x = 1then
    l_ret := 2;
  elsif x = 2then
    l_ret := 3;
  else
    l_ret := -1;
  end if;
end f;
<<

Wow ! I haven't written standlone functions in a while
didn't even know this was compilable. 


3 stars to Robert   October 2, 2005 - 1am Central time zone
Reviewer: Muhammad Riaz Shahid from Dubai, UAE
Why do you think this code is not compilable ? 


Followup   October 2, 2005 - 10am Central time zone:

the lack of spaces in the thens looks "not valid"


 
ops$tkyte@ORA9IR2> select*from dual where 1>0and 5<6;
 
D
-
X


sort of like that. 

5 stars   October 2, 2005 - 6am Central time zone
Reviewer: Alberto Dell'Era from Milan, Italy
On:
http://asktom.oracle.com/pls/asktom/f?p=100:11:::::P11_QUESTION_ID:48704116042682#48858384840202
The point I was trying to make is that a lot of little "issues" or "inconveniences" scattered here 
and there, when added together, make a big issue and a lot of wasted time for everyone.

The "devil is in the details" is another way to put it.

I think that when re-engineering the engine, brakes and suspensions, the Oracle Engineers should 
walk the extra mile and apply their top-notch Engineering skills to the dashboard and stick-shift 
controls also (perhaps with the help of an ergonomic specialist). 

Eg implementing the "bind variable peeking" feature took a lot of time for sure - why not walking 
the extra mile and modify "explain plan" also, that takes, I bet, just 1% more time ?

That's where I waste a lot of time - on details.

And when mentoring juniors, I usually start a mentoring session with a smiling-face junior ("great, 
today I can learn how to drive the Ferrari of the databases!!"), and very often see his/her face 
switch to disillusioned mode ("gosh, I expected the Ferrari cockpit to be a tad better"). Speaking 
about *perceived* quality.  


Followup   October 2, 2005 - 10am Central time zone:

but the binds don't exist for an explain plan?  applications do not "bind" to explain plans ;)  

ops$tkyte@ORA9IR2> explain plan for select * from dual where :x= :y;
Explained.

no binds were defined, declared, anything - the concept has never existed.



As for your last paragraph, not that it matters - but have you seen the cockpits of the high end 
cars? 

5 stars   October 2, 2005 - 10am Central time zone
Reviewer: Alberto Dell'Era from Milan, Italy
> (h) it doesn't - it does a MERGE of the index - the append
> builds the index off to the side and merges with an empty 
> index in this case. 

Ok, but why merging with an empty index (and thus generating undo) instead of replacing the empty 
index with the "off to the side" one ? Or just rebuilding the index after the rows have been 
inserted above the table HWM (thus "kernelizing" the classical manual SET UNUSABLE-INSERT 
APPEND-REBUILD sequence - avoiding the UNUSABLE which is not necessary).

Inserting into an empty table is not infrequent - staging tables, local copies of remote tables, 
indexed GTTs, etc 


5 stars Furthering the override above   October 2, 2005 - 11am Central time zone
Reviewer: Bob B from Albany, NY
Or just a way to attach a sequence to a table.column as a default.  If the column isn't provided, 
it uses the sequence number. 


Followup   October 2, 2005 - 12pm Central time zone:

well, I know it is not a sequence, but if all you want is a "surrogate key":

ps$tkyte@ORA10G> create table t ( x raw(16) default sys_guid(),
  2                   y varchar2(32) default sys_guid(),
  3                                   z varchar2(5) );
 
Table created.
 
ops$tkyte@ORA10G>
ops$tkyte@ORA10G>
ops$tkyte@ORA10G> insert into t (z) values ( 'hello' );
 
1 row created.
 
ops$tkyte@ORA10G> select * from t;
 
X                                Y                                Z
-------------------------------- -------------------------------- -----
0227D36794A61D44E040007F010061CC 0227D36794A71D44E040007F010061CC hello
 


(using RAW would be best - but some people are 'afraid' of raw...) 

5 stars   October 2, 2005 - 12pm Central time zone
Reviewer: Alberto Dell'Era from Milan, Italy
>ops$tkyte@ORA9IR2> explain plan for select * from dual where :x= :y;
>Explained.

I know, it assumes that :x and :y are varchar2 and doesn't peek at the bind variables values.

Wouldn't you be happy if "explain plan" peeked at the values (and TYPES) of the :x and :y bind 
variables (including the LENGTH of varchar2 variables that can influence the plan) and so generated 
and explained the *real* plan ?

Or - how many people actually know about that "explain plan" limitation ? Even if they know, it's 
Yet Another Thing to remember - add all them together and it makes for a pretty cluttered 
dashboard. Fix these little "inconveniences" and you'll get a much more pleasant driving 
experience, and enjoy the top-notch engine, instead of fighting with the cockpit controls. 


Followup   October 2, 2005 - 5pm Central time zone:

(there is nothing to peek at is my point...)

I didn't define any binds, you don't define binds, you don't even have the syntax to bind to a 
explain plan...

I hear you - but it would take almost a new command and a change in code in all existing 
applications. 

5 stars sys_guid()   October 2, 2005 - 1pm Central time zone
Reviewer: Bob B from Albany, NY
I didn't know sys_guid() could be used.  The only problem I see is that the raw is always going to 
take 16 bytes, whereas a number will take between 1 and 8(?) bytes.  This isn't much for a single 
table, but using it across an application and with RI it could add up quickly.  

Another advantage of being able to bind a sequence to a table.column would be the ability to easily 
tell what sequences are used for which tables.  Plus, the database engine could use this 
information to optimize insert into select, merge, and other bulk operations. 


Followup   October 2, 2005 - 5pm Central time zone:

1 and 22 bytes....
numbers are 1 to 22 bytes in length.


I don't see how this would optimize anything? 

1 stars I wish I could. . .   October 2, 2005 - 3pm Central time zone
Reviewer: Andrew from Michigan, USA
a) Set an initialization parameter that would return something like "ORA-01002: fetch out of 
sequence" for any transaction that attempts to fetch across commit -- not just on a FOR UPDATE 
cursor.  We have a standard that we do not do this, but it would sure be nice to be able to have 
the database enforce it.

b) See the values of bind variables for other sessions.  Something like v$session_binds
sid,
serial#,
sql_address,
sql_hash_value,
name,
value

There are probably others, but those are the only ones that come to mind right now. 


3 stars New undocumented ora.init parameter   October 2, 2005 - 4pm Central time zone
Reviewer: Andrew from NZ
First step:
_db_optimization = SO_SO
Second step:
_db_optimization = OK
Third step:
_db_optimization = PRETTY_GOOD
Fourth step:
_db_optimization = VERY_VERY_FAST
Fifth step:
_db_optimization = TRULY_AMAZING

After each iteration run some benchmarks and give them to the management. Now that's something that 
every DBA would appreciate!





 


5 stars about the exchange row facility,   October 2, 2005 - 6pm Central time zone
Reviewer: sns from austin,tx
Oh my god.  I keep using this facility from the last 2 years and I forgot about this.  The reason I 
forgot is, in my current working place, there are lots of ETL transactions that does DELETE and 
INSERT.  Nobody has tried doing MERGE as an alternative.  May be they are scared of the performance 
since some tables have more than 100 columns.  Can we use "parallel" hint while doing MERGE? 

I like to work in a place where management gives full liberty to make use of all the features the 
database has.  But buerocracy sometimes prohobits that.


Thanks, 


Followup   October 3, 2005 - 7am Central time zone:

you can do a parallel merge, direct path the insert part....


100 columns? so? 

3 stars SQL Loader dinosaur should evolve   October 2, 2005 - 10pm Central time zone
Reviewer: Andrew from NZ
1. SQL Loader control and shell run files should really be generated through a GUI so that people 
like myself don't have to look at the docs literally every time (or I have to look at an example of 
an older SQL Loader process). OWB has now got some functionality there but why not copy that 
functionality somewhere else and expand it further...

2. One thing that I really loathe about SQL Loader is that you have to call it from command-line 
and cannot do it straight from PL SQL. Does anyone really feel like creating shell scripts and even 
worse, extracting error info from log files?! It shouldn't be that hard to create PLSQL and Java 
APIs for it, with nice error codes. External tables are usually a good alternative but some 
functionality is missing (e.g. loading into multiple tables - very often found in many legacy and 
even non legacy environments). 


Followup   October 3, 2005 - 7am Central time zone:


2) multi-table inserts?  you can load into as many tables as you like, even easier than sqlldr.  
You can use complex when clauses with OR's, AND's, whatever sql function you like 

4 stars Re: What I would like?   October 2, 2005 - 11pm Central time zone
Reviewer: Egor Starostin from Russia
> 2) Bash shell style command history and tab-autocomplete in sqlplus.
You know, it's already here. Just install rlwrap to enable these features. :)
 


3 stars Standby is a fraction of cost?   October 3, 2005 - 1am Central time zone
Reviewer: chris crisante from london, ont
Sorry about this - I know this thread isn't about licensing.  But.. in reply to your points

"It is not double the cost, standby machines are typically a fraction of the size."   

 - I meant double the cost of Oracle licenses, not double the cost of the machine.  According to a 
very official looking document I have  - I could fax it to you - if we implement a Hot Standby 
which we intend to use for DRP (The usual reason for a Standby at our shop), we must license that 
standby machine at the same level as the production machine.  We can't buy a 'small' Oracle license 
 (eg 10 named user, etc) for our DRP machine even though nobody will (hopefully) ever sign on to 
that machine.  And every time we add capacity to a production machine, we are obligated to add the 
same license for DRP.   We have argued this point unsuccessfully for years. 

"Each processor in a NON-GRID environment requires a license too.  At the end of the day, you 
either have 16 cpus in a single big machine or 16 cpus in 4 small very cheap machines.  You still 
have "16"  "

Agreed, 4*4=16*1.  But in my experience there is usually the choice of upgrading CPUs vs adding 
more CPUs. Sometimes we feel 'more CPUs' might perform better than 'faster CPUs' for a particular 
app, but we can rarely use that approach because the licenses cost more than the hardware.

The Grid approach makes a lot of sense.  It would be nice to  manage CPUs as a 'low-cost' commodity 
much like disk. But to date, the licensing costs have made that approach hard to sell.  It's not 
just Oracle, most software vendors base their costs on the number of CPUs in the machine.  
Hopefully that will change someday soon.    

 


Followup   October 3, 2005 - 7am Central time zone:

that is not my understanding on how it works, but I am not a license person.

The database license guide
http://www.oracle.com/corporate/pricing/specialtopics.html
states that the same *metric* must be used (named user vs processor) but does not say you have to 
license 16 cpus on a standby that only has 4.  You cannot license named user on production and cpu 
on standby, you have to do cpu/cpu or named user/named user. 

5 stars Cost: Oracle standby vs DB2   October 3, 2005 - 6am Central time zone
Reviewer: Enayet from Virginia
Just to add my recent experience about standby licensing:

Oracle does charge for standby licensing which is disheartening. My arguement is: standby is an 
inactive database, why we should pay for that?

I know IBM/DB2 do not charge any extra for their standby. On the same token, Oracle argue that 
their standby is a HOT standby and can be turned as a read-only DB anytime for reporting purposes. 

But my personal opinion: this is just a over kill. Standby should be free of charge, no money 
should be paid for such an idle database, does not make any valid business case! 

I have worked with Veritas, EMC, IBM and Microsft. They all agreed not to charge any money for the 
software (even for hardware IBM and EMC agreed to opt out for a premimum pay) until activated for 
production usage; except Oracle. That's beat me!
 


5 stars   October 3, 2005 - 6am Central time zone
Reviewer: dave 
Taking Oracle's point of view here. A true standby database is a live database it is accepting redo 
and processing that data. With a logical standby you can actively use that database for queries and 
reporting (and you can with a physical standby as well if you open it read only)

To say it is idle is false really because it is doing a lot of work on your behalf to keep your 
data in sync

If you dont want that consider a cold failover one where if the first machine fails you can remount 
the disks onto the second server and then startup the instance.  If that database is active for 
more than 10 databases per year then you need to buy a license, otherwise 'free' 


3 stars my wishlist   October 3, 2005 - 6am Central time zone
Reviewer: Markus from Austria
1. a "switch user" command like the "su" command on unix. this would be a tremendous help as we - 
the dba's - would not have to know all user passwords any longer. (tom, i know your script where 
you temporary change a user password and set it back in following. but this is not feasible in any 
case).

2. comment opportunities for nearly all database objects like the already existing table and column 
comments. it is very common that objects, starting with users, roles and associated privileges are 
created/granted by someone, maybe also documented somewhere "off-line", but after a while no one 
really knows what these objects have been initially created for. providing the ability for object 
comments would make the database scheme more "self-documenting", eg. looking at DBA_USERS could not 
only show what is in this case but also why it is. 


Followup   October 3, 2005 - 7am Central time zone:

1) but why is a DBA having to even log in as another user?  what are the use cases (i can aleady 
create a table, index, procedure, etc etc etc "for" you, why do I need to "be" you?)

 

3 stars ad "my wishlist", "why a dba have to log in..."   October 3, 2005 - 8am Central time zone
Reviewer: Markus from Austria
hi tom,

as why a DBA have to log in as another user. 

eg. to maintain private database links (stuff and organisation change and sometimes new stuff is 
not aware how to do this, or it is not pretty clear at the moment who is responsible for this in 
future,...).

eg. to work and try something in a specific users security domain directly. sometimes users call 
and simply claim "it is" where i, as dba, want to validate that "it is" for real. this hold 
especially true when using security contexts and logon triggers,...

regards,
markus

 


Followup   October 3, 2005 - 11am Central time zone:

for private dblinks, I've not heard/experienced a need for a DBA to do that personally - that seems 
fishy..... 

4 stars   October 3, 2005 - 8am Central time zone
Reviewer: AJB from England
What about enforcing the use of APIs if required.

If you have table(s) that should only be maintained via api calls then prohibit other update 
methods (single dml statements).

This should probably be configurable as it wouldn't always be needed or desirable but would be a 
good option to protect data from rogue updates. 


Followup   October 3, 2005 - 11am Central time zone:

GRANT and REVOKE are awesome for that?

I mean, with n-tier proxy authentication, secure application contexts and fine grained access 
control - you have that (since 8i). You can make it so that only your application can muck with the 
data 

5 stars Column dependency.   October 3, 2005 - 8am Central time zone
Reviewer: MBPP from Brazil
One nice feature to implement would be to have a dictionary view to show where a particular column 
is referenced, not only table. 


5 stars   October 3, 2005 - 9am Central time zone
Reviewer: Alex 
Tom,

Since I submitted this thread I've gotten about 50 emails from you saying "a reply has been posted 
here....etc".  It seems I am getting one for every time someone posts a followup here.  I was 
thinking you might like to check into that.  Thanks.

 


Followup   October 3, 2005 - 11am Central time zone:

You asked to be notified when the question is updated when you submitted it?

Would you like for me to update that and turn it off for you? 

5 stars To: AJB from England   October 3, 2005 - 10am Central time zone
Reviewer: Andrew from Michigan, USA
That facility is already available, thus;
a) create a schema to own all objects.  The password is known only to the DBAs.
b) DO NOT grant any privileges (other than maby select )on these tables to anyone.
c) create the API procs ( in the same schema as the tables ) as necessary.
d) Grant execute on these API procs to the appropriate users/roles.

Now no one can manipulate the data at all, except through one of the procs you have created.
 


4 stars   October 3, 2005 - 11am Central time zone
Reviewer: AJB from England
Thanks Andrew - I know you can limit access in this way, but I'm looking for an extra level of 
protection to stop developers (the people maintaining the apis) from bypassing existing APIs.
I know you would expect these people to be aware of existing APIs and how to use them, but in 
complex applications this isn't always the case especially if the APIs aren't as fully documented 
as they should be.
 


Followup   October 3, 2005 - 11am Central time zone:

n-tier proxy authentication, you can set it up so that only the application can make changes. 

4 stars Your Top 5 or Top 10 suggestions   October 3, 2005 - 11am Central time zone
Reviewer: Anto 
Hi Tom,

Before you decide to close down this thread, please pick your Top 5 or Top 10 suggestions from the 
list given by various users of oracle

  


Followup   October 3, 2005 - 8pm Central time zone:

There are precisely 2 threads out of 27,231 that I've "closed down" regretfully ever.  2...  There 
is a commonality between those two threads not shared by this one.  It won't shutdown.

I was asked to get the top ten from here and send them along (this thread has generated interest), 
I'll share that all with you after I do it. 

5 stars   October 3, 2005 - 11am Central time zone
Reviewer: Mark 
"
Followup:  
1) but why is a DBA having to even log in as another user?  what are the use 
cases (i can aleady create a table, index, procedure, etc etc etc "for" you, why do I need to "be" 
you?)"

What about Jobs?  As a DBA, can you scedule a job for a user? Or run a job as a user?  I have not 
used 10g so maybe so, but in 9i this was a problem. 


I would like to see the power and flexibility like the Concurrent manager in Oracle Apps.  Have the 
ability to group jobs, prioritize them, and serialize them.  I also would like to see Enterprise 
Manager have a job management screen.

Thanks..
 


5 stars Virtual column?   October 3, 2005 - 11am Central time zone
Reviewer: David Rydzewski from Lexington, MA
Something to the effect of 

alter table add new_column varchar2(50) new segments only;

In other words, altering a table to add a new column but only having it effect new partitions 
added. SQL against older partitions would yield a null for this column. Once older partitions are 
aged out, the column is no longer considered "virtual." 

Could be useful in supporting change in a data warehousing environment that can't afford down time.

Dave 


5 stars   October 3, 2005 - 11am Central time zone
Reviewer: A reader 
Oh is that how that works?  Sorry I thought that was to notify me when YOU responded to it.  This 
is the first time I asked a question and it's been published.  If it's not too much trouble you can 
kill that, this turned out to be a hot one. 


Followup   October 3, 2005 - 8pm Central time zone:

done... 

5 stars Above post is Alex   October 3, 2005 - 11am Central time zone
Reviewer: A reader 


4 stars column specific errors   October 3, 2005 - 11am Central time zone
Reviewer: Igor from France
Hi,

It would be nice when doing large INSERTS (I mean many columns) that error messages that are column 
specific are more informative. So, if you have error when attemped to insert NULL in not null 
column or when insert alpha character which are not digits, that's is clear what column is 
problematic. 
Also it would be nice that view column and value mappings are made much clearer. 
 


Followup   October 3, 2005 - 8pm Central time zone:

ops$tkyte@ORA10GR2> insert into t values ( null );
insert into t values ( null )
                       *
ERROR at line 1:
ORA-01400: cannot insert NULL into ("OPS$TKYTE"."T"."X")



for nulls that's been true for a couple of versions. 

4 stars Add a storage option for LOBS   October 3, 2005 - 1pm Central time zone
Reviewer: Jim from Portland, OR, USA
Add a storage option for LOBS to store them as gzip or a zip or simlar compressed format.  Maybe 
this would be limited to binary (BLOBS).  The BLOB would be uncompressed on the return.  The 
compressed format would not allow function manipulation (instr, etc.) or where clause usage.  It 
would just compress the data. 


3 stars Sqlplus Enhancement   October 3, 2005 - 2pm Central time zone
Reviewer: Mathew Butler from UK
How about a facility in sqlplus to enhance the SQL buffer and enable the aliasing of ad-hoc SQL in 
sqlplus. It seems I type similar things within a session many times. It would be great to be able 
to alias the last 10 queries that you exectuted and then be able to access these in the buffer.

Mat. 


5 stars parameter request   October 3, 2005 - 4pm Central time zone
Reviewer: Tom Jordan from Düsseldorf, Germany
I would request an "exclude" parameter for imp/exp. My fingers are cramped from listing out all 
(1000 - 1) tables for an export.

Sure I can script it with all_tables etc., I'm just saying...

-- Tom 


Followup   October 3, 2005 - 8pm Central time zone:

data pump....... 

4 stars   October 3, 2005 - 5pm Central time zone
Reviewer: A reader 
I guess it is there in expdb in 10g 


5 stars Raptorize   October 3, 2005 - 5pm Central time zone
Reviewer: Tarry Singh from The Netherlands
"(you beat me to it!)"

heh heh 


5 stars init parameter request   October 3, 2005 - 6pm Central time zone
Reviewer: A reader 
Hi,

a nice parameter would be
implicit_type_conversion=false 


4 stars My requests   October 3, 2005 - 8pm Central time zone
Reviewer: Gary from Sydney, Aus
Something similar was set up on 
"
http://www.oracleplsqlprogramming.com/IC/"
but it had a tendancy to throw MySQL errors when submitting suggestions :)

My list. 
1.A couple of mentions for disabling implicit type conversion. I'd like that to extend to explicit 
type conversions without format masks, at least for TO_DATE.
2.DESC for a specific procedure/function in a package
3.Extended explain syntax to add an optional USING clause (similar to EXECUTE IMMEDIATE) to allow 
the equivalent of bind variable peeking.
4.Something that is sort of like a function, but only involves SQL so doesn't require a context 
switch.
For example, you want to strip all the non-numeric characters from a string, you have
CREATE OR REPLACE ????? strip_nonnum (p_in varchar2) 
returns
translate(p_in,' '||translate(p_in,' 1234567890',' '),' ');
and your SQL is simply SELECT strip_nonnum(col_name)....

[Thinking about it, it would be nice to have STRIP and KEEP SQL functions that discard or keep 
characters from strings rather than using TRANSLATE. I hate the fact that TRANSLATE fundamentally 
deals with arrays of characters rather than strings, but treats a zero length array as a null 
string. CONCAT is quite happy with the idea of a zero-length strings.]
 


Followup   October 3, 2005 - 9pm Central time zone:

2) oh, so you want to go back to 7.3 :)  (that was the way it used to work....)

3) nice, in line with Alberto above...

4) I like that.

 

3 stars User Friendliness   October 4, 2005 - 12am Central time zone
Reviewer: Dhimant from India
I guess anybody who has worked with MS SQL Server 7.0 and above can easily understand the ease of 
use and flexibility Enterprise Manager in SQL Server offers. Java based consoles [OEM] are good, 
platform idependent but slooooooooooooooooooooow. Oracle has fantastic manuals but the same needs 
to coupled ***with*** sqlplus, at least for SQL and PL/SQL. A light weight database modelling tool 
too should be made a part of Oracle Enterprise Edition. Forget everything else I think just add the 
SQL and PL/SQL Documentation with sqlplus. Do it and Do it asap.

regds. 


Followup   October 4, 2005 - 1pm Central time zone:

Forget 
everything else I think just add the SQL and PL/SQL Documentation with sqlplus.


what do you mean by that? 

5 stars Idle musings   October 4, 2005 - 1am Central time zone
Reviewer: Connor from Perth
Most of these can be done via other means - so this is more of a "convenience" list.

1) "on commit trigger"

For doing those transactional level validation things - sort 
of like deferred constraints on steroids. 

2) "v$sql_children"

child of v$sql showing statistics for each execution of an SQL (say at stats_level = all).  
Sometimes 5 executions of the same child cursor have very different execution characteristics.

3) "10046 level 16"

logical IO's dumped to trace file.  (I know there are other means of doing this but be nice to have 
it all under 10046)

4) SQL to PLSQL call stack

SQL's called from PL/SQL can be linked to the executing package without having to 
trace/profiler/x$kglrd

5) Extended unique constraint

alter table T add constraint C unique ( upper(col) )

rather than having to use 'create index'

6) scott/tiger

$> ls -l /oracle/10gr2/sqlplus/demo/demobld.sql
/oracle/10gr2/sqlplus/demo/demobld.sql: No such file or directory

I dont *want* those new example schemas :-)

7) rman "duplicate as copy"

rman dup appears to always use a backup or take a new one.  Why not just backup from the live db 
straight into the duplicated instance.  The 'backup as copy' gets me closer in 10g

8) parent-id shown with dbms_xplan

The indenting is nice, but the explicit link between id to parent id is more concrete imho.

9) lob segments named better by default

rather then "SYS_L....".  why not do it like materialised views etc - use the first 'n' chars of 
the column name with a sequence# suffix.  You could always fall back to the default if a class 
occurred.

10) smart date based add-partition

If you've got a range partition table and each range is a day/week/month/year, then its not too 
much of a stretch to allow a ddl as:

alter table T add partition default range;

11) /*+ cursor_sharing_force */ hint

Trying to convince java developers to rewrite their string-concatenated SQL is a big ask.  But 
getting them to add the hint to the string is easy.  Allows selective cursor sharing without having 
to toggle 'alter session' calls throughout the code.

12) dbms_stats('execute-for-n-secs')

Rather than estimate/compute etc, simply a "please calculate stats until n seconds have elapsed".  
Under the scenes it could be similar to the auto mode - start with small sample and keep extending 
until time runs out.

13) aux_stats$ entries per instance

14) alter sequence reset to n;

15) online table move

"alter table T move online";

Spare the dbms_redefinition mumbo jumbo :-)

16) transactional truncate (under certain conditions)

So we could do:

truncate
insert /*+ append */
rollback

I'm thinking the truncate simple sets a seg header flag which forces all new data about the hwm.  
If you commit, we move the start block to the old hwm.

17) usage counts in v$object_usage

18) alter (context) index rebuild online;

and no its *not* already there when the manual says: "At the very beginning or very end of this 
process, DML might fail."

19) Removal of anything related to XML :-)

Cheers
Connor 


Followup   October 4, 2005 - 2pm Central time zone:

5) yes....


thanks for the list - nice ideas.  I will be (after this settles a bit, getting there soon I think) 
pick sort of a top-n to be sent on up the chain. 

5 stars For "Queue DDL statements"   October 4, 2005 - 1am Central time zone
Reviewer: Connor from Perth
You might want to play with "ddl_wait_for_lock" 


Followup   October 4, 2005 - 2pm Central time zone:

well, now you are just getting pushy ;) 

5 stars If not already mentioned ...   October 4, 2005 - 3am Central time zone
Reviewer: Clemens from Vienna, Austria
... how about these: 

- NULL-Strings <> '', as session or init-Parameter, that would help a lot (and keep away those 
NVL-constructs).

- Trigger "numbering" (as for example seen in firebird), so we can have for example several "insert 
for each row"-triggers on the same table, with a fixed execution order - could be handy if you 
automate some insert triggers for sequence no's or have to add new features to existing 
applications.

- Sequence/Id-Columns, as seen in postgres. You can still create your own sequences, but it keeps 
away the unavoidable insert-triggers for that purpose.

- Removing the varchar2 barrier - lobs are nice, but why not open up the "character" datatype as 
seen in other DBs (even firebird manages char-columns up to 32K length).

- A "step"-clause in the for-loop would be nice (as seen in other languages [2]).

- Case statements with selector which allows extended compares, such as IN, LIKE, etc. Searched 
case statements are nice, but couldn't there be more relaxed variant for the selector-type? (as 
seen in other languages [2]).

- Mixed case object names combined with case insensitive DML. All upper case (such as in 
desc-statements) is harder to read (in my opinion), "<objectname>" requires " "-syntax on selects, 
etc. if I remember correctly. Could be a session or init-parameter.


- Already mentioned: constraints with it's own error messages (I think Sybase ASE has that already 
built in).

- Already mentioned: 30 character limit on (all) object names. Tables/Columns are fine (for me), 
but constraints (such as foreign keys), where I usually prefer to include both tablenames and 
columns for easier identification it's a drag, especially if you use 3rd-party modelling tools.

C.

[1] My first post here, but I'm a reader of this, in my opinion very valuable "knowledge base", for 
a couple of years now.
[2] I'm refering to languages such as Visual Basic (gambas if you're on die *[IU]X-Side). 


5 stars I wish...   October 4, 2005 - 6am Central time zone
Reviewer: Vladimir Andreev from Germany
Removal of LONG columns from the dictionary views (or adding new LOB columns with the same data and 
keeping the LONG columns for backward compatibility - sort of what happened to V$SESSION_EVENT with 
regard to TIME_WAITED and TIME_WAITED_MICRO)

Cheers,
Flado 


4 stars I would like...   October 4, 2005 - 7am Central time zone
Reviewer: Frank from NL
... to be able to see dependencies between packaged functions and procedures (i.e. at 
function-level; not at package level), as well as to be able to query for parameters of (private) 
procedures/functions
 


5 stars Tkprof stuff   October 4, 2005 - 8am Central time zone
Reviewer: Jim 
1. Finer resolution on CPU times.
2. Format bind values. 


5 stars group by syntax   October 4, 2005 - 9am Central time zone
Reviewer: Graham Halsey from London, UK
I may be way behind the times (8i!), but why can I do this:

"select table_name,tablespace_name from user_tables order by 2,1;"

but not this:

"select tablespace_name,count(*) from user_tables group by 1;"

i.e. why is ORDER BY and GROUP BY handled differently when it comes to referring to fields in the 
SELECT list numerically? 


Followup   October 4, 2005 - 4pm Central time zone:

SQL standard....  It permits order by <ordinal column position>, but not so for group by. 

5 stars Finer grained dependencies on packages ...   October 4, 2005 - 9am Central time zone
Reviewer: Dushan from Czech rep.
I wish I could see dependency like:

package1.procedure1 calls package2.procedure2

It would be nice for documentation issues. 


3 stars Syntax Re-write..   October 4, 2005 - 10am Central time zone
Reviewer: Pet from USA
I would like PL/SQL syntax to match up with other languages (java probably..)

:= should become = 
= should become ==
if() then end if should become if(){} else {}
...

it's tough everytime to change the coding style from PL/SQL and Java . I guess most of the 
developers has the same problem.. 
 


Followup   October 4, 2005 - 4pm Central time zone:

that'll not be happening.

Make java change.  := predates java by a couple of years and a quite a few languages :) 

5 stars Sorry, but I disagree ...   October 4, 2005 - 10am Central time zone
Reviewer: Clemens from Vienna, Austria
@Pet: Java is Java and PL/SQL is PL/SQL (or ADA). No need to turn PL/SQL into something different. 
But if Oracle would offer the usage of different SP-Languages (like for example postgres) ... my 
personal favorite then would be LUA. ;-)

C.  


Followup   October 4, 2005 - 4pm Central time zone:

we do allow for different languages 

plsql
C
java

and in 10gr2 - CLR languages on windows 

5 stars wish list   October 4, 2005 - 11am Central time zone
Reviewer: Georg from Germany
1. Improved data dictionary security
Why is it possible to modify internal views (like DBA_USERS)? I wish a new security layer would 
make such internal objects "read-only". Or even having any internal checksums to be able to detect 
manipulations...

2. From the other DB-world: TOP N Query and Identity
I know, it's easy to build it in Oracle - but...
Why not just
create table <t-name> (id number identity using sequence <seq-name>)

and SELECT TOP N ... is really much more user friendly then using inline views.

3. "NULL or unique" constraint.
Business case: You have a form having email field. The user don't have to fill it - but if he does, 
the email address has to be unique. So there are many NULLs values and unique not null values

4. already mentioned: 30 char limit and reset a sequence value
 


Followup   October 4, 2005 - 4pm Central time zone:

3) that already exists??  a unique constraint on a NULLABLE column is always "null or unique"

 

5 stars Arrays as IN arguments to SQL Statements   October 4, 2005 - 11am Central time zone
Reviewer: Steve G from Fairfield, CA
I wish plsql would allow arrays passed in to be used as an IN argument to a sql clause such as:

p_array_demo(p_int in int_array)
is
begin
  select *
  from temp
  where pk in (p_int);
end;

That would be real helpful. 


Followup   October 4, 2005 - 4pm Central time zone:

if you use collections - you can do that.


 

4 stars The Installer   October 4, 2005 - 11am Central time zone
Reviewer: C Wayne Huling from Virginia Beach, VA
If this is available, I have not found it?  Running the Universal Installer in text mode.  Having 
to run that across a 10 base T (really, the Government Installation won't upgrade!) through the 
firewall is a killer!   


Followup   October 4, 2005 - 4pm Central time zone:

there is no character mode, there is 

a) gui mode
b) silent mode (you ran the gui and created a response file to replay later) 

3 stars Access of tracefile to developers   October 4, 2005 - 11am Central time zone
Reviewer: Jagjeet Singh from India
I would like to have a feature which can provid the trace output to direct sql*plus client.

Developer can issue "alter session set sql_trace=true" 
but for getting this file they need to have access on database server or dba needs to setup

I would like to have a global_temporary table for this output.
 


4 stars Delink Full Table Scan I/O from db_file_multiblock_read_count & db_block_size parameters   October 4, 2005 - 11am Central time zone
Reviewer: Anto from CT,USA
Do all Full Table Scans at the maxium io rate possible for the system, irrespective of the settings 
for db_file_multiblock_read_count  & db_block_size           

 


Followup   October 4, 2005 - 4pm Central time zone:

10gr2 - "self tuning" setting for that.

or just set db_file_multiblock_read_count high? 

4 stars Some estimate of time remaining   October 4, 2005 - 12pm Central time zone
Reviewer: Anto from CT, USA
Some way of determing the time remaining time for operations like Nested Loop (based on the 
statistics available with the optimizer), even if they are not accurate (if stats are not uptodate)

Similar to what we have for long operations like Full table scan, fast full index scan / hash join 
etc 


4 stars How about a column name   October 4, 2005 - 12pm Central time zone
Reviewer: Ian from Amsterdam
It would be nice to be told the column name when you get an ORA-01401: inserted value too large for 
column. 


Followup   October 4, 2005 - 5pm Central time zone:

ops$tkyte@ORA10G> select * from v$version;
 
BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.1.0.4.0 - Prod
PL/SQL Release 10.1.0.4.0 - Production
CORE    10.1.0.4.0      Production
TNS for Linux: Version 10.1.0.4.0 - Production
NLSRTL Version 10.1.0.4.0 - Production
 
ops$tkyte@ORA10G> @test
 
Table dropped.
 
 
Table created.
 
insert into t values ('xxx','xx')
                      *
ERROR at line 1:
ORA-12899: value too large for column "OPS$TKYTE"."T"."X" (actual: 3, maximum:
2)
 
 
insert into t values ('xx','xxx')
                           *
ERROR at line 1:
ORA-12899: value too large for column "OPS$TKYTE"."T"."Y" (actual: 3, maximum:
2)
 

4 stars ASM - even more intelligence   October 4, 2005 - 1pm Central time zone
Reviewer: Jim from Portland, OR, USA
Automatic Storage management is nice but it goes on the assumption that raw IO times and available 
size of each mount point are equal.  Two issues here:

1. If you have two mount points with unequal disk acess times (eg 1 with 10,000 RPM disks and one 
with 15,000 PRM disks) and you use them as one ASM file system.  You are going to have unusual 
performance characteristics.  Yes, the advice is that you shouldn't do that or you should have two 
files systems. (one for the 10K disks and one for the 15K disks).  However, the reality is that 
over time it becomes difficult to do that.

2. Mount points of uneven size.  ASM really wants mount points that are the same size.  It wants to 
spread the data evenly over the mount points.  Again, on a brand spanking new system you would want 
to set things up this way.  As things age, the data bits age into their 40's and their waist lines 
expand, taking up moore room. (just kidding)  So another mount point gets added that is much 
larger.  Now you have a situation that is similar to situation#1.  Potentially uneven access.


It would be nice to "environmentally tune" ASM.  It should know what the IO patterns are and what 
the disk characteristics are over time. (how fast different types of reads and writes occur over 
time.)  It could then make a better allocation of data over the mount points to optimize data 
access.  It would have to take into account segment access, frequency and volume also.

This would not be a trivial piece of work and you might not want ASM to always be that smart.  But 
I envision that a simple parameter could activate it or not.  drum roll please.... _fast=true

(grin) 


Followup   October 4, 2005 - 5pm Central time zone:

1) that would be a "don't put them into the same diskgroup" yes.  but that would be true OF ANY 
volume manager.

2) no it doesn't?  it just wants disk, as much as you want to give it.  I don't understand that 
comment?

 

5 stars What to send up the chain   October 4, 2005 - 2pm Central time zone
Reviewer: Bob B from Albany, NY
I was reading on the "Creating Passionate Users" site about 37 signals and their sort of mantra on 
customer requests.  If something's really important, people will keep bringing it up.  So far, the 
big one I'm seeing is increasing the length of object names.  I think many situations have come up 
where a (slightly) longer name for a constraint or index would make it self-documenting.  Or maybe 
leave object names as they are and allow all objects to be commented on?  *shrug* 


5 stars Improve sqlplus editing   October 4, 2005 - 4pm Central time zone
Reviewer: Jack from Kansas City, MO USA
Add editing and history functionality, similar to Korn shell editing, to sqlplus. I'm fortunate in 
that I work on HP-UX, which has the ied utility. I go into sqlplus using the "ied sqlplus" command, 
which gives me shell-like editing and history functions. It's much easier to use than the existing 
sqlplus editing commands, and I can retrieve commands from history using ESC-k.  


Followup   October 4, 2005 - 8pm Central time zone:

(that is rlwrap to the rest of us ;) 

5 stars Continuing gripes   October 4, 2005 - 4pm Central time zone
Reviewer: Bill C. from Houston, TX
First, kudos to Oracle for making the DB much better and not screwing up too much in the process. I 
don't know about you, but it seems that up until 8.1.6, my life revolved around waiting for the 
next patchset. But not since then. 8.1.7.4 was pretty good. 9.2.0.7 is looking pretty stable as 
well. I especially congratulate the team that finally allowed me to use records and arrays of 
records in DML and bulk DML. I had been waiting on pins and needles for that since '94.

Now, for a few gripes, some of which should have been improved eons ago.

1) Losing track of the point of error if you dared to use error handling. I understand this is 
sort-of fixed in 10g if you parse the output of the new backtrace function. But it still shouldn't 
be so complex to get the current line number, or the line number of the offending code when 
throwing an error. It should be a built-in, like
   l_line := DBMS_UTIL.current_line_num;
   OR
   l_line := DBMS_UTIL.point_of_error(stacklevel => 1);


2) Not being able to programatically determine what the name is of the currently executing routine. 
Sorry Tom, last time I tried "whoami" deep within some packaged calls, it just didn't cut it. 
Having to parse strings to get that info is ridiculous. It should be a built-in, like
   l_pkg_nm := SELF.package_name;
   l_fqn := SELF.fully_qualified_name;
   l_routine := SELF.current_routine;

3) Being constrained by an old-world 30 char limit to object names. I can live with uppercase only, 
but I really need 128 or 256 for identifiers.

4) No alphanumeric datatype somewhere between the extremes of 4000 and 4GB. Even lowly Access has 
this requirement nailed. Can't we have a datatype, or simply expand VARCHAR2, to allow text up to, 
say 1MB in a column? While we're on datatypes, I type VARCHAR2 so many times in my workday, it 
would help my weary fingers to introduce a new name for VARCHAR2, say VARC, or STR, which 
transparently compiles (and so is backwards compatible) to VARCHAR2 under the covers.

5) Everything else is being pushed and encouraged to dump LONG and LONG RAW in favor of CLOB and 
BLOB, why not Oracle internal tables? They cause me a good deal of grief when attempting certain 
impact analysis and comparisons across links. I have to jump through a lot of hoops to get around 
them. (Thanks to Vladimir for the reminder).

6) Dependent item Recycle Bin. Too often I or one of the DBAs gets a little too busy or rattled and 
drop a table, inadvertently losing grants or triggers that we forgot to check for first. Of course 
there are processes and tools to prevent that, but it would be sweet if there were a built-in 
facility to either a) given a table name, produce a drop script that captures the recreate scripts 
for the automatically-dropped dependent items, or b) a recycle bin that would contain the recreate 
DDL for items that disappeared when the table dropped. On a similar note, if option (a) were 
attempted, I'd love to see it generate the commands required to drop and recreate all the dependent 
foreign keys pointing to the table being dropped. 


4 stars   October 4, 2005 - 5pm Central time zone
Reviewer: Anto 
" Do all Full Table Scans at the maxium io rate possible for the system, 
irrespective of the settings for db_file_multiblock_read_count  & db_block_size  
         

Followup:  
10gr2 - "self tuning" setting for that.

or just set db_file_multiblock_read_count high? 
 "

We don't want to reduce the cost associated with Full table scan , thereby favoring more Full Table 
Scans - The cost should be the same irrespective of this init.ora. But whenever a full table scan 
is chosen by the optimizer, it has to be done at the max. i/o rate possible for the system, 
irrespective of the values for db_block_size and 
db_file_multiblock_read_count 


Followup   October 4, 2005 - 8pm Central time zone:

but then the cost (he says) should be set appropriately for that Max IO size - meaning - you 
already got it, if you want to use the max IO size - use it, the cost will be the cost.

I'm confused? 

4 stars No Longer Names !!!!!   October 4, 2005 - 6pm Central time zone
Reviewer: Andrew from m
30 characters is plenty long enough for me.  If the developers I support could make longer names 
the would and that means that I would have to type in names upto 128 chars.  NO THANKS!    For 
those of you who use the point-n-click tools to manage your databases, you do not care how long the 
names are but us command like commandos do.  In fact, our standards limit table names to 25 
characters, so there is enough room to add _PK, _IDX1, etc.  We use short name conventions when we 
make compound names.  If you had longer name space, all you would do is end up complaining that you 
need more because of the compounding of longer names into even longer compound names.

I hate the idea of trying to read columns of data about tables, constraints, etc where the names 
are 128 char wide and wrapped into two or three lines.  Ouch.
 


5 stars Compress subpartition?   October 4, 2005 - 8pm Central time zone
Reviewer: Quadro from Russia
It's 2005 and 10G Release 2.

And we still can't compress subpartitions! 


Followup   October 4, 2005 - 9pm Central time zone:

sure you can???  You cannot compress an "indvidual" subpartition but subpartitions can be 
compressed (at the partition level, all of them are - or not)


ops$tkyte@ORA9IR2> CREATE TABLE t1
  2  (
  3    dt  date,
  4    x   int,
  5    y   varchar2(25)
  6  )
  7  PARTITION BY RANGE (dt)
  8  subpartition by hash(x) subpartitions 8
  9  (
 10    PARTITION part1 VALUES LESS THAN (to_date('13-mar-2003','dd-mon-yyyy')) ,
 11    PARTITION part2 VALUES LESS THAN (to_date('14-mar-2003','dd-mon-yyyy')) ,
 12    PARTITION junk VALUES LESS THAN (MAXVALUE)
 13  )
 14  /

Table created.

ops$tkyte@ORA9IR2> CREATE TABLE t2
  2  (
  3    dt  date,
  4    x   int,
  5    y   varchar2(25)
  6  )
  7  COMPRESS
  8  PARTITION BY RANGE (dt)
  9  subpartition by hash(x) subpartitions 8
 10  (
 11    PARTITION part1 VALUES LESS THAN (to_date('13-mar-2003','dd-mon-yyyy')) ,
 12    PARTITION part2 VALUES LESS THAN (to_date('14-mar-2003','dd-mon-yyyy')) ,
 13    PARTITION junk VALUES LESS THAN (MAXVALUE)
 14  )
 15  /

Table created.

ops$tkyte@ORA9IR2>
ops$tkyte@ORA9IR2> insert /*+ APPEND */ into t1
  2  select to_date('12-mar-2003','dd-mon-yyyy')+mod(rownum,4), rownum, rpad('*',25,'*')
  3    from all_objects;

30733 rows created.

ops$tkyte@ORA9IR2> insert /*+ APPEND */ into t2
  2  select to_date('12-mar-2003','dd-mon-yyyy')+mod(rownum,4), rownum, rpad('*',25,'*')
  3    from all_objects;

30733 rows created.

ops$tkyte@ORA9IR2> commit;

Commit complete.

ops$tkyte@ORA9IR2>
ops$tkyte@ORA9IR2> exec dbms_stats.gather_table_stats( user, 'T1' );

PL/SQL procedure successfully completed.

ops$tkyte@ORA9IR2> exec dbms_stats.gather_table_stats( user, 'T2' );

PL/SQL procedure successfully completed.

ops$tkyte@ORA9IR2>
ops$tkyte@ORA9IR2> select table_name, blocks, empty_blocks from user_tables where table_name in ( 
'T1', 'T2' );

TABLE_NAME                         BLOCKS EMPTY_BLOCKS
------------------------------ ---------- ------------
T1                                    268            0
T2                                    128            0



table is full of subpartitions and they are compressed... 

5 stars About subpartition compression   October 5, 2005 - 1am Central time zone
Reviewer: Quadro from Russia
Ok, thank you Tom, it's my fault - i should me more specific.

Consider: you loading data into table partition during month. In the end of the month you do alter 
table move partition compress - to compres it content.

With list subpartitions you cannot do that.

SQL> create table test
  2  (
  3   dt date,
  4   lst number
  5  ) partition by range (dt)
  6  subpartition by list (lst)
  7  subpartition template
  8  (
  9   subpartition t1 values (1),
 10   subpartition t2 values (2),
 11   subpartition t3 values (3)
 12  )
 13  (
 14   partition test values less than (maxvalue)
 15  );

Table created.

SQL> insert /*+ append */ into test select created, mod(rownum,3)+1 from all_objects;

51816 rows created.

SQL> commit;

Commit complete.

SQL> alter table test move partition test compress;
alter table test move partition test compress
                                *
ERROR at line 1:
ORA-14257: cannot move partition other than a Range or Hash partition


SQL> alter table test move subpartition test_t1 compress;
alter table test move subpartition test_t1 compress
                                           *
ERROR at line 1:
ORA-14160: this physical attribute may not be specified for a table
subpartition 


Followup   October 5, 2005 - 7am Central time zone:

just alter table test move subpartition??  The subpartition already has the compressed attribute.  
It is inherited from the TABLE or PARTITION attribute


ops$tkyte@ORA9IR2> CREATE TABLE t1
  2  (
  3    dt  date,
  4    x   int,
  5    y   varchar2(25)
  6  )
  7  PARTITION BY RANGE (dt)
  8  subpartition by hash(x) subpartitions 8
  9  (
 10    PARTITION part1 VALUES LESS THAN (to_date('13-mar-2003','dd-mon-yyyy')) ,
 11    PARTITION part2 VALUES LESS THAN (to_date('14-mar-2003','dd-mon-yyyy')) ,
 12    PARTITION junk VALUES LESS THAN (MAXVALUE)
 13  )
 14  /

Table created.

ops$tkyte@ORA9IR2>
ops$tkyte@ORA9IR2> insert /*+ APPEND */ into t1
  2  select to_date('12-mar-2003','dd-mon-yyyy')+mod(rownum,4), rownum, rpad('*',25,'*')
  3    from all_objects;

30702 rows created.

ops$tkyte@ORA9IR2>
ops$tkyte@ORA9IR2> exec dbms_stats.gather_table_stats( user, 'T1' );

PL/SQL procedure successfully completed.

ops$tkyte@ORA9IR2> select table_name, blocks, empty_blocks from user_tables where table_name = 
'T1';

TABLE_NAME                         BLOCKS EMPTY_BLOCKS
------------------------------ ---------- ------------
T1                                    268            0

ops$tkyte@ORA9IR2>
ops$tkyte@ORA9IR2> alter table t1 compress;

Table altered.

ops$tkyte@ORA9IR2>
ops$tkyte@ORA9IR2> begin
  2          for x in ( select * from user_tab_subpartitions where table_name = 'T1' )
  3          loop
  4                  execute immediate 'alter table t1 move subpartition ' || x.subpartition_name;
  5          end loop;
  6  end;
  7  /

PL/SQL procedure successfully completed.

ops$tkyte@ORA9IR2>
ops$tkyte@ORA9IR2> exec dbms_stats.gather_table_stats( user, 'T1' );

PL/SQL procedure successfully completed.

ops$tkyte@ORA9IR2> select table_name, blocks, empty_blocks from user_tables where table_name = 
'T1';

TABLE_NAME                         BLOCKS EMPTY_BLOCKS
------------------------------ ---------- ------------
T1                                    128            0
 

5 stars Followup ...   October 5, 2005 - 3am Central time zone
Reviewer: Clemens from Vienna, Austria
@Tom: 

we do allow for different languages 
plsql
C
java --> yes, but you still need PL/SQL as foundation. But that's fine with me. Now to the python, 
perl, ... whatever integration. ;-)
 
and in 10gr2 - CLR languages on windows 

So what about mono support on the *[IU]X platforms?

@Andrew from m 

Short column/table-names, why not. But finding "artificial" names for objects such as foreign keys, 
where it would be nice to know the relationships between tables _and_ columns by reading its name. 

As a side note: I'm using both "point'n'click" (for DB model desing) and command line tools, and 
I'm well aware of the misuse of long names. Brings us to another issue: 



How about tab completion (such as in bash, zsh, etc.) in sqlplus for object names, etc.? Don't 
think that rlwrap helps you there. [1]

C.

[1] Workaround for me right now is vim with dbext plugin. 


5 stars Re: Queue DDL statements.   October 5, 2005 - 4am Central time zone
Reviewer: Sai from San Jose, CA USA
Connor,

Thanks for your tip. It seems this feature "DDL_WAIT_FOR_LOCKS" was added in 10g release 1. But, I 
can't get it to work, any clues?

SQL> alter session set DDL_WAIT_FOR_LOCKS=true;

Session altered.

SQL> alter table test add sai_ddl number;
alter table test add sai_ddl number
*
ERROR at line 1:
ORA-00054: resource busy and acquire with NOWAIT specified


SQL> show rel
release 1001000200

Thanks,
 Sai. 


Followup   October 5, 2005 - 7am Central time zone:

It is an unimplemented feature that was erroneously documented in 10gr1 and removed in 10gr2 (from 
the docs) 

5 stars   October 5, 2005 - 5am Central time zone
Reviewer: Alberto Dell'Era from Milan, Italy
> It seems this feature "DDL_WAIT_FOR_LOCKS" was added in 10g
> release 1. But, I can't get it to work, any clues?

metalink - doc id 660901.999 "DDL_WAIT_FOR_LOCKS=TRUE has no effect" seems to offer a possible 
interpretation:

<quote>
Got response from the TAR and Oracle told me the following:

"It has been confirmed that this is a documentation bug. This feature has not yet been implemented 
and it is not being implemented in the next release of
Oracle either." 
</quote> 


5 stars ddl_wait_for_locks   October 5, 2005 - 5am Central time zone
Reviewer: Connor from Perth
bug 4254209

From the description: 

"The parameter "ddl_wait_for_locks" is not used for anything in the code"

Charming...

Cheers
Connor 


5 stars ddl_wait_for_Locks   October 5, 2005 - 5am Central time zone
Reviewer: Connor from Perth
Sorry - should have also added some assistance.

You can simulate this with something like the below (untested):

declare
  n number := dbms_utility.get_time;
begin
 loop
   begin
     execute immediate 'alter table ...';
     exit;
   exception
     when others then
       if sqlcode = -54 then
         if dbms_utility.get_time - n > 60*100 then
           raise;
         else
           dbms_lock.sleep(0.1);
         end if;
       else
         raise;
       end if;
   end;
 end loop;
end;

which will repeatedly try the DDL in 1/10th second intervals for up to 60 seconds.

hth
Connor 


5 stars Actually for me, most things have already been mentioned   October 5, 2005 - 6am Central time zone
Reviewer: Bob from Troy NY. USA
I actually like most of Oracle!
But the things I'd change would be to simplify some of the things that I've needed to do regularly 
withing commands or packages.

alter table t rebuild online tablespace x;

instead of db redef package. Have it auto rebuild the indexes in place. Simplify it to just do 
that.

SQLPlus grid results. 90% of the reason people use Toad or PLSQL developer is just to issue queries 
when developing. It's way easier to look at a table with 50 columns in those tools than sqlplus. 

30 char limit for object names. Too small today. 


5 stars re: improved SQL*Plus   October 5, 2005 - 8am Central time zone
Reviewer: A reader 
if all these wishes for an enhanced SQL*Plus will get implemented may be this program then could be 
renamed to "UFI" (user friendly interface)

;-)

oups
 


5 stars I'll add my vote   October 5, 2005 - 9am Central time zone
Reviewer: Heath from Alabama, USA
Just agreeing with the earlier comments that Raptor would recognize the fact that database 
developers have their PL/SQL source code in a version control system, too.  Let us check those 
files out, edit the text file locally, and then be able to compile and debug based on that local 
file.  Expecting the user to just pull the source from the data dictionary and edit it doesn't cut 
it.  In a collaborative development environment, I can't trust the source in the database.  I do 
trust the code in the source code system.

For Robert, the free JDeveloper doesn't allow this either.  It expects you to edit from source in 
the database.  (If I'm wrong, feel free to tell me how to do this.)

Please let me not have to develop using PLSQL Developer with its substandard debugger simply 
because that product allows me to work with local files.  I love the JDeveloper PL/SQL debugger and 
would be pleased to be able to use the JDeveloper IDE (or similar) to do my development as well. 


4 stars db_file_multiblock_read_count parameter   October 5, 2005 - 10am Central time zone
Reviewer: Anto from CT, USA
"Do all Full Table Scans at the maxium io rate possible for the system, 
irrespective of the settings for db_file_multiblock_read_count  & db_block_size  

         

Followup:  
10gr2 - "self tuning" setting for that.

or just set db_file_multiblock_read_count high? 
 "

We don't want to reduce the cost associated with Full table scan , thereby 
favoring more Full Table Scans - The cost should be the same irrespective of 
this init.ora. But whenever a full table scan is chosen by the optimizer, it has 
to be done at the max. i/o rate possible for the system, irrespective of the 
values for db_block_size and 
db_file_multiblock_read_count 


Followup:  
but then the cost (he says) should be set appropriately for that Max IO size - 
meaning - you already got it, if you want to use the max IO size - use it, the 
cost will be the cost.

I'm confused? 
 
"

Hi Tom,

Here is my understanding of the parameter - db_file_multiblock_read_count 

Correct me if I am wrong.

If this parameter db_file_multiblock_read_count  is set too high to say 128 or 256 or more, more 
and more  SQLs which were using indexes before, will start using full table scans, since we are 
reducing the cost of FTS, by increasing the value for this parameter.

If this parameter is set too low, to say 4 or 8 or 16, then more and more SQLs(which were using FTS 
before) will start using indexes,since the cost of FTS is high, due to low value for this 
parameter. But even with this low value for db_file_multiblock_read_count parameter , there will be 
a few SQLs which will still be using the FTS(full table scan) at a max. i/o rate of 
db_file_multiblock_read_count* db_block_size (which will be low, due to low value for 
db_file_multiblock_read_count  parameter) . Ideally those SQLs which are still using FTS, should do 
the FTS at the maximum i/o rate possible for that system instead of doing the FTS at 
db_file_multiblock_read_count* db_block_size(which will be low due to low value for  
db_file_multiblock_read_count parameter) 


Followup   October 5, 2005 - 11am Central time zone:

but the cost of the full scan at the MAX IO SIZE is the cost of the full scan at the MAX IO SIZE.

What you are really asking for is a parameter to set the "full scan cost", not a parameter to muck 
with the IO size.


You really DO reduce the cost of the fts by increasing the multi-block read count see -- you really 
do, so you either want the cost we are going to use or not.


you set it to the max io size (settings above that don't count, it doesn't care if you set it 
really high, it adjusts) and that -- that is the COST of a full scan.


You have two different concepts going here.  Perhaps you want to look at system statistics (so we 
know the cost of multi versus single block IO) and the optimizer_index_* parameters. 

5 stars Good thread here   October 5, 2005 - 10am Central time zone
Reviewer: Jim Tommaney from Dallas, TX USA
1.) If this can be done and not impact concurrency: 

create sequence seq_1;
alter table t_1 
    add constraint sk_1 sequence  (c_1 ) 
    references seq_1{.last_number}; 

Anyone who's dealt with thousands of sequences and hundreds of developers will appreciate the 
documentation aspect of this.  

2.)  I agree with the non-context-switching-function-like-thing suggested by Gary from Sydney. This 
would go a long way toward cleaning up some really tangled string manipulation.   

3.)  Cursor_sharing (nn ) approach, get sharing behavior when the number distinct literal values 
goes above the parameter value.    

NAME                        DESCRIPTION
cursor_sharing_threshold    re-write literal value to bind  when literal exhibits > nn distinct 
values


Thanks - Jim T
 


5 stars Yikes   October 5, 2005 - 10am Central time zone
Reviewer: Scot from Jacksonville
This is a great thread, and there are some good suggestions here.  But also some really bad ones, I 
trust that close scrutiny will be paid to all comments :)
 


Followup   October 5, 2005 - 11am Central time zone:

;)  indeed, I have my own filters. 

5 stars   October 5, 2005 - 11am Central time zone
Reviewer: User from Boston, MA USA
I would like to get an error message like "Object does not exist" while creating a synonym, if the 
object does not exist. 


5 stars column specific errors (part2)   October 5, 2005 - 11am Central time zone
Reviewer: Igor from France
Yes, sorry, I wrote from top of my head. Actually 1401 with a lot of values is sometimes not easy 
to find:
SQL> insert into t values ( 'ABC' );
insert into t values ( 'ABC' )
                        *
ERROR at line 1:
ORA-01401: inserted value too large for column

 


4 stars more on binds   October 5, 2005 - 11am Central time zone
Reviewer: Niall Litchfield from Hants,UK
wow - this thread grew a bit in the last few days... 

Not sure if this belongs here or in a blog entry. 

"Niall, 

you won't lose friends by expressing lucid opinions based on your experiences... " 

Hey, I know that. Just overstating again. 

"But on the bind thing - you and I see opposites I think.  Maybe - when I come to 
the UKOUG - you can sit in on my "all about binds" session "  

It's on my agenda already. I don't think we are actually on opposites (at least as far as 
understanding goes). 

"
the first time around, "where pk = 10" is not any different from "where pk = 
:b1"

Even on the 1000th time, "where pk = 10" is not any different from "where pk = 
:b1"

However, you don't tend to submit "where pk = 10" 1000 times, you tend to do it 
once and it must be compiled (hard parsed)


so, it is the difference between:

where pk = 10
where pk = 11
....
where pk = 10000
where pk = 10001
...
where pk = .............


and 

where pk = :b1



Think about a developer writing a SUBROUTINE for each unique set of inputs and 
calling them: " 

What you describe is how it *is* in Oracle, given how Oracle works binds are just so, so important. 
The fact is though that developers, and more particularly sql generators have a real hard time 
getting binding right. I guess what I am saying is that, given the nature of apps, I'd like Oracle 
to behave like CURSOR_SHARING=<FORCE> by default (only without the bugs :(). i.e that writing code 
like 

select col from tab where pk =||x (ie string concatenation)
 
resulted in nice straightforward sharable code. Microsoft's SQL server has done this for a while 
now. 

I guess what I am probably saying is that developers and sql generators don't and won't bind (and 
we maybe can't teach them better) I'd like it if Oracle didn't suffer so much as a result. 

Incidentally I agree with Connor for some reason I can easily see persuading developers to insert 
hints to make up for their lack of proper coding. Never will get that mentality.  





 


Followup   October 5, 2005 - 11am Central time zone:

MS SQL Server doesn't have the concept of shared sql at all.  It cannot be doing it "nicely" :) 

5 stars exp/imp specifics & LOBs   October 5, 2005 - 11am Central time zone
Reviewer: Igor from France
Even in 9.2, after quite a few releases with LOBs, when you change tablespace during import, LOB 
storage is not done automaticaly, as "normal" storage for tables and indexes. So that you should 
use indexfile, edit, create, import etc. 


 


Followup   October 5, 2005 - 11am Central time zone:

data pump.  have you looked at that in 10g. 

5 stars Follow up for Tom and/or Connor   October 5, 2005 - 11am Central time zone
Reviewer: Robert from Memphis, USA
Hello Tom or Connor,

Connor said the following in his list of suggestions...

=========================
3) "10046 level 16"

logical IO's dumped to trace file.  (I know there are other means of doing this 
but be nice to have it all under 10046)
=========================

Could you please explain exactly how we can trace logical I/O's (8i and 9i).

Thanks!

Robert. 


4 stars not using binds in MS SQL Server   October 5, 2005 - 12pm Central time zone
Reviewer: Jim from Portland, OR, USA
MS actually would prefer you use binds for MS SQL Server.  (I suspect they would prefer you not use 
binds for Oracle <grin>.)  If you look at the SQL Server API it does prefer you use binds.  Years 
ago a colleage of mine wrote a drive to MS SQL Server (prior to ODBC existing) and used binds.  It 
was a lot faster than not using binds.

The code generators that don't use binds have lazy or ignorant developers.  The recommendation of 
the use of binds hasn't changed since at least Oracle 6, probably farther back than the birth of 
some of the developers! 


4 stars   October 5, 2005 - 1pm Central time zone
Reviewer: Anto 
If we have enabled system stats, will the optimizer use the mbrc from that or will it be taken from 
db_file_multiblock_read_count of init.ora( if this parameter is set to a lower value in init.ora) ? 


Followup   October 5, 2005 - 1pm Central time zone:

system statistics tell the optimizer how expensive multi-block reads are and single block reads 
are.  


db_file_multiblock_read_count is used to perform the IO.

system stats do not "set" the multiblock read count, they report how long the multi block reads 
take. 

5 stars Follow up on Connor's comments   October 5, 2005 - 2pm Central time zone
Reviewer: Robert from Memphis, USA
Tom,

Connor said the following in his list of suggestions...

=========================
3) "10046 level 16"

logical IO's dumped to trace file.  (I know there are other means of doing this 
but be nice to have it all under 10046)
=========================

Could you please explain exactly how we can trace logical I/O's (8i and 9i).

Thanks!

Robert. 

 


Followup   October 5, 2005 - 3pm Central time zone:

via undocumented events. 

5 stars all about tracing   October 5, 2005 - 3pm Central time zone
Reviewer: Alberto Dell'Era from Milan, Italy
1) having in the STAT lines (and so in tkprof) the CBO estimates of the cardinalities, cost, temp 
space etc - basically what's in v$sql_plan.

Getting the real plan estimates by using "explain plan" is currently near to impossible - you have 
to reproduce the actual environment at parsing time (hard or impossible, eg think about 
workarea_size_policy=auto), you would have to know the bind variables values at bind variable 
peeking time (hard or impossible, not in the trace ... oh, yes, i was about to forget, explain plan 
doesn't peek ;). 
The only feasible way is to look at v$sql_plan, but the plan may have been invalidated or changed 
in the meanwhile, you should identify the correct child cursor, etc.

2) having an API to dump the STAT lines at will, not only at cursor closing time (that may never 
happen, think about PL/SQL cached cursors, or JDBC 3.0 cursor caching, for app using a connection 
pool or simply never closing the connection).

3) I "vote" for Connor's idea to have "logical IO's dumped to trace file". Excellent for statements 
that have the accessed blocks almost always cached in the buffer cache, eg that join a table to 
some lookup tables.

4) nice to have: tkprof using the same format of dbms_xplan.  


Followup   October 5, 2005 - 3pm Central time zone:

1) what about workarea_size_policy auto???  that it is on and the pga set to "x" is what decides 
the plan.  It is rather deterministic.

binds are in the trace if you ask for them.  and you would explain the query with the binds 
replaced by literals.

I find it is in general not near to impossible - but almost always obtainable - usually very easily 
obtainable (it would only be if the application did something to change it's environment).....


 

5 stars   October 5, 2005 - 4pm Central time zone
Reviewer: Alberto Dell'Era from Milan, Italy
> 1) what about workarea_size_policy auto??? 

And how can you be sure to be able to reproduce the PGA utilization at the moment of parsing ? 
Maybe the statement got parsed three days ago at 02:12 am ? Maybe at that time a series of batch 
session started, and allocated "most" of the PGA ?

> binds are in the trace if you ask for them. 

What if the plan got parsed before you enabled tracing, or parsed by another session 1millisecons 
before you (soft) parsed in your traced session ?

> you would explain the query with the binds replaced by literals.

And can you 100% sure that the CBO will generate the same plan in that case ? Say, you don't know 
that Thin Drivers in 9i don't peek, replace by literals, and get a different plan. 

But even assume that this isn't an issue, that you could theoretically reproduce the PGA 
utilization, the bind variables values at parsing (execution) time, and the environment. How can 
you you be sure that you won't commit a mistake - will you trust your generated plan by 100% ? 

If that were in the STAT lines - no uncertainty, you get the CBO estimates, in zero time. No 
errors, no mistakes possible - everything is there to see and diagnose. 


Followup   October 5, 2005 - 8pm Central time zone:

1) and do you have an example where it makes a difference?  :)

what matters is 

a) workarea was auto
b) pga aggregate target was set

Have you seen different plans for the same query?  What changes is the amount of memory given to a 
workarea....


true about the binds.



But - if the plans were "not" the same - it would be extremely apparent as well (and fairly rare).


The stat lines are reality - the guesses - that only comes from explain plans.  You would not want 
to do an explain plan per parse/execute. 

5 stars A couple more suggestions   October 5, 2005 - 5pm Central time zone
Reviewer: Justin from Michigan, USA
1) The ability to grant privileges to a particular user or role for all objects of a particular 
type in a particular schema, i.e.

GRANT SELECT ANY TABLE IN schema_owner TO read_only_role
GRANT EXECUTE ANY PROCEDURE IN schema_owner TO application_role

You can get the same effect today with a DDL trigger that grants privileges on the newly created 
objects, but having Oracle automatically handle this sort of maintenance would be nice.  

2) A SQL*Loader "create table" option.  If the data files are on the server, I can obviously use an 
external table, but if I'm doing a load from a client machine, it would be nice to avoid having to 
duplicate information in my control file into my CREATE TABLE statement.

3) You can't MERGE into a workspace enabled table (Workspace Manager). 


5 stars Events for these already exist   October 5, 2005 - 6pm Central time zone
Reviewer: A reader 
"2) having an API to dump the STAT lines at will, not only at cursor closing time"
"3) I "vote" for Connor's idea to have "logical IO's dumped to trace file"."

Seperate events for both of these already exist.  You can set multiple events in the same session 
and they will write into the same trace file (not that you would do this in any production 
environment). 


Followup   October 5, 2005 - 8pm Central time zone:

but events don't necessarily count - I talk about two of them (10046 and 10053), but wish I didn't 
have to - and with 10g, I can stop talking about 10046... 

4 stars Followup on IAN's comments   October 5, 2005 - 9pm Central time zone
Reviewer: Madhava Reddy from NJ,USA
The column name is not being specified for number datatype:

madhava@MADHAVA>drop table test
  2  ;

Table dropped.

madhava@MADHAVA>create table test(x number(3,2),y varchar2(2));

Table created.

madhava@MADHAVA>insert into test(x,y) values(123.23,'xx');
insert into test(x,y) values(123.23,'xx')
                             *
ERROR at line 1:
ORA-01438: value larger than specified precision allowed for this column


madhava@MADHAVA>insert into test(x,y) values(1,'test');
insert into test(x,y) values(1,'test')
                               *
ERROR at line 1:
ORA-12899: value too large for column "MADHAVA"."TEST"."Y" (actual: 4, maximum: 2)


madhava@MADHAVA>begin
  2  insert into test(x,y) values(123.23,'xx');
  3  end;
  4  /
begin
*
ERROR at line 1:
ORA-01438: value larger than specified precision allowed for this column
ORA-06512: at line 2


madhava@MADHAVA>begin
  2  insert into test(x,y) values(1,'test');
  3  end;
  4  /
begin
*
ERROR at line 1:
ORA-12899: value too large for column "MADHAVA"."TEST"."Y" (actual: 4, maximum: 2)
ORA-06512: at line 2

Will this be done in the next release? 


5 stars "but events don't necessarily count"   October 5, 2005 - 9pm Central time zone
Reviewer: Connor from Perth
which is precisely why 'alter session' is a terrible terrible privilege to grant to anyone in a 
production system 


5 stars Re: Follow up on Connor's comments   October 5, 2005 - 10pm Central time zone
Reviewer: Sai from San Jose, CA USA
Robert,

To get the dump of logical I/O's performed for any sql statement, you can use 10200 event in Oracle 
8i. But you can check v$bh to see what buffer blocks are cached and x$bh to see which buffers were 
touched when.

Connor, is that the event you meant to get logical I/O dump?

Thanks,
 Sai. 


5 stars "but events don't necessarily count"   October 6, 2005 - 12am Central time zone
Reviewer: A reader 
How often are you going to do this?  Should there be a reason that 10046 is not enough, then maybe 
in development or even in a performance test lab.

I just see the need for this as being sooooo remote, I ask why having this as an event is not "good 
enough"???  99% of the time, the database does what it was meant to do and it does it extremely 
well.  I am just happy that Oracle even gives you the ability to enable a event that will dump out 
this detailed information (granted, it would be nice if Oracle was a little more public about some 
of the events outside 10046 and 10053).

Just my $.02 


Followup   October 6, 2005 - 7am Central time zone:

should there be a reason 10046 is not enough?

Absolutely, for every developer should be using it every day and in every way.  dbms_monitor in 10g 
takes case of it for us in a documented, accessible, safe fashion.


Events are not documented, will not be documented as far as I know.  That is why they are not good 
enough. 

4 stars online rename datafiles   October 6, 2005 - 5am Central time zone
Reviewer: steen bartholdy from denmark
I would like to :
alter database rename file X to Y *online* ;
all files preferred : capacity : datafile, 
easy of usage controlfiles to !
backup online
create copy online
but switch online, naaah
or have I missed something here ?
 


Followup   October 6, 2005 - 7am Central time zone:

alter database rename file X to Y *online* ;

that doesn't make sense??


'switch online'?? don't understand. 

4 stars Adding constraints/Columns etc.   October 6, 2005 - 6am Central time zone
Reviewer: Bipul from london
My 2c.

1. Whenever a table structure is changed [ add a new column], this invalidates all the dependent 
stored pl/sql and also all the dependent cursors in shared pool. In an OLTP environment, where 
thousands of transactions/queries take place every minute by hundreds of session, this causes some 
issue. For example, most of the sessions will go in "library cache pin" or "library cahce lock" 
wait and the database appears to hang. I have noticed this from 8.1.7 to 10.1.0.4. This is not very 
helful in providing 24x7 uptime. Oracle support havn't provided any workaround for this so far.

2. Adding a constraint locks the parent table. Again, this causes issues in high transactional OLTP 
system. The lock time varies with the size of parent table. Often this results in some "timeouts".

It would be useful, if Oracle can address these issues as part of "high availablity" features.

Other bit I would like to be improved is Oracle support. I don't think [this is completely based on 
my experience] that Oracle Support puts a lot of effort in recreating and diagonising customer 
issues. Often they tell us to recreate it in our environment, whereas the problem can be easily 
recreated anywhere i.e. Oracle support's own environment. At times, it seems like they are after 
"closing the ticket" rather than "fixing customer issues" [ The last statement assumes that 
asktom.com is not part of Oracle support. In my opinion, to date this is most useful site for 
fixing oracle issues/gaining insight into issues and learning to do things so that we don;t bump 
into issues]

Thanks
bipul


 


Followup   October 6, 2005 - 7am Central time zone:

1) because upgrading an application is a hard nut to crack - think about it, you are patching or 
upgrading/updating an application - you are CHANGING it.  

2) same comment - you are upgrading.




As for support - I agree with their approach.  If you call and say "hey, my 500,000 line program 
fails - why" - they can do nothing.

If you call and say "hey, run this and what do you see", they can do something.

Developing a test case in most all cases is paramount - you see me do it all of the time, you see 
me demand it all of the time as well.  

no, this is not part of support as it is. 

5 stars cursor_sharing   October 6, 2005 - 6am Central time zone
Reviewer: Igor from France
And sometimes it would be handy to have "finer grained" cursor_sharing that could be handled when 
no application code could be changed and say "Hey, this part I want with FORCE, rest is OK". Based 
on tables or something similar... 


5 stars BLOBs   October 6, 2005 - 7am Central time zone
Reviewer: Igor from France
"data pump.  have you looked at that in 10g."
 
OK, but on systems that I touch are "still" mostly 9i. 
And correct me if I'm wrong, BLOB was, I think, introduced in 8.0 and in 9.2 this relatively basic 
thing does not work.

Also, in exp/imp context is a bit unusual that I could have problems exporting with exp 9.2.0.5 
from database 9.2.0.4.
I know that exists Metalink compatibility matrix and all this but it's a bit "counter-intuitive"

 


Followup   October 6, 2005 - 8am Central time zone:

exp/imp have no techniques for remapping tablespaces - unless you have the relatively simple 
"single segment object", the facility just didn't exist.

And I was just pointing out that what you ask for was added a couple of years ago.... 

5 stars CBO decision   October 6, 2005 - 7am Central time zone
Reviewer: Igor from France
Sometimes it would be nice to have CBO saying how "far" he is from changing execution plan or if 
second is pretty close... 


5 stars   October 6, 2005 - 7am Central time zone
Reviewer: Alberto Dell'Era from Milan, Italy
> 1) and do you have an example where it makes a difference?  :)

Not specific to pga_aggregate_target; anyway I've seen many plans in tkprof that I wasn't able to 
reproduce using explain plan. Call it my fault, perhaps I missed some "alter session" of the app, 
perhaps we were using 9i thin drivers and I wasn't clever enough to know that 9i thin drivers don't 
peek, whatever ... 

Having the estimated cardinalities, cost, temp space, etc in the STAT lines would leave no space to 
guessing, and would mean, *at the very least*, that you wouldn't need to spend time to reproduce 
the environment for explain plan.

> You would not want to do an explain plan per parse/execute. 

You need not, the infos are already there, in the kernel structures read by v$sql_plan, since hard 
parse time - you would just need to dump them in the trace file.  


4 stars Followup on your comment re: constraints/structure change   October 6, 2005 - 8am Central time zone
Reviewer: Bipul from london
<TK>
1) because upgrading an application is a hard nut to crack - think about it, you 
are patching or upgrading/updating an application - you are CHANGING it.  

</TK>

Upgrading an application is slightly different. We plan it/get some downtime etc. But in reality 
what happens is 

1. Managers/designers and stakeholders read about a development methodology called RAD [rapid 
application development].
2. They want to develop something using RAD very quickly with few tables. Get application online, 
and keep adding features to it. Adhoc, whenever they feel like.
3. Some of the enhancement/features require change in existing table, which has lots of rows, used 
by many stored procedures/cursors etc. And then we [DBA] hit this problem when we have to modify 
the table or add constraints etc.

I think we [IT industry in general]are spending less time in design. 

<TK>
As for support - I agree with their approach.  If you call and say "hey, my 
500,000 line program fails - why" - they can do nothing.

If you call and say "hey, run this and what do you see", they can do something.

Developing a test case in most all cases is paramount - you see me do it all of 
the time, you see me demand it all of the time as well.  
</TK>

I agree that developing a test case is important, but sometimes the problem is bleeding obvious and 
you don;t need few GB of data to reproduce it. For example, "library cache pin"/"library cache 
lock" issue in high transactional OLTP database can be recreated in support's environment.

I should add that sometimes [at least once I have noticed] Oracle changes functionality without 
putting that in release notes. For example XDB in 10g doesn;t support unicode characters > 255, and 
it does in 9i. This wasn;t listed anywhere in Oracle documentation. Support suggested to convert 
the database character set to UTF-8. Sure we can do that, thats pretty easy for a > 1TB database 
with loads of VARCHAR and CLOB that requires a 24X7 uptime !

Anyway, I think this thread is not about griping support issues. So I should stick with the product 
feature.

How about ability to rename schema? This will be useful in upgrades, so a sample upgrade process 
could be like

1. Clone schema,
2. Upgrade the cloned schema
3. rename original schema to something else.
3. Rename cloned schema to original schema.

It will save us the restore of original schema if upgrade fails.


Thanks
bipul 


Followup   October 6, 2005 - 9am Central time zone:

as for the upgrade - 

IF this is a mission_critical_system
   AND downtime is to be avoided
THEN
   you need to have a 'mainframe' mentality, for lack of a better term.
END IF



surprised no one else mentioned a schema rename yet ;) 

5 stars Support   October 6, 2005 - 9am Central time zone
Reviewer: Connor from Perth
Don't want to turn this into an anti-support rant because

i) compared with other product support knowledge bases, I rate Metalink as the benchmark by which 
all other pale

ii) being a support person must be a thankless job

but as a user of support for around 12 years, I would contend the quality has dropped significantly 
over the past few years.

(Hopefully my book content lends credibility to my statement) that I'm a real stickler for 
providing small, easy to run, cut-paste test cases - something I do in my TAR's, but even then 
there is so much drive by support analysts to

a) close your TAR asap (I assume they're measured on turnaround time)

b) resist any possibility that what you've described is a bug.

Cheers
Connor 


4 stars Is it possible to move datafiles online ?   October 6, 2005 - 9am Central time zone
Reviewer: steen bartholdy from denmark
I believe that in order to move a datafile you have to :
tablespace Tab offline;
alter database rename file X to Y;
tablespace Tab online;
If this is true then I want to move datafiles without taking the tablespace offline. 
And I would like to move controlfiles online as well. 
 


Followup   October 6, 2005 - 11am Central time zone:

and like I said - to me that does make sense - you have to MOVE the file, meaning the file is in 
two locations..... 

4 stars Hints   October 6, 2005 - 9am Central time zone
Reviewer: DaPi from Geneva Switzerland
Any chance of a warning diagnostic from SQL+ for incorrectly formated hints?  (yes, I know, better 
not use them, but . . . . )  Currently you don't know if it made no difference or if you got the 
format wrong. 


5 stars Excellent DaPi   October 6, 2005 - 9am Central time zone
Reviewer: A reader 
Of course you only mean the good hints 


5 stars Like it Dapi   October 6, 2005 - 10am Central time zone
Reviewer: padders from UK
Perhaps a small section in the DBMS_XPLAN.DISPLAY output (as for predicates) to indicate what hints 
were applied to which operation etc. 


5 stars Split user / schema, anyone?   October 6, 2005 - 10am Central time zone
Reviewer: Clemens from Vienna, Austria
> Tom: surprised no one else mentioned a schema rename yet ;) 

I wouldn't mind if you could create (and drop) users without corresponding schemas (sometimes you 
only need them for logon/security issues) as seen in postgres. Get's a bit messy if you've got lots 
of users and you want to select a certain schema in one of those point'n'click tools.

C.  


4 stars   October 6, 2005 - 10am Central time zone
Reviewer: A reader 
The quality of Oracle support has indeed gone down over the years. The final answer from support in 
most of the cases - upgrade to the next version. In some cases, they don't even care to find out 
the exact bug we are hitting.

Metalink is quite good in itself and if I dont get the answer there,I would rather ask in 
asktom.oracle.com rather than raising a TAR with Oracle Support 


5 stars Context Switch   October 6, 2005 - 10am Central time zone
Reviewer: AndyN from Lebanon, OH USA
If I could change something about Oracle it would be the removal of the context switch between the 
PL/SQL engine and the SQL engine.  I have never been quite understood why this has to be there.  If 
the two engines were integrated together couldn't this be removed? 


Followup   October 6, 2005 - 12pm Central time zone:

plsql is a separate vm, just like java.

we did have a request above that seems neat -- sort of a "sql fuction" capability.

the overhead of calling sql from plsql or plsql from sql are fairly small - problem is, many people 
try to do it 1,000's of times and it ADDS up. 

5 stars   October 6, 2005 - 12pm Central time zone
Reviewer: Alberto Dell'Era from Milan, Italy
A schema SYNONYM would be dandy, to be able to repoint a schema as we do with tables.

create or replace schema synonym interface for schema1;

Users point to the "interface" schema and get redirected to schema1. Much transparent then "alter 
session set current_schema=schema1", could be retrofitted to existing applications with no 
modifications.

Or, the ability to be able to repoint a set of synonyms atomically and consistently:

create or replace synonym t for schema1.t, u for schema1.u .. 


Followup   October 6, 2005 - 12pm Central time zone:

yeah, let me chime in...


a create schema that is atomic (as it is) but supports everything....

an alter schema to go with it.


so that a group of DDL statements can be done together as an atomic unit of work.

Alberto - you just made this thread TIE that other recent thread and have dethroned it!  This is 
now the current "hot" one :) 

4 stars   October 6, 2005 - 2pm Central time zone
Reviewer: Anto 
Nice to know that a purely technical thread has come to the top. ;-)

Never in his wildest dreams would Alex have thought that his thread will become the hottest one in 
less than a week 


4 stars   October 6, 2005 - 2pm Central time zone
Reviewer: A reader 
Some dictionary view to list all the queries currently being parsed by the optimizer or does V$SQL 
or some other view, have this info ?

Even though parsing typically takes only msecs, there are cases where we had to wait for seconds or 
even minutes (for the parsing to complete) and to see the explain plan.  This happens when the 
optimizer_max_permutation is retained at its 8i default value of 80,000, even after you upgrade the 
database to 9i. The problem disappears if you reduce optimizer_max_permutation  by 1 to 79999

 


5 stars   October 6, 2005 - 3pm Central time zone
Reviewer: Alberto Dell'Era from Milan, Italy
> you just made this thread TIE that other recent thread

If technical threads draw more attention than political ones, there's still hope for the [Oracle] 
world ... 


Followup   October 6, 2005 - 6pm Central time zone:

Hey, the other thread *started* technical. 

5 stars   October 6, 2005 - 6pm Central time zone
Reviewer: Alberto Dell'Era from Milan, Italy
"alter table exchange SEGMENT including indexes"

Some uses:

1) you want to delete 90% of rows in a table - you just insert-select the other 10% in a twin table 
(or CTAS it), index, analyze, then exchange the segment(s) back.

Similar to ctas-drop old-rename, but without having to regrant privileges, recreate triggers, and 
invalidating depending cursors and packages.

2) segment reorganization - "alter table move" invalidates indexes, the technique above allows you 
to (re)build them on the "new" table while allowing concurrent reads of the "old" table.

You may also, say, reorder physically the rows of the table to decrease the clustering factor of 
one index.

3) 24x7 read interface tables 

We currently use this technique:
a) readers read from t
b) we prepare the new data image in the t_part, a table with a single partition identical to t
c) we exchange the table with the partition

NB I've tested that if a reader has a cursor opened on t, it can continue its fetching across the 
"exchange partition" - it reads the "old" image of the data (perfect read consistency!). 

The "exchange segment" would definitely make it easier to manage (no need to know about 
partitioning, same script to create the twin table, no need to maintain both t and t_part, etc). 


Followup   October 6, 2005 - 7pm Central time zone:

1) that would be an online redefine with a where clause - but it (as anything) will invalidate 
cursors, have to - plans are different, different data objects to query.

(so, online redefine with where clause is what you are asking for)

2) that is online redefine as it exists

3) careful, that is imperfect read consistency at best, strange things will happen when the space 
is reused.
 

4 stars commit other session's transactions   October 6, 2005 - 10pm Central time zone
Reviewer: Bobcat 
How about the ability to (force) commit other session's transactions? We can force rollback other 
session's transaction by killing the session, but no "force commit" capability.   


Followup   October 7, 2005 - 8am Central time zone:

never, I would never even consider running that one up the chain.  No way.

How dangerous is that. 

5 stars Just extending...   October 6, 2005 - 11pm Central time zone
Reviewer: Connor from Perth
To extend my initial one of "transactional truncate" and the later comments by others about atomic 
schema operations, I suppose we could generalise this to: transactional DDL facility.  Its 
something that some other databases can do.  It would be nice to be able to do (eg)

Task:
- create table
- insert into table select * from ...
- create index on table

and if the 'create index' fails, we rollback to the table never having existed.  It would make 
scripting of application installs very easy
 


Followup   October 7, 2005 - 8am Central time zone:

http://asktom.oracle.com/pls/asktom/f?p=100:11:::::P11_QUESTION_ID:48704116042682#49193332887224
we have that one above :) 

5 stars Re: Just extending.   October 7, 2005 - 4am Central time zone
Reviewer: Sai from San Jose, CA USA.
I disagree, transactional DDL rollback could compromise database integrity and introduce more 
failure paths. How many times application installs are done compared to the total number of 
database transactions?

Imagine a scenario where session 1 is running a transactional DDL script and another session is 
trying to modify data in a table which is being resolved through public synonym for this user, but 
the changes started taking place in a table with the same name just created by session 1. This may 
be avoided by not auto commiting data dictionary modifications after every DDL command, but it's 
like asking for something to be done in a hard way, which can be very easily achieved by other 
means. 


Followup   October 7, 2005 - 8am Central time zone:

No it wouldn't.

It would increase database integrity and reduce failure paths.




Imagine a scenario where by every night you load two tables with data.  You use two schemas to do 
this (I have just such a situation).

Now, after the data is loaded and validated and indexed and so on in schema1 - you need to repoint 
two synonyms or recreate two views to point to schema1 (from schema2 where yesterdays data was!)


create or replace synonym t1 for schema1.t1;
create or replace synonym t2 for schema1.t2;


We need those to be atomic, if a failure were to occur in between - that would be "bad", we'd be 
half pointing to yesterday and half pointing to today.


There are many other examples as well.  I'd love to have the ability to run a couple of related DDL 
statements together as an atomic unit of work - we already have the basic capability to do so:

http://download-east.oracle.com/docs/cd/B19306_01/server.102/b14200/statements_6014.htm#sthref5662
needs to be expanded. 

5 stars How cool is this!   October 7, 2005 - 9am Central time zone
Reviewer: Vladimir Andreev from Germany
That CREATE SCHEMA is so cool! Pity indeed that it only supports tables, views and grants.

My new thing learned about Oracle for today :-)
Is it new in 10gR2?
Never mind, I'll check the docs myself.

Thanks!
Flado 


Followup   October 7, 2005 - 8pm Central time zone:

it goes way back. 

4 stars   October 7, 2005 - 9am Central time zone
Reviewer: A reader 
So many suggestions in here that you need not conduct a brainstorming session again in Oracle corp. 
before releasing 11?  for the new features to be included  


Followup   October 7, 2005 - 8pm Central time zone:

yes, when it settles down (as it is beginning to) I will be developing a list to send on - alread 
have been asked to 

5 stars Doh!   October 7, 2005 - 10am Central time zone
Reviewer: Vladimir Andreev from Germany
Turns out CREATE SCHEMA has been around since at least Oracle8i, maybe even 7.3 for it is not 
mentioned in the "Getting to Know Oracle8i" guide:
http://download-west.oracle.com/docs/cd/A87860_01/doc/server.817/a76962/toc.htm#top
It's still cool, though :-)

Cheers,
Flado 


5 stars   October 7, 2005 - 10am Central time zone
Reviewer: David Aldridge http://oraclesponge.blogspot.com from Colorado Springs
>> There are many other examples as well.  I'd love to have the ability to run a couple of related 
DDL statements together as an atomic unit of work - we already have the basic capability to do so: 
<<

On a similar note I submitted an enhancement request for a new partitioned table operation in which 
a non-partitioned table can be added to a partitioned table as a new partition, kind of like:

i) add partition
ii) exchange partition with non-partitioned table
iii) drop non-partitioned table 

... but as a single operation for the purpose of simplicity of recovery from some kind of failure. 
However this ability to rollback beyond DDL commit points would also be a great advantage. 


3 stars More about commit other session's transactions   October 7, 2005 - 12pm Central time zone
Reviewer: Bobcat 
It should certainly be a privilege limited to the DBA role. But I really don't see how dangerous it 
can be, considering that we can rollback a transaction by killing the session. 


Followup   October 7, 2005 - 9pm Central time zone:

rolling back is always safe (as if never happened)

commiting from a distance is ALWAYS dangerous - you have no clue "where they are" 

5 stars   October 7, 2005 - 3pm Central time zone
Reviewer: Alberto Dell'Era from Milan, Italy
> 3) careful, that is imperfect read consistency at best, 
> strange things will happen when the space is reused.

Ok, but readers' selects end in at most 10 minutes, and after exchanging the partitions, we keep 
the "old" data, we don't truncate - next refresh happens after 24 hours.

Do you think we're safe here, since we don't "reuse space" while it's being read - or were you 
thinking about something else ?

TIA 


Followup   October 8, 2005 - 8am Central time zone:

you are *likely* safe if the space isn't reused, that is what I was thinking - if the space is 
reused....

although there are cases of dropped tables where even when the space isn't reused - there can be 
issues. 

3 stars how about alter table read-only   October 7, 2005 - 9pm Central time zone
Reviewer: andrew from ca, usa
How about an easy way to prevent any of insert/update/delete and maybe even select to a table?

alter table EMP enable/disable insert|update|delete|select(?);

Trying to control it through tablespaces, triggers, grants etc all have their limitations. 


Followup   October 8, 2005 - 8am Central time zone:

what limitation they have that this would not?

 

5 stars Re:how about alter table read-only   October 7, 2005 - 9pm Central time zone
Reviewer: Sai from San Jose, CA USA
You can achieve it through triggers. You can also control DML's on any table through object level 
privileges for other users. 


5 stars   October 8, 2005 - 12pm Central time zone
Reviewer: Alberto Dell'Era from Milan, Italy
Continuing on:
http://asktom.oracle.com/pls/asktom/f?p=100:11:::::P11_QUESTION_ID:48704116042682#49216618020078
> 1) online redefine with where clause is what you are asking for

Yes, please consider adding the request for a "where clause" on online reorganization into the Wish 
List.

Better than what I proposed, online redefine automates the index cloning too - cool.

And should be very easy to implement also - probably all the Oracle developers need is to add the 
user provided where clause to the MV.

Eh, with a bit of additional effort, the developers could also add to dbms_redefinition the 
automatic management of FKs as well, automating this technique you demonstrated here:
http://asktom.oracle.com/pls/asktom/f?p=100:11:::::P11_QUESTION_ID:4636779130376#6783811821076
> 2) that is online redefine as it exists

Correct, thanks - with the automatic management of FKs - would be heaven.

> 3) careful, that is imperfect read consistency at best

Ok, assuming that we don't reuse space and that your worries don't apply (no issues so far from 
production for my implementations of the "24x7 exchange table"), that's the only thing that would 
benefit from "exchange SEGMENT" :)

Two additional considerations on "exchange SEGMENT" - I think that
a) it would be easy to implement (a partition is a table in disguise, so the code is probably 
already there and already tested to destruction in production)
b) it would be a command very simple and very easy to understand, the main characteristics of good 
tools/bricks. 


5 stars optional row migration   October 8, 2005 - 5pm Central time zone
Reviewer: A reader from San Francisco
Allow row movement on non-partitioned heap tables.  When creating a heap table, if row movement is 
specified, then don't migrate rows by leaving a forwarding address.  Instead, if the row has to 
move, immediately move the row to a new address and update any indexes that are pointing to it. 


Followup   October 8, 2005 - 5pm Central time zone:

you mean update all indexes.... 

I'm not sure I like this.  why?  because it would "hide" the fact that you are migrating tons of 
rows.  I'd rather 

a) find out I had the problem
b) implement a fix for the problem

rather than masking the problem, hiding it - but negatively impacting the performance of 
modifications without being able to see it very easily. 

5 stars IOT physical guesses   October 8, 2005 - 6pm Central time zone
Reviewer: A reader from San Francisco
When creating an index on an IOT, have a "no physical guesses" clause.  If "no physical guesses" is 
requested, then the index won't contain physical guesses.

Physical guesses may be appropriate for DW. However, they're not as useful for busy OLTP.  For OLTP 
databases, dispensing with the physical guesses will make indexes smaller and more efficient. 


5 stars re: optional row migration   October 8, 2005 - 6pm Central time zone
Reviewer: A reader from San Francisco
> I'd rather 
>
> a) find out I had the problem
> b) implement a fix for the problem

Sometimes there is no good fix to prevent row migration, such as when the initial and final row 
sizes have a wide variability.  Quite common in our database.

> rather than masking the problem, hiding it - but 
> negatively impacting the performance of modifications 
> without being able to see it very easily. 

In general, rows are updated much less frequently than they are read.  I'd rather pay the one-time 
migration price during the update, rather than incur it every time the row is read thereafter.

Again, non-row migration would be optional.  The default setting would remain row migration.

 


Followup   October 8, 2005 - 8pm Central time zone:

still not convinced it'll make "my" top ten but I hear you. 

5 stars My whishes - new features of Oracle Database 11br   October 9, 2005 - 3pm Central time zone
Reviewer: Zlatko Sirotic from Croatia
My whishes - new features of Oracle Database 11br

A) PL/SQL

1. References between transient objects (instances of objects types) and (then) garbage collector

2. Generic classes (templates, generics) like in Eiffel, C++, Java 1.5
(PL/SQL was modeled after ADA 83, and ADA 83 has generic packages)

3. Multiple inheritance like in Eiffel (inner classes like in Java - no, please)

4. Design By Contract like in Eiffel (C++ / Java 1.4 assert is not enough)


B) Database

Better support for business rules in database

We need "What Not How: The Business Rules Approach to Application Development" (book by C.J.Date).
Rules Manager, a new feature for Oracle Database 10g Release 2, seems like good direction, but 
Oracle has Oracle Business Rules in Application Server too.
My motto is: "Thou shall not do in the Middle Tier, what thou could have done in the Data Tier" 
(Toon Koppelaars in "A first JDeveloper project: Choices made, lessons learned", Oracle World 
2002).


Regards,
Zlatko Sirotic
 


5 stars ... one mo' time ...   October 10, 2005 - 4am Central time zone
Reviewer: Clemens from Vienna, Austria
Keep coming back to this thread ... ;-)

I did an install [1] of 10g1/g2 SE on one of my linux boxes this weekend and did notice some 
things.

- why the memory check on 10g2 (with 1GB memory), what's the big difference to 10g1? Yes, I know 
about the "what's new" chapter, but 1GB???
- why the "bloat" in 10g2. ~ 860 MB on 10g1 vs. 1.2 GB on 10g2
- library hell: libaio for example, was not needed in 10g1, now it screws up my installation 
process on 10g2. Same goes for hard coded lib paths such as libstdc.so.5 [2]

These are all support issues. What I'm questioning is the concept of bloat SW, where everything 
plus the metaphorical coffee machine is included. Maybe 11g could become more like "lean and mean", 
such as 10g1 was/is, compared to 9i, at least from the size of the install CDs. Reduced memory 
consumption for small/medium servers would also be nice, since we're on the dawn of server 
virtualization/consolidation (again) - that is if Oracle is interested in the mass market of 
small/medium sized companies.

Aside from this, some more ideas on PL/SQL:

- Synonyms on Public Functions/Procedures inside Packages, anyone? (or did I miss that in the newer 
releases?)
- Already mentioned: variable IN lists with arrays. Table/Pipelined Functions is nice, but that one 
would save some coding.
- ALTER PROCEDURE/FUNCTION/PACKAGE MONITOR - so you could find dead/not used code in large 
applications.

C.

[1] The reason for my installation was to try out the c't db challenge - a web shop with 
1G/10G/100G data.

[2] I do only recall the xxxx_so.5 and /usr/lib path, even with LD_LIBRARY_PATH it did not consider 
the /usr/lib/libstdc++v3 into its relink stage. 


5 stars perl inside the database   October 10, 2005 - 9am Central time zone
Reviewer: Stefan from Switzerland
I'd love to have a perl interpreter inside the database, to be able to do something like 

CREATE OR REPLACE PERL SOURCE ....


Stefan 


4 stars Compressed table   October 10, 2005 - 9am Central time zone
Reviewer: Anto 
a) How about the table indexes still remaining valid after compressing a table - or is it already 
available in 10g ?

b) I remember at least in Oracle 8, Oracle optimizer does not take table stats into account for 
remote tables accessed through dblink, for deriving the explain plan of distributed queries. Is 
that the case still now ?

 


Followup   October 10, 2005 - 11am Central time zone:

a) with partitioned tables - yes...


ops$tkyte@ORA10G> create table t (object_id, object_name)
  2  partition by range(object_id)
  3  (
  4  partition all_data values less than(MAXVALUE)
  5  )
  6  as
  7  select object_id, object_name from all_objects;
 
Table created.
 
ops$tkyte@ORA10G>
ops$tkyte@ORA10G> create index t_idx on t(object_id);
 
Index created.
 
ops$tkyte@ORA10G>
ops$tkyte@ORA10G> select object_name, object_type, status from user_objects;
 
OBJECT_NAME                    OBJECT_TYPE         STATUS
------------------------------ ------------------- ----------
T                              TABLE PARTITION     VALID
 
T                              TABLE               VALID
 
T_IDX                          INDEX               VALID
 
 
ops$tkyte@ORA10G> alter table t compress;
 
Table altered.
 
ops$tkyte@ORA10G> alter table t move partition all_data update indexes;
 
Table altered.
 
ops$tkyte@ORA10G> select object_name, object_type, status from user_objects;
 
OBJECT_NAME                    OBJECT_TYPE         STATUS
------------------------------ ------------------- ----------
T                              TABLE PARTITION     VALID
 
T                              TABLE               VALID
 
T_IDX                          INDEX               VALID
 



b) the cbo always had the ability to use remote stats?  not sure what you mean. 

5 stars   October 10, 2005 - 12pm Central time zone
Reviewer: Anto 
a) "the update indexes"  option for "alter table .. move" works only for partitioned tables or is 
it available for ordinary tables as well ?

b) I thought that CBO in Oracle 8, never takes into account statistics on remote tables, for 
distributed or remote queries. That is the impression I got after opening a TAR, for some related 
issue, way back in 1999. So I was wrong.

thanks 


Followup   October 10, 2005 - 12pm Central time zone:

a) as stated "with partitioned tables - yes.."....


 

5 stars   October 10, 2005 - 12pm Central time zone
Reviewer: anto 
for (b) we were using Oracle Apps that time and hence we may have been using RBO instead of CBO

Thanks for confirming this

 


4 stars Re: how about alter table read-only   October 10, 2005 - 3pm Central time zone
Reviewer: andrew from ca, usa
> How about an easy way to prevent any of 
> insert/update/delete and maybe even 
> select to a table?
> 
> alter table EMP enable/disable insert|update|delete|select(?);
>
> Trying to control it through tablespaces, triggers, grants etc all have their 
> limitations. 
> 
> Followup:
> what limitation they have that this would not?

Altering the tablespace containing the table read-only hardly an acceptable way to control 
individual tables.
Creating (and dropping) triggers - or adding logic to triggers do do some lookup is messy and has 
overhead.
Grants are fine - as long as the app doesn't connect as the table owner.

Just a simple alter table command would be clean and any novice could understand it. 


4 stars Oracle optimizer, Stats and DB Links   October 10, 2005 - 7pm Central time zone
Reviewer: Gary from Sydney, Aus
"I remember at least in Oracle 8, Oracle optimizer does not take table stats into account for 
remote tables accessed through dblink, for deriving the explain plan of distributed queries. Is 
that the case still now ?"

Tables work fine. Views can be more complex because they don't have stats themselves and (at least 
up to 9iR2) the remote db doesn't do much in the way of 'resolving' the view to guess stats. Also, 
the remote db won't tell the local db about any indexes on the tables underlying the view. 
[Frankly, it would be pretty difficult for Oracle to do any of this. To be comprehensive about it, 
it would need to tell the originating database the view query, stats and index information for all 
the tables and non-oracle functions involved etc. And for that to really work, you'd probably need 
some closer tie-in between the versions of Oracle running on both databases.]

I've got some simple scripts demonstrating the issues :
http://igor-db.blogspot.com/2005/09/views-db-links-and-cbo.html
and
http://igor-db.blogspot.com/2005/09/views-db-links-cbo-and-indexes.html


5 stars some of my my wishes ...   October 11, 2005 - 3am Central time zone
Reviewer: Mauro Papandrea from Italy
1) SQL: currently it is not possible to manage db links for other users.
I should like something like this:
create/drop database link ... OWNER BY scott with a CREATE/DROP ANY DATABASE LINK privilege 

2) the possibility to use alias everywhere and not only in order by clause; it is a simple matter 
of search/replace that should be very easy to implement and would improve readability very much

3) a RESERVED_PROCESS init parameter to be used only for system account ( or with an additional 
privilege, even better ): when for some error the maximum number of process is reached even admins 
are no longer allowed to connect and the db gets kind of frozen

4) the possibility of seeing the value of bind variables on the fly and the environments of other 
sessions ( no way to see if a session altered some parameters )

5) as of 9i it is possible remove datafiles when dropping tablespaces however "including contents" 
must be used; i cannot understand why: it is potentially dangerous.
I'd rather to remove this bound

6) Sqlplus copy command supporting new datatypes

7) update cascade

8) In Metalink searching with "exact sentence" many docs are retrieved where that sentence does not 
appear

9) better testing: for instance, the master script generated by dbca is written for bourne shell 
but with mixed cshell syntax: had it ever been run just once it would be easily fixed, 9.2.0.7 does 
not allow to drop a user and this is really a big one ...

Best regards

 


5 stars Silly me ...   October 11, 2005 - 10am Central time zone
Reviewer: Clemens from Vienna, Austria
- ALTER PROCEDURE/FUNCTION/PACKAGE MONITOR - so you could find dead/not used code in large 
applications.

=> is already solved through:

SELECT object_name, timestamp
  FROM dba_objects
 WHERE object_type LIKE 'PACKAGE%'
 ORDER BY timestamp;

C. 


Followup   October 11, 2005 - 3pm Central time zone:

that doesn't tell you when it was last used. 

4 stars Re: Clemens comments   October 11, 2005 - 12pm Central time zone
Reviewer: andrew from ca, usa
> Well if it's a dynamic call, then monitoring on the
> package/function/proc/sequence would still be useful.


Well if it's a dynamic call, then monitoring on the package/function/proc/sequence would still be 
useful. 


5 stars Read locks in Oracle!   October 11, 2005 - 1pm Central time zone
Reviewer: Brian Camire from Toronto, Canada
Seriously, it would be helpful to have a more flexible row locking mechanism -- sometimes 
SELECT...FOR UPDATE is too restrictive.

Specifically, it would be helpful to have way to lock a row that blocks other transactions that try 
to update it, but does not (unlike SELECT....FOR UPDATE) block other transactions that try lock it 
in the same (or a "compatible") way.

It would be like saying:

"I'm depending on these rows not to change for the rest of this transaction.  It's OK to let other 
transactions do the same, but not to let other transactions update these rows."

It might look like SELECT...IN <lock mode> MODE, where <lock mode> might correspond (in meaning, if 
not name) to the lock modes supported by LOCK TABLE.

SELECT...IN EXCLUSIVE MODE would be synonomous with SELECT...FOR UPDATE.

I know you can emulate this using DBMS_LOCK, but it would be easier if it was more declarative. 


4 stars Dependencies   October 11, 2005 - 2pm Central time zone
Reviewer: anto 
To show the dependencies(referenced_name in user_dependencies) even if the objects are used within 
execute immediate statements in procedures/packages 


Followup   October 11, 2005 - 3pm Central time zone:

that is impossible.  think about it.


execute immediate string;


execute immediate string1 || ' emp ' || string2;


and if the string is "imutable" - so it could be done, well, then one asks "why dynamic sql"??? 

4 stars sql 'macros'   October 11, 2005 - 3pm Central time zone
Reviewer: lh from finland
1) In order to write modular code it is sometimes useful to encapsulate complex sql-functions (e.g 
replace, upper, translate stacks or case statements) into 
stored functions or packages.

Referencing these functions is however slower than using (unmodular) straight sql-sentence. (there 
has already been discussion about the context switch between pl/sql engine and sql).

In c-language there is syntax for macros. Something like that so that one could:
create or replace macro example (p_param) is
replace(upper(substr(p_param,1,20)),'XXX','YYY');

and one could use this is sql-statements:
select
field1,
field2,
example(field3)
from 
     table1
;

2) Enhancing ORA-600 messages so that it would give more information. Something like the number of 
the bug that is causing the error message.
Wouldn't this be a great and benefical feature ?
(perhaps some minor difficulties in implementing...) 


Followup   October 11, 2005 - 3pm Central time zone:

1) already noted above..

2) if we knew the bug, we would not have thrown the error as the error is due to a bug.  chicken a 
very much "egg" here. 

4 stars separation of application server and database server   October 11, 2005 - 3pm Central time zone
Reviewer: lh from finland
For license, maintenance, security reasons it is sometimes usefull to dedicate a server just for 
the database.

Application would run in a different machines connecting into a database using sql*net.

However application/client can use  utl_file -package that is writing into database server. Also 
alter session set sql_trace = true commands produces trace files into database server.

If these files could somehow be directed into calling clients machine ? Automatic writing using 
sqlnet ? 


Followup   October 11, 2005 - 3pm Central time zone:

that would be very virus like.

Mount the file systems to the server and you can do this, but you have to take the initiative to do 
that. 

5 stars sql 'macros'   October 11, 2005 - 3pm Central time zone
Reviewer: lh from finland
When reading more of these suggestions I found that Gary has already suggested same kind of 
functionality.

So I am not alone in missing something like this. 


3 stars Wish list   October 11, 2005 - 4pm Central time zone
Reviewer: Pet from USA
Build-in Scheduler and event based job kick off ( Enhance DBMS_JOB., for ex. start a PL/SQL 
procedure when we receive files in a directory of OS)., so that we don't need to use KRON. 
Build-in basic workflow., ( data goes from one table to other and wait for user action and goes to 
same table with updated status , or other tables..)
Autoformat of result and Row limit on SQL plus client( like set ROWLIMIT 50 so that the all the 
subsequent queries stops after 50 rows) (very hard to cancel the Query in SQL*Plus client)
Named SQL  ( type select statement.. and save it as by giving a name in the database., instead of 
saving it in OS file ) so that you can re-use the same statement later.. namespace of named SQL 
should be current DB schema.) 
 


Followup   October 12, 2005 - 6am Central time zone:

someone would have to POLL the directory - so just schedule the job to run periodically and scan 
the directory (I've a java stored procedure on this site to get a list of files in a directory).


I think AQ is built in basic workflow (to build your workflows with)


 

5 stars something between shutdown immediate and abort.   October 11, 2005 - 4pm Central time zone
Reviewer: nowhere man from nowhere land
shutdown immediate defer long transaction rollback. 


5 stars Nice to have...   October 11, 2005 - 9pm Central time zone
Reviewer: Chris from London, England
A few wishes off the top of my head... 

a. Being able to join database tables to pl/sql tables in pl/sql code? A friend of mine swears 
blind he saw this listed as a feature in 10g (but he can't find it now).

b. I would like to be able to be able to 'drop table space including datafiles' - with an exception 
being raised if there were any contents. At the moment you can only specify 'including contents and 
datafiles' together - which can be dangerous.

c. The ability to drop individual datafiles from a tablespace (if empty).

d. User defined pfile/spfile parameters. For example, this could be used to automatically suppress 
certain features if a database if it were a copy of production. This would save having to remember 
to set a values in a database table after a refresh of a test database from production one.

   Eg: '!my_special_parameter = 123' 

From the previously mentioned features in this thread I'd like to add my vote to:

1. Defaulting a column to sequence.nextval (or sequence.currval).

2. Constraints with error messages associated (not just check constraints either). It might also be 
useful if you could include parameters in the message which would be replaced by the value that a 
column was being set to.

   Eg: '$1 is not a valid cost code'

3. Allowing comments on everything (OK - boring but handy).

4. Rename user / schema. This would be good for testing - to be able to swap back and forward 
between alternate versions of data quickly.

5. Allowing in-line SELECTs in PL/SQL such as:

   v_variable := NVL((SELECT ...), 'Unknown');

   IF EXISTS(SELECT NULL FROM emp WHERE ...)

   IF NVL((SELECT emp_id FROM emp ...), 0)

6. ON COMMIT triggers. 
 


Followup   October 12, 2005 - 7am Central time zone:

a) you can join to collections - and have been able to since 8i....

b) if you use OMF.... that happens already with just drop tablespace.

c) 10gr2 does that.
 

5 stars for previous poster(s)   October 12, 2005 - 5am Central time zone
Reviewer: Connor from Perth
a) select on plsql table

select * from table(plsql_table_type)

is already there.

b) alter table read only

Isn't this just:

create trigger before insert or update or delete 
  pragma exception_init(-942,fake_privs_msg);
begin
  raise fake_privs_msg;
end;

I'm not sure what the "overhead" of such a trigger is

Cheers
Connor 


5 stars Bitmap Join Index - make the more robust (and fix some bugs)...   October 12, 2005 - 10am Central time zone
Reviewer: Philip Moore from Cincinnati, OH USA
<code>Hi Tom,

I was just thinking of one of the features that I believed to be very promising when I first heard of them - Bitmap Join Indexes. After experience, however - I find them to be a little less useful.

The first thing is that join-back is still required if I reference the dimension table column that was indexed in the SELECT clause (oddly enough - it works fine if I only mention the column in the "WHERE" clause).

Example:
philip@ORA9iR2 -> DROP TABLE products CASCADE CONSTRAINTS
2 /

Table dropped.

philip@ORA9iR2 -> DROP TABLE facts
2 /

Table dropped.

philip@ORA9iR2 -> CREATE TABLE products(    product_id VARCHAR2(15)
2            , product_name VARCHAR2(30)
3            , CONSTRAINT product_pk PRIMARY KEY (product_id)
4            )
5 /

Table created.

philip@ORA9iR2 -> CREATE TABLE facts ( product_id VARCHAR2(15)
2              , sales_date DATE
3              , sale_in_dollars NUMBER
4              , CONSTRAINT facts_pk PRIMARY KEY (product_id, sales_date)
5              , CONSTRAINT facts_fk_products FOREIGN KEY (product_id) REFERENCES products (product_id)
6            )
7 /

Table created.

philip@ORA9iR2 -> CREATE BITMAP INDEX facts_product_bjix ON facts (products.product_name)
2 FROM products
3  , facts
4 WHERE products.product_id = facts.product_id
5 /

Index created.

philip@ORA9iR2 -> EXECUTE DBMS_STATS.GATHER_TABLE_STATS (ownname=>USER, tabname=>'PRODUCTS');

PL/SQL procedure successfully completed.

philip@ORA9iR2 -> EXECUTE DBMS_STATS.GATHER_TABLE_STATS (ownname=>USER, tabname=>'FACTS');

PL/SQL procedure successfully completed.

philip@ORA9iR2 -> SET autotrace traceonly EXPLAIN ;
philip@ORA9iR2 -> -- Here the index is used appropriately...
philip@ORA9iR2 -> SELECT SUM(facts.sale_in_dollars)
2 FROM facts
3  , products
4 WHERE facts.product_id = products.product_id
5  AND products.product_name = 'Tom Kyte''s BBQ'
6 /

Execution Plan
----------------------------------------------------------
  0    SELECT STATEMENT Optimizer=CHOOSE (Cost=2 Card=1 Bytes=22)
  1  0  SORT (AGGREGATE)
  2  1  TABLE ACCESS (BY INDEX ROWID) OF 'FACTS' (Cost=2 Card=1 Bytes=22)
  3  2    BITMAP CONVERSION (TO ROWIDS)
  4  3      BITMAP INDEX (SINGLE VALUE) OF 'FACTS_PRODUCT_BJIX'



philip@ORA9iR2 -> /* Oracle already did the work to join the FACTS and PRODUCTS table as well as catalog each unique
DOC>  entry of PRODUCT_NAME (for storage in the Bitmap Join Index).
DOC>  So why the join back to the PRODUCTS table?    Why not just use the bitmap join index entry
DOC>  to bring back the PRODUCT_NAME? */
philip@ORA9iR2 -> SELECT products.product_name
2    , SUM(facts.sale_in_dollars)
3 FROM facts
4  , products
5 WHERE facts.product_id = products.product_id
6  AND products.product_name = 'Tom Kyte''s BBQ'
7 GROUP BY products.product_name
8 /

Execution Plan
----------------------------------------------------------
  0    SELECT STATEMENT Optimizer=CHOOSE (Cost=3 Card=1 Bytes=48)
  1  0  SORT (GROUP BY NOSORT) (Cost=3 Card=1 Bytes=48)
  2  1  NESTED LOOPS (Cost=3 Card=1 Bytes=48)
  3  2    TABLE ACCESS (BY INDEX ROWID) OF 'FACTS' (Cost=2 Card=1 Bytes=22)
  4  3      BITMAP CONVERSION (TO ROWIDS)
  5  4      BITMAP INDEX (SINGLE VALUE) OF 'FACTS_PRODUCT_BJIX'
  6  2    TABLE ACCESS (BY INDEX ROWID) OF 'PRODUCTS' (Cost=1 Card=1 Bytes=26)
  7  6      INDEX (UNIQUE SCAN) OF 'PRODUCT_PK' (UNIQUE)

--------------------

The second thing is that if I have two indexes on the fact table (which is partitioned) - I can't exchange that partition - this bug has been around since bitmap join index inception - and even exists in Oracle 10G Release 2 (I verified it there)!!!

Example:
philip@ORA9iR2 -> DROP TABLE products CASCADE CONSTRAINTS
2 /

Table dropped.

philip@ORA9iR2 -> DROP TABLE geographies CASCADE CONSTRAINTS
2 /

Table dropped.

philip@ORA9iR2 -> DROP TABLE facts
2 /

Table dropped.

philip@ORA9iR2 -> DROP TABLE facts_swap
2 /

Table dropped.

philip@ORA9iR2 -> CREATE TABLE products(    product_id VARCHAR2(15)
2            , product_name VARCHAR2(30)
3            , CONSTRAINT products_pk PRIMARY KEY (product_id)
4            )
5 /

Table created.

philip@ORA9iR2 -> CREATE TABLE geographies ( geography_id VARCHAR2(15)
2                , geography_name VARCHAR2(30)
3                , CONSTRAINT geographies_pk PRIMARY KEY (geography_id)
4                  )
5 /

Table created.

philip@ORA9iR2 -> -- Here's our partitioned fact table...
philip@ORA9iR2 -> CREATE TABLE facts ( product_id VARCHAR2(15)
2              , geography_id VARCHAR2(15)
3              , sales_date DATE
4              , sale_in_dollars NUMBER
5              , CONSTRAINT facts_pk PRIMARY KEY (product_id, geography_id, sales_date) USING INDEX LOCAL
6              , CONSTRAINT facts_fk_products FOREIGN KEY (product_id) REFERENCES products (product_id)
7              , CONSTRAINT facts_fk_geographies FOREIGN KEY (geography_id) REFERENCES geographies (geography_id)
8            )
9 PARTITION BY RANGE (sales_date)
10 (PARTITION p_only VALUES LESS THAN (MAXVALUE))
11 /

Table created.

philip@ORA9iR2 -> CREATE BITMAP INDEX facts_product_bjix ON facts (products.product_name)
2 FROM products
3  , facts
4 WHERE products.product_id = facts.product_id
5 LOCAL
6 /

Index created.

philip@ORA9iR2 -> CREATE BITMAP INDEX facts_geography_bjix ON facts (geographies.geography_name)
2 FROM geographies
3  , facts
4 WHERE geographies.geography_id = facts.geography_id
5 LOCAL
6 /

Index created.

philip@ORA9iR2 -> -- Now for the "swap table"...
philip@ORA9iR2 -> CREATE TABLE facts_swap ( product_id VARCHAR2(15)
2              , geography_id VARCHAR2(15)
3              , sales_date DATE
4              , sale_in_dollars NUMBER
5              , CONSTRAINT facts_swap_pk PRIMARY KEY (product_id, geography_id, sales_date)
6              , CONSTRAINT facts_swap_fk_products FOREIGN KEY (product_id) REFERENCES products (product_id)
7              , CONSTRAINT facts_swap_fk_geographies FOREIGN KEY (geography_id) REFERENCES geographies (geography_id)
8            )
9 /

Table created.

philip@ORA9iR2 -> CREATE BITMAP INDEX facts_swap_product_bjix ON facts_swap (products.product_name)
2 FROM products
3  , facts_swap
4 WHERE products.product_id = facts_swap.product_id
5 /

Index created.

philip@ORA9iR2 -> CREATE BITMAP INDEX facts_swap_geography_bjix ON facts_swap (geographies.geography_name)
2 FROM geographies
3  , facts_swap
4 WHERE geographies.geography_id = facts_swap.geography_id
5 /

Index created.

philip@ORA9iR2 -> -- Drum Roll:
philip@ORA9iR2 -> ALTER TABLE facts
2 EXCHANGE PARTITION p_only WITH TABLE facts_swap
3 INCLUDING INDEXES WITH VALIDATION
4 /
EXCHANGE PARTITION p_only WITH TABLE facts_swap
                        *
ERROR at line 2:
ORA-14098: index mismatch for tables in ALTER TABLE EXCHANGE PARTITION


philip@ORA9iR2 -> -- Now drop the Bitmap Join Indexes...
philip@ORA9iR2 -> DROP INDEX facts_swap_product_bjix
2 /

Index dropped.

philip@ORA9iR2 -> DROP INDEX facts_swap_geography_bjix
2 /

Index dropped.

philip@ORA9iR2 -> DROP INDEX facts_product_bjix
2 /

Index dropped.

philip@ORA9iR2 -> DROP INDEX facts_geography_bjix
2 /

Index dropped.

philip@ORA9iR2 -> -- Now retry the swap...
philip@ORA9iR2 -> ALTER TABLE facts
2 EXCHANGE PARTITION p_only WITH TABLE facts_swap
3 INCLUDING INDEXES WITH VALIDATION
4 /

Table altered.

-------------------------

Finally - could you kindly share your top ten thus far?

Th

4 stars standard proc for compiling invalid objects in a schema   October 12, 2005 - 10am Central time zone
Reviewer: Anto 
What about a oracle supplied procedure for compiling all invalid objects in a schema based on 
dependencies ( similar to what we have in TOAD - compile all invalid objects in a schema ) - rather 
than going through the pain of writing our own procedures 


Followup   October 12, 2005 - 2pm Central time zone:

utlrp/utlirp.sql exist for the database.

me, i just let them be, they'll take care of themselves. 

4 stars   October 12, 2005 - 3pm Central time zone
Reviewer: A reader 
What about those developers who don't have access to those files ?

Anto 


Followup   October 13, 2005 - 9am Central time zone:

me, i just let them be, they'll take care of themselves.  

5 stars   October 12, 2005 - 6pm Central time zone
Reviewer: dave 
dbms_utility.compile_schema() 


Followup   October 13, 2005 - 10am Central time zone:

that is true, I forgot about that one - had issues in some 8i releases with a connect by loop in a 
view - but that should have been fixed in the latest 817 releases.
 

5 stars   October 13, 2005 - 4am Central time zone
Reviewer: Clemens from Vienna, Austria
- ALTER PROCEDURE/FUNCTION/PACKAGE MONITOR - so you could find dead/not used 
code in large applications.

=> is already solved through:

SELECT object_name, timestamp
  FROM dba_objects
 WHERE object_type LIKE 'PACKAGE%'
 ORDER BY timestamp;

C. 


Followup:  
that doesn't tell you when it was last used. 
 
------------------------------------------------------
Ok, so I wasn't that far of with my "wish". Just beeing curios, what does Oracle mean by

http://download-west.oracle.com/docs/cd/B14117_01/server.101/b10755/statviews_1102.htm#sthref1294
TIMESTAMP VARCHAR2(20) 
 Timestamp for the _specification_ of the object (character data) 

Regards
C. 


Followup   October 13, 2005 - 10am Central time zone:

for timestamp checking with remote PLSQL (forms/reports).  specification is like the package 
specificiation for example 

5 stars An Oracle newbie's experience   October 13, 2005 - 7am Central time zone
Reviewer: Andy Mackie from London, England.
As someone who has recently moved to Oracle from "the other DBMS" (SQL Server), here's my 
experience:

1. Development tools - impossible to use Oracle without 3rd party tools such as Toad or PL/SQL 
Developer. iSQL*Plus, or SQL*Plus and notepad ? Need I say more...

2. 30 character limit for names - AAGGHH!

3. Can't select CLOB columns across a database link ("ORA-22992: cannot use LOB locators selected 
from remote tables") - need to resort to workarounds like creating temp.tables.

4. XML Schema evolution - extremely limited. (discussion of copyEvolve limitations at 
http://forums.oracle.com/forums/message.jspa?messageID=1051365

5. DHCP environments - when installing on developer workstations, requires a fixed IP address, 
needing loopback adapters setup.

6. UPPERCASE COLUMN NAMES ONLY UNLESS YOU "Start putting everything in quotes". Jeez.

7. Enterprise Manager  (either web or Java UI) - sloooowww...lacks the slickness of modern GUI's.

8. Extremely heavy footprint. Just how many GB's of RAM do I need on my workstation to run Oracle 
and my development tools at the same time ?

9. Case sensitivity mixture - data comparisons are case sensitive, but the SQL itself is case 
insensitive.

My initial impression is that Oracle may have a good database engine, but the interface between me 
and the database leads to an extremely frustrating experience. Everything just seems so much more 
difficult to achieve. Oracle really needs to improve its usability significantly. 


5 stars Grants for all tables of a schema   October 13, 2005 - 9am Central time zone
Reviewer: Kim Berg Hansen from Middelfart, Denmark
A small enhancement I just wish I had today:

GRANT SELECT ON SCOTT.* TO JONES

At present I can do two things only:
GRANT SELECT ANY TABLE TO JONES
or
GRANT SELECT <one! table> TO JONES

Sure I can quickly whip up a script to GRANT SELECT on all Scott's tables to Jones, but when Scott 
creates a new table, that has to be explicitly granted too.

My reason is that I would like to create some users who have a sort of "READ ONLY" access to a 
particular schema - including any new tables that will come.

Similarly it would be nice with something like:
GRANT EXECUTE ON SCOTT.* TO JONES

And there are probably other grants that would be nice to be able to do on a schema-level rather 
than just either globally or object-level.
 


2 stars linker error : _sqlcxt module   October 13, 2005 - 10am Central time zone
Reviewer: sohli from INDIA
hey 
i m  a newbie
i didnt get the proper idea of what
u were saying could u please explain in details
thank you
 


Followup   October 13, 2005 - 11am Central time zone:

nt rly 

4 stars to Andy in England   October 13, 2005 - 11am Central time zone
Reviewer: Jim from Portland, Oregon, USA
Items 6,8,9.  In 10G you can have case insensitive searches.  Also you can make the database take 
up less RAM. (SQL server takes all RAM available unless you specifically limit it.)  Also in other 
databases the tools automatically quote the table and column names so they rely on mixed case 
object names.  I like not having to quote every darn thing just to query things.  I don't want to 
have mixed case object names.  Do you really want an Employee table that is different from the 
EMPLOYEE table?  UGH. 


3 stars GRANT SELECT ON SCOTT.* TO JONES   October 13, 2005 - 11am Central time zone
Reviewer: Alex from Riverside, CA
A small enhancement I just wish I had today:

GRANT SELECT ON SCOTT.* TO JONES


Have you tried CREATE TRIGGER on schema level for handling DDL events ?

 


5 stars For Alex   October 13, 2005 - 12pm Central time zone
Reviewer: Andrew from Michigan, USA
A little generic, but you get the idea...

BEGIN
    FOR x IN ( SELECT owner, 
                      object_name,
                      DECODE(object_type, 'TABLE' ,   'select',
                                          'SEQUENCE', 'select',
                                          'VIEW',     'select',
                                                      'execute') AS privs,
                      DECODE (owner, 'SCOTT',    'jones') AS app_user
                 FROM dba_objects
                WHERE object_type IN ('TABLE',    'PACKAGE', 'PROCEDURE',
                                      'FUNCTION', 'SEQUENCE', 'VIEW')
                  AND owner       IN ('SCOTT' )
    LOOP
      BEGIN
         EXECUTE IMMEDIATE 'grant ' || x.privs       || ' on ' || x.owner ||
                           '.'      || x.object_name || ' to ' || x.app_user   ;

         EXECUTE IMMEDIATE 'create or replace synonym '|| x.app_user||'.'||x.object_name||
                           ' for ' ||x.owner||'.'||x.object_name ;
      END;
    END LOOP;
END;
/
 


3 stars   October 13, 2005 - 12pm Central time zone
Reviewer: A reader 
What about those developers who don't have access to those files ?

Anto 


Followup:  
me, i just let them be, they'll take care of themselves.  
 
 You mean the invalid objects will take care of themselves (will become valid, if it can) , the 
next time someone runs them ?  

Not if there are 2 or 3 levels of dependencies .
If some object A is dependent on object B which is invalid(due to some object C being invalid)...., 
there is the need to comile in the order C,B,A

 


Followup   October 13, 2005 - 1pm Central time zone:

yes, they will become valid - the database will "fix them" all by itself. 

5 stars Not if there are 2 or 3 levels of dependencies .   October 13, 2005 - 12pm Central time zone
Reviewer: Kamal Kishore from New Jersey, USA
Is this what you mean?

SQL> create table t as select * from dual ;

Table created.

SQL>
SQL> create or replace procedure proc_c is
  2  begin
  3    for rec in (select * from t)
  4    loop
  5      null ;
  6    end loop ;
  7  end ;
  8  /

Procedure created.

SQL> create or replace procedure proc_b is
  2  begin
  3    proc_c ;
  4  end ;
  5  /

Procedure created.

SQL> create or replace procedure proc_a is
  2  begin
  3    proc_b ;
  4  end ;
  5  /

Procedure created.

SQL> select object_name, status from user_objects where object_name LIKE 'PROC%' ;

OBJECT_NAME                     STATUS
------------------------------- -------
PROC_A                          VALID
PROC_B                          VALID
PROC_C                          VALID

3 rows selected.

SQL> rename t to t1 ;

Table renamed.

SQL> rename t1 to t ;

Table renamed.

SQL> select object_name, status from user_objects where object_name LIKE 'PROC%' ;

OBJECT_NAME                     STATUS
------------------------------- -------
PROC_A                          INVALID
PROC_B                          INVALID
PROC_C                          INVALID

3 rows selected.

SQL> exec proc_a ;

PL/SQL procedure successfully completed.

SQL> select object_name, status from user_objects where object_name LIKE 'PROC%' ;

OBJECT_NAME                     STATUS
------------------------------- -------
PROC_A                          VALID
PROC_B                          VALID
PROC_C                          VALID

3 rows selected.

SQL>
 


3 stars 2 or 3 or more levels of dependency   October 13, 2005 - 1pm Central time zone
Reviewer: A reader 
What if the objects involved are materialized views and not procedures ?  Will Oracle fix all the 
dependent MVs in the correct order ?

Anto 


Followup   October 13, 2005 - 4pm Central time zone:

define "fix", what is "broken" about them 

5 stars Join Conditions   October 13, 2005 - 2pm Central time zone
Reviewer: A reader from Mississauga, ON CANADA
I hate having to explicitly write join conditions
that effectively duplicate foreign key information
already stored in the database.  In 90% of the queries
I write the join conditions are a redundant expression
of pre-defined foreign key constraints.

For example:

  create table table_a
  ( a_id   number,
    a_name varchar2(10)
    primary key(a_id)
  );

  create table table_b
  ( b_id    number,
    a_id_fk number references table_a,
    b_name  varchar2(10)
  );

  create table table_c
  ( c_id    number,
    b_id_fk number references table_b,
    c_name  varchar2(10)
  );

  -- instead of this

  select
    a.name, b.name, c.name
  from
    table_a a, table_b, table_c
  where
    a.a_id = b.a_id_fk and
    b.b_id = c.b_id_fk and
    ...
  ;

  -- or this ugly ANSI SQL construct

  select
    a.name, b.name, c.name
  from
    table_a a inner join
      table_b b inner join
        table_c c
        on ( b.b_id = c.b_id_fk )
      on ( a.a_id = b.a_id_fk )
  where
    ...
  ;

  -- something like this would be nice;
  -- it is fast and easy to write and others
  -- can clearly follow the logic with minimal effort

  select
    a.name, b.name, c.name
  from
    table_a a,
    table_b b,
    table_c c
  join
    a inner join b,
    b inner join c
  where
    ...
  ;

Oracle invested huge amounts to develop a complex cost based
optimizer to pre-process queries.  I'm surprised that, after
all these decades, that they haven't invested a small fraction of
that amount to make their parser smart enough to know how to join
two tables together simply using constraint information already
available in its data dictionary.

When you have a situation where you need joins that don't
follow the pre-defined foreign key constraints, the 
existing syntax will do.  In a well designed database, 
these cases should definitely be the minority however.

I'm aware of the "USING (column_name)" clause.  This 
construct comes close, but it has a few deficiencies 
that cancel out is usefulness as a time saving syntax
construct:

  1. you can't use it when the primary key and foreign
     key column names differ

  2. it precludes the use of shortcuts like "a.*" in the
     SELECT clause

  3. you have to remember to treat the join columns
     differently when you reference them in other
     parts of the SELECT clause; i.e. if you are in
     the habit of prefixing all your column names with
     table aliases you have to remember not to do this
     for columns mentioned in the USING clause.

 


5 stars Andy   October 13, 2005 - 2pm Central time zone
Reviewer: DaPi from Geneva, Switzerland
"5. DHCP environments - when installing on developer workstations, requires a 
fixed IP address, needing loopback adapters setup."

Can't you get round this by using IPC (Inter-Process Connect/Communication) ? 


3 stars DHCP - yes   October 13, 2005 - 4pm Central time zone
Reviewer: Tom Fox from Cincinnati, OH
Sure, you can use DHCP.  I run 9i and 10gR2 on my box with a DHCP address and no loopback 
installed.  I get errors during the installation wondering about my hostname and IP, but I hit 
continue and it functions normally.  Of course, I don't need other people on the network to connect 
to me so this is fine. 


3 stars Things to add..   October 13, 2005 - 4pm Central time zone
Reviewer: Rob from Nashvegas, TN
1. Would love the ability to display user sessions and be able to sort on the by the amount of 
archivelogging that they have generated. 

2. Would love a utility to BLAST updates to multi-million rows in an extremely fast manner. I have 
used a couple manners using hints, updating the stats on the object, etc. Just a great "method" 
that saves me the time of having to play with the different methods to find the fastest.  

3. Built-in virus scanning of uploaded attachments in the database. (Can I say Mcafee?) 

4. Cross database-link explain plans with more detail. 

Those would be my first requests off the top of my head.  


4 stars RMAN like commands in sqlplus would be helpfull too   October 13, 2005 - 7pm Central time zone
Reviewer: Yegna from Inkster,MI USA
Like in RMAN if I could do the following in sqlplus that would be great..

List tablespace (to list all the tablespaces with size)
list constraints for table schema.tname (to list the constraints of the table)
..
.. 


3 stars What I don't like...   October 17, 2005 - 4am Central time zone
Reviewer: Toon Koppelaars from The Netherlands
Fully argree with Zlatko a few posts ago.

What I don't like about Oracle (or any other DBMS out there) is the lack of more support for data 
integrity constraints (aka business rules). We need much more than just CHECK, PRIMARY KEY, UNIQUE 
and FOREIGN KEY.

Support for the CREATE ASSERTION ANSI SQL construct would be EXTREMELY useful and thus a good 
start. Allthough I know this is also EXTREMELY difficult to implement... ;-)
 


5 stars ...and another wish   October 17, 2005 - 1pm Central time zone
Reviewer: A reader from England
I would like an additional variable to be available in an exception block (like we already have 
SQLERRM and SQLCODE) - to give the line number within the module that caused the branch to the 
exception block.

You can currently look at the call stack / exception stack but that will only give you a line 
number within the exception block as opposed to the one that sent you there.

 


Followup   October 17, 2005 - 1pm Central time zone:

10g added that 

dbms_utility.FORMAT_ERROR_BACKTRACE 

5 stars re-raise original exception   October 19, 2005 - 2pm Central time zone
Reviewer: Alberto Dell'Era from Milan, Italy
In Java we can do:

catch (Exception e) {
  // log infos about exception etc
  throw e;
}

Would be nice to have something similar in pl/sql, currently you can do:

dellera@ORACLE10> declare
  2  l_dummy varchar2(1);
  3  begin
  4    select dummy into l_dummy from dual where 1=0;
  5  exception when others then
  6    raise;
  7  end;
  8  /
declare
*
ERROR at line 1:
ORA-01403: no data found
ORA-06512: at line 6

Would be nice to have something like "raise original_exception;", that gives "ORA-06512: at line 4" 
instead (and the full original stack trace in general of course).

Using dbms_utility.FORMAT_ERROR_BACKTRACE would "flatten" the stack into the message string, it's 
not the same (besides being a tad verbose). 


5 stars Change(s) Needed - Idle Time Parameter   October 19, 2005 - 4pm Central time zone
Reviewer: Magesh from Columbus, OH
The IDLE TIME Parameter when set in the database. When a user leaves his or her session inactive 
exceeding the idle time set for whatever be the reason, Oracle waits for the user to return and 
submit an action to the database before completely cleaning up the session. It would be nice if it 
cleans up automatically instead of putting the session as "Sniped". The user either knowingly or 
unknowingly violated the IDLE TIME limit and his session is anyway gone. What use is it to the 
database by keeping it in "Sniped" Status anyway? 


Followup   October 19, 2005 - 5pm Central time zone:

the end user would get "3113 end of file on communication channel" upon return.

What do you do about 3113's?  
You call support....

 

5 stars A Simple Way to list dependencies may be   October 19, 2005 - 5pm Central time zone
Reviewer: A reader 
When we have to make change to an object, say change the data type or name, I want to know all the 
20-30 sub-programs that is using it, so I know how much work is going to be required or what is 
needed to change in advance. I know you can do it through Enterprise Manager but I am talking about 
some simple way probably from sqlplus or something. Probably even like a system table which would 
store the object and the dependencies of it will do good. But I would really love to do something 
like 

SQL> LIST DEPENDENCY EMP; or something like it. 


Followup   October 19, 2005 - 7pm Central time zone:

(connect by query on dba_dependencies can do this....) 

4 stars how about better support for binds in explain plan   October 19, 2005 - 11pm Central time zone
Reviewer: Sean D Stuber from Columbus, OH USA
In particular, allow date bind variables when doing a plan.

Clearly Oracle can do it, the statements execute and have plans generated when they run, why can't 
that same logic (or nearly the same) be applied when just running the plan?

I'd be willing to have the functionality toggled through an 

alter session xplan_allow_date_binds=true

in order to allow "default" behavior to work (or rather, fail) the current way; but still give me 
the option to generate a plan from the the real application sql without tinkering with it first.
 


4 stars empty strings and nulls   October 20, 2005 - 12am Central time zone
Reviewer: Raymond Allo from Sydney, Australia
As a DBA I am involved in many Java and PHP projects. Most developers are complaining (specifically 
the Java ones) about how Oracle deals with empty strings and nulls. Nulls is to confusing somehow 
and creates all this extra work for them.(ok guys it is what it is so get over it, just put it in a 
class) Having said that, it seems Oracle is the only database which has this issue. DB2, Postgres, 
MYSQL, SQLServer etc handle empty strings as empty strings. 
An init.ora parameter like empty_strings=true/false would be nice thank you. 


5 stars DBMS_OUTPUT.PUT_LINE   October 20, 2005 - 4am Central time zone
Reviewer: A reader 
1) 
Few books on PL/SQL says that we should be able to use DBMS_OUTPUT.PUT_LINE using boolean variable, 
which is not overloaded yet for its usage.
2) If there is command line history of the SQL statements, it would be very much helpful in 
SQL*PLUS
 


Followup   October 20, 2005 - 8am Central time zone:

1) I'm sorry that some books are wrong?  are they Oracle books (eg: something we can actually fix?)

2) raptor. 

4 stars gathering global statistics for partitioned table   October 20, 2005 - 5am Central time zone
Reviewer: lh from finland
Have I understood it correctly :if sql-statement is referencing only one partition, it will use 
statistics for that partition, otherwise it will use global statistics.

Generating global statistics can be costly operation for large partitioned tables especially when 
using histograms.

Some kind of 'cumulative' gathering of statistics  could be beneficial. Calculation of statistics 
for partition would e.g. update global statistics. 


Followup   October 20, 2005 - 8am Central time zone:

if the optimizer can determine a) that a single partition will be accessed and b) which partition 
that is then partition stats for that partition will be used.

Else, global table statistics are used.


calculation of local stats for all partitions DOES generate global stats HOWEVER if you have 100 
partition and column X has 1000 distinct values in each partition, tell me how many distinct values 
of X does the table have?

a) 1,000
b) 100,000
c) some number between 1,000 and 100,000


and for bonus points

q) is X skewed, if so how?


you cannot roll up partition stats and answer those.... 

5 stars DBMS_OUTPUT.PUT_LINE   October 20, 2005 - 12pm Central time zone
Reviewer: A reader 
Hi tom,
does oracle support printing boolean values using DBMS_OUTPUT.PUT_LINE? 
 


Followup   October 20, 2005 - 4pm Central time zone:

nope.

ops$tkyte@ORA9IR2> exec dbms_output.put_line( true );
BEGIN dbms_output.put_line( true ); END;

      *
ERROR at line 1:
ORA-06550: line 1, column 7:
PLS-00306: wrong number or types of arguments in call to 'PUT_LINE'
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored

 

4 stars gathering global statistics for partitioned table   October 21, 2005 - 5am Central time zone
Reviewer: lh from finland
I had in my mind situation were new data is constantly added into table. New partitions are created 
and statistics are gathered for them after they have 'representative' volume. 

Column statistics also should use histograms. This is the key point. These might be cumulated with 
some accurancy as global statistics.
Histograms have some of the required information. 
This would be an estimate, agreed. This could be (yet) another option in dbms_stats -package when 
gathering statistics for named partition.

Other way to solve the basic problem is that if sql-statement would use several partitions (with 
local indexes)then optimizer would use these partitions statistics, not global statistics.

(I have few times have probles using partitioned tables with local indexes. Statistics we gathered 
for partitions. 
But sql-statements where referencing several partitions. 
Especially queries which had indexed date columns in where clauses performed sometimes poorly 
because old global statistics did not understand values beyond old statistics range.
Table had hundreds of millions rows and gathering global statistics in that machine takes a long 
time. We are now doing it, because we couldn't modify that third party application. But I am 
wondering if this could be solved otherwise). 


Followup   October 21, 2005 - 8am Central time zone:

stats should be gathered for them from the get go - else the global stats are not rolled up.


it is not that histograms would be estimated - rather it is the fact that there isn't a way to roll 
them up as described.


100 partitions
10000 distinct values of X in each

do you have 10,000 distinct X's or 1,000,000 distinct X's or something in between??

The optimizer EITHER

a) uses global stats because it cannot figure out the SINGLE partition that will be accessed at 
parse time

b) uses local stats because it CAN figure out the SINGLE partition that will be accessed. 

5 stars execute immediate @ db-link   October 21, 2005 - 8am Central time zone
Reviewer: A reader 
would be handy in some cases
(instead of dbms_sql@db-link) 


4 stars booleans in dbms_output   October 21, 2005 - 9am Central time zone
Reviewer: A reader from Deutschland
I generally use following syntax :
exec dbms_output.put_line(case  1>2   when true then 'true' when false then 'false'  else 'what?' 
end);

 


5 stars My votes   October 21, 2005 - 10am Central time zone
Reviewer: Peter Nybo Rasmussen from Denmark
My votes goes to the following (all said by others before):

1) Multi-table check constraints or assertions as defined by ANSI SQL (don't see why this would be 
"extremely difficult to implement" as stated by Toon Koppelaars).
2) Don't treat empty strings as null (a way to disable this, big design mistake).
3) No implicit type conversions (a way to disable this).
4) Up-to-date size limits for varchar2 (currently 4000 bytes) and identifiers (currently 30 
characters).
5) Autoincrement/identity columns (implicit sequences to avoid trigger code).
6) Mixed case object names (for better readability) without having to quote, combined with case 
insensitive DML.
7) Extended explain syntax to allow the equivalent of bind variable peeking.
 


5 stars Not technical but...   October 21, 2005 - 11am Central time zone
Reviewer: Steve from Notts, UK
Having AskTom occasionally open to accept questions during UK working hours! 

;-) 


Followup   October 21, 2005 - 11am Central time zone:

I'll be in Europe for the next two weeks :) 

5 stars   October 21, 2005 - 11am Central time zone
Reviewer: malcolm from london
GPL the source code. Hahaha!

And another vote for the option to compile pl/sql with strong typing. (We don't like being treated 
like VB programmers...)

 


4 stars For Peter Nybo Rasmussen   October 21, 2005 - 12pm Central time zone
Reviewer: Andrew from Michigan, USA
1) Multi-table check constraints or assertions as defined by ANSI SQL . . .
- seems reasonable to me

2) Don't treat empty strings as null (a way to disable this, big design mistake).
- length of emptry string = 0
- length of null string = 0
-- what is the difference between empty string and null string?  If length of enpty string > 0, 
then it is not empty, thus not null.

3) No implicit type conversions (a way to disable this).
- good coding practices generally dictate explicit type conversions, but to eliminate it would bust 
lots and lots of apps.  Besides, just because your coders will not follow your standards ( you have 
a standard requiring explicit type conversions, right), does not mean you should use the database 
to enforce it.


4) Up-to-date size limits for varchar2 (currently 4000 bytes) and identifiers (currently 30 
characters).
- Longer varchar2 is fine with me, but identifiers at 30 is fine too.  This enhancement is usually 
requested by people who like to mash object names together to make even longer names.  If it were 
to increase to 60 or 128 or?? all that would happen is that there would be complaints that from 
people that they could not mash their 120 char names together to make 600 char names.  Give us a 
break, someone has to type in those long names every time their code references them

5) Autoincrement/identity columns (implicit sequences to avoid trigger code).
- Actually seperate sequences are more flexible.  Take for instance a bi-directional replication 
system.  We set the sequence to start at 1 on site a and to start at 2 on site b, now we increment 
by 2 on each site.  Voila, no data collisions.  Managing that with autoincrement would mean the 
code (DDL at least) would have to be different on each database.

6) Mixed case object names (for better readability) without having to quote, combined with case 
insensitive DML.
- You can put mixed case object names in your apps all you want, oracle does not care.  DML is case 
insensitive.  update emp set salary = 10; will work just fine.  So will UPDATE EMP SET SALARY = 10; 
and so will Update Emp Set Salary = 20;.  As for dictionary contnt readability, learn to use 
underscores -- They take the palce of spaces in object names 
AndMakeReadabilityMuchEasierThanMixedCase.

7) Extended explain syntax to allow the equivalent of bind variable peeking.
- That is nice.  But also, having to diagnose problems others are having in thier sessions, it 
would be nice to peek at the bind variables for other sessions too.

Just my US$.02
 


5 stars   October 21, 2005 - 1pm Central time zone
Reviewer: Chuck Jolley from OKC, OK USA
Quote:
AndMakeReadabilityMuchEasierThanMixedCase.

Thats no problem. Just make it: TblAndMakeReadabilityMuchEasierThanMixedCase and it becomes easy to 
read.
Ask any SQLServer/VB programmer ;)


 


5 stars Those naughty NULL's   October 21, 2005 - 2pm Central time zone
Reviewer: DaPi from Geneva Switzerland
Andrew said:
- length of emptry string = 0
- length of null string = 0
-- what is the difference between empty string and null string? 

I would say that the length of a NULL string is unknown, so should be NULL.

The difference is between:
a message '' received with a good check-sum => empty string
a message received with bad checksum, unknown message => NULL

I'm sure Fabian Pascal can do it better.
 


5 stars Nice thread   October 21, 2005 - 2pm Central time zone
Reviewer: Andrew Max from Russia
Well, my strong belief is that one should be a smart Oracle guru to feel 100% free criticizing 
something about Oracle and saying "Hey there, I would like you to add this feature! Why Oracle is 
still missing it???". Otherwise, we may end up with beating the air...

But anyway -- there is one intricate (and very simple) thing I still can't get.

Why in SQL*Plus we can, for example:

SQL> variable NumV number

... but can not:

SQL> variable DateV DATE
Usage: VAR[IABLE] [ <variable> [ NUMBER | CHAR | CHAR (n [CHAR|BYTE]) |
                    VARCHAR2 (n [CHAR|BYTE]) | NCHAR | NCHAR (n) |
                    NVARCHAR2 (n) | CLOB | NCLOB | REFCURSOR ] ]

So -- VARCHAR2, REFCURSOR and even CLOB are allowed whereas DATE is not.
But why???

I really have no clues so I'm afraid it's a kinda stupid question.
Well, I am not guru. So I realize that this may be just "beating the air..." :)

Best regards,
Andrew. 


Followup   October 22, 2005 - 9am Central time zone:

they just didn't "implement it".

applications generally don't *bind* dates - they bind strings which hold characters that when a 
specific format is applied to these characters can be converted into a 7 byte internal date format 
(or 11 bytes for timestamps with fractional seconds) 

3 stars Compiling invalid objects in the correct order   October 21, 2005 - 2pm Central time zone
Reviewer: Marco Coletti from Trento, Italy
Yet another sample of "selecting DDL commands".

This query is a bit slow, but it should give you a list of DDL statements in (one of) the correct 
execution order.

The basic idea here is first to find the set INVOBJS_INDEPENDENT_INVOBJS of invalid objects which 
do not refer to other invalid objects, then from this set start a hierarchical query wich goes down 
the dependency tree; the resulting set is then aggregated by object and ordered by maxlevel to take 
care of objects which appear more than once in the dependency hierarchy.

with INVOBJS_INDEPENDENT_INVOBJS as (
  select OBJECT_NAME, OBJECT_TYPE
  from USER_OBJECTS where STATUS = 'INVALID'
  minus 
  select d.NAME, d.TYPE
  from
   USER_DEPENDENCIES d, 
   (select OBJECT_NAME, OBJECT_TYPE from USER_OBJECTS where STATUS = 'INVALID') o
  where d.REFERENCED_NAME = o.OBJECT_NAME
    and d.REFERENCED_TYPE = o.OBJECT_TYPE)
select 
  'alter '||rpad(decode(OBJECT_TYPE,'PACKAGE BODY','PACKAGE',OBJECT_TYPE),14,' ')||
    rpad(OBJECT_NAME,31,' ')||'compile'||
    decode(OBJECT_TYPE,'PACKAGE BODY',' body')||';' COMPILE_COMMAND
from (
  select 0 L, OBJECT_NAME, OBJECT_TYPE, NULL REFERENCED_NAME, NULL REFERENCED_TYPE
  from INVOBJS_INDEPENDENT_INVOBJS
  union all
  select LEVEL L, NAME, TYPE, REFERENCED_NAME, REFERENCED_TYPE
  from USER_DEPENDENCIES
  connect by prior NAME = REFERENCED_NAME and prior TYPE = REFERENCED_TYPE
  start with (REFERENCED_NAME, REFERENCED_TYPE) in (select OBJECT_NAME, OBJECT_TYPE from 
INVOBJS_INDEPENDENT_INVOBJS))
group by OBJECT_NAME,OBJECT_TYPE
order by max(L);

COMPILE_COMMAND
----------------------------------------------------------------
alter VIEW          V_OM_CDN                       compile;
alter VIEW          V_OM_ROD                       compile;
alter PACKAGE       CMKANALISI                     compile body;
alter VIEW          V_OM_ALICE                     compile;
alter PROCEDURE     ALLINEA_CPC                    compile;
alter VIEW          TV_CPC_VIEW                    compile;
alter VIEW          V_RPT_SMART                    compile;
alter FUNCTION      FAMIGLIA_ROD                   compile;
alter PROCEDURE     OM_MERGE_ROD                   compile;
alter PROCEDURE     SOGLIE_PER_SISTEMA             compile;
alter PROCEDURE     SLAMONITOR_WRAP_OM             compile;
alter PROCEDURE     SLAMONITOR_OM_WRAP             compile;
alter PROCEDURE     OM_MERGE_WHOLESALE             compile;
alter PROCEDURE     ALLINEA_CPC_ORESTE             compile;
alter PROCEDURE     SLAMONITOR_OM_DAI              compile;
alter PROCEDURE     SLAMONITOR_OM_CPC              compile;
alter PROCEDURE     SLAMONITOR_CPC_OM              compile;
alter PROCEDURE     SLAMONITOR_ALL_OM              compile;
alter PROCEDURE     SMART_BUS_SIEBEL_CLEAN         compile;
alter VIEW          TV_TD_INNOVATIVA_VIEW          compile;
alter PROCEDURE     SVECCHIA_OL_IN_CATENA          compile;
alter VIEW          TV_ELABORAZIONE_VIEW           compile;
alter VIEW          TV_CPC_VIEW_X_PORZIO           compile;
alter VIEW          V_RPT_WHOLESALE_NEW            compile;
alter PROCEDURE     INFASA_OL_IN_CATENA            compile;
alter PROCEDURE     CARICA_OL_IN_CATENA            compile;
alter PROCEDURE     SP_OM_DELETE_TABLE             compile;
alter VIEW          TV_STATO_ORDINATIVI_ALTA_VIEW  compile;
alter PROCEDURE     ANDREA_AGG_CPC_DOPPIA_ATTIVAZ  compile;
alter VIEW          TV_CONFIGURAZIONE_CIRCUITO_V   compile;
alter PROCEDURE     SP_DEL_DUPLICATI_TD_INNOV      compile;
alter VIEW          TV_STATO_ORDINATIVI_VIEW       compile;
alter VIEW          V_RPT_TD_INNOVATIVA_NEW        compile;
alter PACKAGE       TEST_TIZIANO                   compile body;
alter PROCEDURE     PR_TOSC_UNICA                  compile;
alter PROCEDURE     SLAMONITOR_CPC                 compile;
alter PROCEDURE     PULITURA_DB_BAM                compile;
alter PROCEDURE     SLAMONITOR_WRAP                compile;
alter PACKAGE       TEST_TIZIANO_BE                compile body;
alter PROCEDURE     OM_MERGE_SOSPESI               compile;
alter PROCEDURE     SLAMONITOR_RUN_1               compile;
alter PROCEDURE     SLAMONITOR_RUN_2               compile;
 


5 stars   October 21, 2005 - 2pm Central time zone
Reviewer: Chuck Jolley from OKC, OK USA
I'm for null strings having a length of 0.

It just seems inconsistent to have it work the way it does.

I you say, well what about null numbers etc: 
Null strings are different. 
null it's self is a string.

I just can't think of a case where a program would treat a null string differently from a 0 length 
string as a prctical matter.

 


4 stars NULL's   October 21, 2005 - 3pm Central time zone
Reviewer: DaPi from Geneva Switzerland
It's not what a program would do, it's what you want your data to mean.  e.g. in a survey:

Q: What is your boat's name?
A: It doesn't have a name.  (empty string)

Q: What is your boat's name?
A: . . . AGHHHHH! my house is on fire . . . . . (NULL string)



 


5 stars Enhancement Request   October 21, 2005 - 3pm Central time zone
Reviewer: djb from Rome, GA
I realize this thread is getting long and I may have missed this, but I'd like something like a 
dynamic (or conditional) foreign key constraint, like this:

create table T1 (
  T1F1      VARCHAR2(30) primary key
)
/

create table T2 (
  T2F1      VARCHAR2(30) primary key
)
/

create table TMAIN (
  F1         number(1),
  F2         VARCHAR2(30)
)
/

alter table TMAIN
  add foreign key (F2)
    when (F1 = 1) references (T1.T1F1)
    when (F1 = 2) references (T2.T2F1)
    when (F1 = 3) references (NOTHING)
/

I worked with a proprietary database that did this sort of thing (it was not SQL-based) and this 
feature was great.
When the value of F1 changed, the DB checked F2 against the appropriate table. To change values, 
you simply updated both at the same time.

I'd be curious to know what others think of this (including Tom). 


Followup   October 22, 2005 - 10am Central time zone:

Never, never never.

I would hang up my hat.  


You have three attributes here, not a single column multiplexed to mean one of three things. 

5 stars re: nulls -vs- empty strings   October 21, 2005 - 3pm Central time zone
Reviewer: Chuck Jolley from OKC, OK USA
But Oracle is not consistent about it.
Is '' a null value or an empty string?
If it's not an empty string then what is?

"My boat is on fire" should raise a null pointer error,
Not be an acceptable answer to "What is the name of your boat?"

SQL*Plus: Release 8.1.7.0.0 - Production on Fri Oct 21 14:45:30 2005

(c) Copyright 2000 Oracle Corporation.  All rights reserved.

SQL> @connect chajol@tax_test
Enter password:
Connected.
chajol@tax.experior>create table blah(id number, string varchar2(16) default '' not null);

Table created.

Elapsed: 00:00:00.43
chajol@tax.experior>insert into blah(id) values(1);
insert into blah(id) values(1)
            *
ERROR at line 1:
ORA-01400: cannot insert NULL into ("CHAJOL"."BLAH"."STRING")


chajol@tax.experior>alter table blah modify(string default 'Hello World');

Table altered.

chajol@tax.experior>insert into blah(id) values(1);

1 row created.

chajol@tax.experior>select * from blah;

        ID STRING
---------- ----------------
         1 Hello World


chajol@tax.experior>

 


3 stars Improved sqlplus parameter handling..   October 21, 2005 - 5pm Central time zone
Reviewer: Jmv from Green Bay, WI
For instance if &1, &2, et al are not defined on the command line is there a way to have a default 
automatically assigned.  Similar to the ${var:=value} fuctionality in ksh.
Or to see the number of arguments from the command line. 


5 stars Sorry, missed that   October 22, 2005 - 10am Central time zone
Reviewer: Andrew Max from Russia
Aah... my bad! Completely forgot about that 7-byte SQLT_DAT datatype. 
Indeed, client applications generally do not bind this datatype.

> applications generally don't *bind* dates - they bind strings which hold characters ...

... did you mean this I believe?

SQL> create table dates (x date);

Table created.

SQL> variable some_string varchar2(48)
SQL>
SQL> exec :some_string := '22.10.05'

PL/SQL procedure successfully completed.

SQL> insert into dates values (:some_string);

1 row created.

Well, I do not code clients and involved mostly in server-side logic programming (SQL, PL/SQL, a 
bit of OCI). But I realize that if someone had decided to bind strings containing dates he(she) 
must be aware of this:

SQL> alter session set NLS_DATE_FORMAT = 'DD/MON/YYYY';

Session altered.

SQL> insert into dates values (:some_string);
insert into dates values (:some_string)
                           *
ERROR at line 1:
ORA-01843: not a valid month


SQL>  exec :some_string := '22/OCT/2005'

PL/SQL procedure successfully completed.

SQL> insert into dates values (:some_string);

1 row created.

Anyway -- agree with you, DATE for SQL*Plus VARIABLE command makes no real sence because most other 
client apps never use SQLT_DAT. Sorry for that silly question. ;)

Thanks and best regards,
Andrew. 


5 stars Some extra about statistics   October 22, 2005 - 11am Central time zone
Reviewer: Ofir Manor from Israel
There are many great suggestion here.
Some ideas about statistics:
1. I'd like to be able to do ALTER TABLE xxx DEFAULT STATISTICS METHOD FOR ALL INDEXED COLUMNS...
It would allow us to use gather_schema_stats and easily customize the way it analyzes a few 
selected tables that need some special care. Also, it might be useful to be able to customize the 
default estimate percent(or default to compute) etc.
2. I wish that when specifing parallelism for gather_schema_stats, each parallel slave would 
analyze a different table or index. So, if my schema has 200 tables and 800 indexes, and I run with 
a degree of 4, I'll have 4 processes that each analyzes a different object (starting with the 
biggest and the unanalized, maybe, so they finish more or less the same time). Again, otherwise we 
might need to work with our own scripts to create that parallelism.
Well 1+2 mean - find out why people don't use gather_schema_stats (or database_stats) on many 
production systems and use custom scripts instead, then make the builtin way easy and flexible 
enough so people will use it out of the box (using db control..)
3. I'd like the optimizer to use a new kind of statistics - COLUMN CORRELATION. For example, when a 
query has table t (1 million rows) as the driving table, and the two predicates that filter rows 
are WHERE t.a = :x and t.b = :y, and both A and B are NOT NULL with a 200 distinct values, how many 
rows will return from this part of the query? Oracle will guess a 25(a million divided twice to 
200). It is a good guess if the columns are not correlated. but if they are strongly corelated, a 
better guess might be a few thoursands! so the rest of the plan might be really of. I'd like to be 
able to ask the database to collect correlation statistics on selected columns (or maybe AUTO - let 
him decide) and use it when appropriate.
In many cases, when tuning a nasty SQL, the DBA can quickly find where the cardinality estimates 
goes totally wrong, but can't fix - so let us (SQL profiles can help, but are not good for 
"families" of similar SQLs) and are not "pre-emptive" 


5 stars For Andrew from Michigan, USA   October 24, 2005 - 5am Central time zone
Reviewer: Clemens from Vienna, Austria
Quote:
2) Don't treat empty strings as null (a way to disable this, big design 
mistake).
- length of emptry string = 0
- length of null string = 0
-- what is the difference between empty string and null string?  If length of 
enpty string > 0, then it is not empty, thus not null.

=> The difference between "empty string = string length=0 entered" and "null string = no data at 
all entered" may be small, but it's there.  

Quote:
3) No implicit type conversions (a way to disable this).
- good coding practices generally dictate explicit type conversions, but to 
eliminate it would bust lots and lots of apps.  Besides, just because your 
coders will not follow your standards ( you have a standard requiring explicit 
type conversions, right), does not mean you should use the database to enforce 
it.

=> Why not? Could be a database/session option to keep everyone happy.

Quote:
4) Up-to-date size limits for varchar2 (currently 4000 bytes) and identifiers 
(currently 30 characters).
- Longer varchar2 is fine with me, but identifiers at 30 is fine too.  This 
enhancement is usually requested by people who like to mash object names 
together to make even longer names.  If it were to increase to 60 or 128 or?? 
all that would happen is that there would be complaints that from people that 
they could not mash their 120 char names together to make 600 char names.  Give 
us a break, someone has to type in those long names every time their code 
references them

=> So what? Using your argument, why not allow only for 8-charater identifier limit? On the other 
side, why is there no tab completion for object names yet? And what about concatenated names in 
foreign keys, etc. that have to be given artificial names because of that 30-character limit? 

Quote:
5) Autoincrement/identity columns (implicit sequences to avoid trigger code).
- Actually seperate sequences are more flexible.  Take for instance a bi-directional replication 
system.  We set the sequence to start at 1 on site a and to start at 2 on site b, now we increment 
by 2 on each site.  Voila, no data collisions.  Managing that with autoincrement would mean the 
code (DDL at least) would have to be different on each database.

=> Take a look at postgres, it's all there: sequences connected to ID-columns. Saves some trigger 
coding (and maintainance) and gives you the best of both worlds.

Quote:
6) Mixed case object names (for better readability) without having to quote, 
combined with case insensitive DML.
- You can put mixed case object names in your apps all you want, oracle does not care.  DML is case 
insensitive.  update emp set salary = 10; will work just 
fine.  So will UPDATE EMP SET SALARY = 10; and so will Update Emp Set Salary = 
20;.  As for dictionary contnt readability, learn to use underscores -- They 
take the palce of spaces in object names 
AndMakeReadabilityMuchEasierThanMixedCase.

=> Doesn't tackle the whole problem, where DESC and other commands will return the information in 
Uppercase only. Underscores are nice, but underscores + mixed case are even nicer.

Just my €.02
C. 


5 stars Is raptor "still sqlplus..."   October 24, 2005 - 4pm Central time zone
Reviewer: Stewart W. Bryson from Nashville, TN
"Actually, many of those things I would change are being addressed - a better 
sqlplus that is still sqlplus (coming, code name "raptor", previewed at OOW)..."

What I've read about Raptor is that it is more akin to jDeveloper than sqlplus. I don't want 
another Toad... I want a more powerful sqlplus, and anything that I have to use a JDBC connection 
with just doesn't seem like sqlplus to me.

 


Followup   October 25, 2005 - 1am Central time zone:

why does jdbc make it "not seem like sqlplus"?????

 

4 stars Deferred constraints   October 25, 2005 - 10am Central time zone
Reviewer: Toon Koppelaars from the Netherlands
"What I don't like about Oracle", here is another one:

cod>create table test(i number check (i>0) initially deferred);

Table created.

cod>insert into test values(0);

1 row created.

cod>commit;
commit
*
ERROR at line 1:
ORA-02091: transaction rolled back
ORA-02290: check constraint (CBO_WS.SYS_C006049) violated


cod>select * from test;

no rows selected

I would like for Oracle to NOT rollback the transaction. Just have the commit fail with the 2290 
error.
I know ansi/sql standard describes the 2091 error: give us a switch then, to prevent the rollback.
 


Followup   October 26, 2005 - 7am Central time zone:

all you need to do is:

SQL> set constraints all immediate;


that'll verify the constraints - and if one fails - no rollback happens. You can fix it and then 
commit when it finally succeeds.


Commit must end the transaction one way or the other. 

4 stars How can one have a commit fail   October 25, 2005 - 11am Central time zone
Reviewer: Jim from Portland, OR, USA
Not sure how one could have a commit fail and not issue the rollback.  You issue commit and you get 
an error, now what?  You can't commit, it failed, just leave the transaction unfinished? 


4 stars   October 25, 2005 - 12pm Central time zone
Reviewer: Toon Koppelaars 
Yes, and then issue a correcting:
update test set i=1 where i=0;
and then commit succesfully.
 


Followup   October 26, 2005 - 8am Central time zone:

set constraints..... 

5 stars Is raptor "still sqlplus..."   October 25, 2005 - 2pm Central time zone
Reviewer: Stewart W. Bryson from Nashville, TN
It seems that Raptor is going to be more like Toad... a very GUI tool much like the tools one would 
use to administer SQL-Server.

What I want is a more powerful sqlplus... one that is still very command-line oriented, but makes 
some of the more painful things easier: statement recall and review, formatting output, spooling to 
a spreadsheet-like output, etc. And it would be fine with me if there was a GUI client built around 
it... but at it's very heart it was still sqlplus.

Perhaps my comparing it to Toad is unfair... but that's what the screenshots looked like. And I 
know in toad, all sqlplus commands are ignored. Is the JDBC connection that Raptor uses going to 
allow commands such as "SHUDOWN IMMEDIATE", "RECOVER DATABASE" or "ALTER SYSTEM kill session..."?

Your new book is excellent... by the way.



 


2 stars Not a review   October 25, 2005 - 4pm Central time zone
Reviewer: Huy from UK
_Maximum length for identifiers is too low.
_Case-insensitive passwords. 


2 stars my5cent   October 26, 2005 - 9am Central time zone
Reviewer: Edgar from Latvia
1.
On most sites, range partitioning is used on date type columns to maintain "windows of historical 
data".
Then, to automate partition mintenance, people write some code to create partitions for new months, 
truncate/drop partitions of "obsolete" data.
Each site has it's own implementation... dissipate the common task
2.
Replication using fast refresh - no built-in functionality which preserves rows in target table 
from deletes after truncate/drop partition on master table.
3.
Physical standby with read-only mode windows for reporting:
no possibility to use temporary tables.
4.
Express Server killed by Oracle - it was out-of-the-box SOLUTION for datamarts.
Now replaced by analytical sql, m-views - just a bricks for developers.
5. 
JDBC - unable to get metaData on PreparedStatement before execution
6.
SQL optimizer hints - it is hard sometimes to get them work, because syntax check of hints not 
implemented, reasons why they doesn't work are not reported.
7.
Alert log file has inconvenient structure - hard to process with scripts, figure out all lines 
witch corresponds to the same "bad event", dates of "bad events"  (compare with Windows EventLog, 
for ideas)  


5 stars ORA-12053   October 26, 2005 - 9am Central time zone
Reviewer: Kim from Denmark
- Not the most descriptive error message.

Background (10g R1):
  We are trying to figure out *why* it is not allowed to
  use nested join MV and fast refresh, but only nested 
  aggregated MV.
  It works when we use group by for all columns, so why
  not without ??? 


5 stars ALERT.LOG structure   October 26, 2005 - 9am Central time zone
Reviewer: Andrew Max from Russia
Hi Edgar,

> "Alert log file has inconvenient structure - hard to process with scripts, figure out all lines 
witch corresponds to the same "bad event", dates of "bad events" (compare with Windows EventLog, 
for ideas)..."

Have you read this, for example?
http://asktom.oracle.com/~tkyte/alert_arch.html
Tom demonstrated there how to make use of SQL and external tables to mine data from ALERT.LOG file.
Similar smart examples can be found in his new book, "Expert Oracle Database Architecture".

Best regards,
Andrew. 


5 stars Reply to Edgar   October 26, 2005 - 9am Central time zone
Reviewer: Stewart W. Bryson from Nashville, TN
"Replication using fast refresh - no built-in functionality which preserves rows 
in target table from deletes after truncate/drop partition on master table."

Materialized views are just that... instantiated views of a source object or objects. It cannot 
contain more data that the source... it's just not what they are designed for. They are no longer 
Oracle's preferred replication platform... they are more of a data warehousing/data segmentation 
tool now.

For replication needs such as those mentioned above, use Streams. Streams allows you to define what 
transactions you would like to forward. Only want updates and inserts but no deletes? Fine... 
configure it that way. You do or do not want DDL to be forwarded? It can do either one. Want 
replication for an entire database or entire schema (instead of having to configure MV's for every 
single table)? Oracle's got you covered. 


5 stars varchar2 max length   October 27, 2005 - 1pm Central time zone
Reviewer: Alex 
Wish to remove these annoying length restrictions on VARCHAR2 - 4000 in SQL and 32767 in PL/SQL. 
They are very very inconvenient.

Of course, we might use CLOB, but due to its' significant performance impact, using CLOBs seems to 
be overkill for our 50-100K strings.

So, having even 4Mb length varchar2 would be REALLY helpful. 


4 stars   October 28, 2005 - 3pm Central time zone
Reviewer: A reader 
Tom,

Now that this thread has "steadied down" can you pick your top 5 or top 10 ? 


Followup   October 29, 2005 - 10am Central time zone:

I will do that - this week or next weekend..... Yes.

 

4 stars One thing i don't like in SQL   October 29, 2005 - 1pm Central time zone
Reviewer: Michel Cadot from France
Hi,

I already posted this question in forum and newsgroup but never received an answer.
Why in the following query, Oracle is not able to resolve a.dummy?

SQL> select ( select dummy
 2           from ( select dummy
 3                  from dual b
 4                  where b.dummy = a.dummy
 5                )
 6         ) dummy
 7  from dual a
 8  /
               where b.dummy = a.dummy
                               *
ERROR at line 4:
ORA-00904: "A"."DUMMY": invalid identifier

The purpose of this question is we often have to optimize the following kind of query:

select ..., 
       (select ... from tabB B1
        where B1.col1 = A.col1
          and B1.col2 = (select max(B2.col2) from taB B2
                         where B2.col1 = A.col1))
from tabA A
where ...

The classical way to limit to one access to tabB is to use an analytic function like:

select ..., 
       (select ... 
        from (select ..., row_number() over (order by col2 desc) rn
              from tabB B
              where B.col1 = A.col1)
         where rn = 1)
from tabA A
where ...

but as we add 1 level in subqueries, A.col1 becomes out of scope.
Why is this the case? Is there any theorical SQL limit on this? Or is it just an Oracle optimizer 
limit?

Regards
Michel
 


Followup   October 29, 2005 - 2pm Central time zone:

correlation names go "one level", no more, no less.

let us say b2.col2 is a DATE:

select ...., 
       substr(
       (select MAX( to_char(b2.col2,'yyyymmddhh24miss')|| '..your dotdotdot..' ) 
          from tabB b1
         where b1.col1 = a.col1), 15 ) 
  from tablA 
 where .....



similar for number, varchar.....
 

4 stars   October 30, 2005 - 6am Central time zone
Reviewer: Michel Cadot from France
Thanks Tom, that's what i finally did but this is not really pretty and especially when the 
"dotdotdot" is complex (say multiple columns of different types and so).

Do you know the reason of this limit of "one level"?
I hoped there would be no limit, something like variables scope in PL/SQL or C...

Regards
Michel 


Followup   October 31, 2005 - 2am Central time zone:

I do not know the reasoning "why", only that "it is" and how to work around it. 

5 stars another USD$.02   October 31, 2005 - 11am Central time zone
Reviewer: Andrew from Michigan, USA
I think it would be real useful if the dba_tables view were to break out chain_cnt such that 
chain_cnt reflects the number of rows that require more than one block to store and that a new 
column, migrate_cnt, reflects the number of rows move due to insufficent free space in the block to 
allow the row to grow. 


5 stars Linux Installation Headaches   October 31, 2005 - 12pm Central time zone
Reviewer: Basil from Houston, TX
The headache of installing Oracle under Linux ranks up there as one of the biggest misfeatures of 
Oracle, at least as far as installing 9.2.0.4 under RHEL 3 (a supported platform) is concerned. 
Procedure appears to be: Get software, unpack software, apply a patch, start installer, watch it 
fail, remember to set THREADS_FLAG to native, and run the installer again. Of course, Google and 
Metalink must be consulted on top of the install document at each step.

I can't figure out why the patch isn't already applied to the product when I get it, nor why I have 
to have Metalink access to get something that prevents the product from installing in the first 
place, nor why the runInstaller script can't check the environment and set THREADS_FLAG 
appropriately before running the Java insaller. It's enough to make me take the Windows performance 
penalty just to be free of the installation hassle. My most recent Oracle install led to to see why 
MySQL is so popular. rpm -i and the software is there. 


Followup   November 1, 2005 - 4am Central time zone:

XE, rpm -i 

4 stars automatic length in constant varchar2 in PL/SQL   November 1, 2005 - 4pm Central time zone
Reviewer: Russell H from San Francisco Bay Area
Something like

declare
  some_text constant varchar2() := 'Hello World!';
...

would be nice.  PL/SQL could automatically set the length. 


3 stars What don't you like about Oracle?   November 1, 2005 - 5pm Central time zone
Reviewer: Nestor Torres from St. Petersburg, Florida
What I don't like about Oracle is that it sells Oracle e-Business Suite 11i for Windows and then 
you subsequently find the in order for it to work (install) you need to have MKS Toolkit which is a 
$500.00 software. Good job! What does a student that wants to learn the Oracle e-Business Suite 11i 
suppose to do? You buy the trial version and then Oracle expects you to have MKS Toolkit. They 
should at least provide a work around for those of us that can't invest on MKS Toolkit. I think 
this is not a good way to secure a loyal following. Here I am with a worthless set of DVDs. That is 
what I don't like about Oracle. 


Followup   November 2, 2005 - 5am Central time zone:

well, I cannot imagine a student downloading and installing the e-business suite and making any 
sense out of it personally. 

5 stars Suggestion: excluded tables on "imp"   November 2, 2005 - 11am Central time zone
Reviewer: David Weigel from Wayne, PA
We sell an application with Oracle, and once in a while we can't figure out problems without the 
customer bundling up the database and sending it to us.  Their database schemae are very similar, 
not necessarily identical, but one thing I can count on is that there are two tables (say A and B) 
that will make up 60% of the size and rarely are useful solving the problem.

When loading the database, I have to do "IMP SHOW=Y" and cull out all but the two tables and build 
a "IMP TABLES=(N1,N2,N3,N4...N200)".  What I'd like to be able to do is "IMP EXCLUDE=(A,B)". 


Followup   November 3, 2005 - 5am Central time zone:

data pump has infinitely more sophisticated filters.

You can give them a "fine grained access control" policy of "where 1=0", ask them to put that in 
place - do the export (zero rows come out) and then drop the policy (i've done that in the past) 

4 stars Snipped Sessions are a pain   November 2, 2005 - 11am Central time zone
Reviewer: Bill Beilstein from Liverpool, NY, USA
A major PITA for every DBA I have ever talked to (outside of Oracle) is that when a session is 
killed by the dba or by a resource_limit, you have to run a cron job to kill the OS session to 
release the connection. The requirement that the user has one more swip at the apple before it 
disconnects is just silly!!! What happens to the user who went on vacation for a week. While I know 
that this behavor is near and dear to the people who work for oracle, provide a database parameter 
so that the rest of the world can chop the session when the user is killed. Something like.

KILL_SESSION_IMMEDIATELY  = TRUE 


Followup   November 3, 2005 - 6am Central time zone:

well, it is not entirely silly - the client application will generate an ora-3113, end of file on 
communication channel.  A fairly obscure and "scary" message.

But I hear you. 

5 stars datatype text   November 2, 2005 - 3pm Central time zone
Reviewer: A reader 
There is one thing I always like when using other databases, it's the datatype text. With Oracle I 
have to use a "normalization table"/rows table to contain it which is more work.

Why did Oracle choose not to include datatype text? Obviously you are fully capable of doing it, so 
there must be a good reason behind the decision not to.

Thanks,
Marcus 


Followup   November 3, 2005 - 6am Central time zone:

clob? 

3 stars What do you think about this?   November 3, 2005 - 11am Central time zone
Reviewer: D. 
"Oracle password-system is putting its users in danger
...it seems, that passwords of Oracle DB users, can be easily uncovered, because of its weak 
defense mechanism, putting in danger corporative secrets of companies, using this software. The 
last critical analyze of problem showed clearly observed insufficiencies of technologies, used by 
company. Explorers of the problem uncovered the password during few minutes. Joshua Right from SANS 
Institute and Carlos Sida from Royal Colledge Holloway (London), exploring this problem sharply 
criticize this issue on the conference dedicated to IT-security, that was held in Los Angeles. 
According to their words, the main problem is weak hashing-mechanism and upcase transformation, 
that narrows ammount of possible combinations. Also, they say, that Oracle was notified about this 
issue in July, but there was no official reaction..."

Sorry for poor quality of translation and possible inaccurate name transliteration - I translated 
this article from other language. Also I can't show the origin of this article, because it was lost 
during e-mailing.

What I want to ask is next: is where some truth in this article or its just old evil Microsoft 
trying to lay its dirty hands on Oracle's share of market?
 


Followup   November 4, 2005 - 2am Central time zone:

http://asktom.oracle.com/pls/asktom/f?p=100:11:::::P11_QUESTION_ID:258815248980#50574772893798
has my comments on that....

would you send me your /etc/shadow file?  If not, I won't send you my dba_users table either.  That 
is the bottom line. 

4 stars Ok   November 4, 2005 - 5am Central time zone
Reviewer: D. 
This really makes sense - first thing to protect are hashed password, so nobody can "brute-force" 
them.
Well, but now I'm interested in such a question:
 when I'm logging in... with SQL*Plus, for example, what is sent over the network - plain text, 
hash of password or the whole thing is somehow encrypted. Can some evil guy steal password or hash 
this way or am I missing something?.. 


Followup   November 4, 2005 - 8am Central time zone:

passwords are sent encrypted (since 7.0).

however, beware of commands like "alter user x identified by y" - as sql is sent cleartext unless 
you have encrypted the network traffic (ASO) 

5 stars   November 4, 2005 - 11am Central time zone
Reviewer: David Aldridge from Colorado Springs
How about the "password" syntax? I'm guessing that it encrypts the passwords?

SQL> password applications
Changing password for applications
New password:
Retype new password:
Password changed 


Followup   November 4, 2005 - 5pm Central time zone:

set 

TRACE_DIRECTORY_CLIENT=/tmp
TRACE_level_client=16


in your sqlnet.ora (in unix .sqlnet.ora if you like in your home directory) and you'll see that you 
cannot see the password.

 

3 stars   November 7, 2005 - 5am Central time zone
Reviewer: donna from england
I'd like to get rid of jInitiator, why flog all this web services capabilities and yet still need 
to install a client application?! 


4 stars Schema Level Permissions   November 7, 2005 - 3pm Central time zone
Reviewer: Bill from Liverpool, NY, USA
I have always wanted the ability to grant permissions at the schema level. For example if you want 
user AAA to be able to select user BBB's tables, you have to grant select on every table in BBB's 
schema. Wouldn't it be nice if you could simply say

grant select to AAA;
or
grant select on schema {ALL|TABLES|VIEWS|SEQUENCES} to AAA; 


3 stars Hints   November 10, 2005 - 5am Central time zone
Reviewer: andrew boocock 
Hi Tom,
I guess this is the best topic for my thoughts on hints.

I got a call yesterday from another company site, the DBA had issues with a slow running piece of 
3rd party supplied code. The code was hinted. I advised the removal of this as the first step, the 
plan changed to something more appropriate and the runtime came down for 4 hours + to 8 minutes.

I'd imagine we've all seen this situation before, and for a basic SQL script this was easily 
changeable.  However I've also been in the situation where compiled code has been provided with 
embedded hints. There are ways and means to change the behaviour without recompiling,the one I 
remember was changing the degree of parallelism on the base table to change a RULE hint, this led 
to an inlist iterator being used rather than a concatenation.

Drum roll,

How about ORACLE providing a parameter to be set in initialisation IGNORE_HINTS=TRUE/FALSE.

Thinking about how oracle goes about parsing code, HINTS are  identified and the directive 
followed.  If the oracle binary could check the new parameter and ignore the HINTS we have another 
tool to help us out particularly with compiled code.

Clearly on the occasion when we need to hint to get us around some bad design or whatever the 
parameter could be set via alter sesssion set IGNORE_HINTS=FALSE or whatever.

I'm assuming this would be quite simple to accomplish - basically another if statment. If doable 
providing a backport patch would help many of us still running 9i or indeed 8i.

Regards

andrew 


Followup   November 11, 2005 - 11am Central time zone:

(shhh, there is but it is not documented in the current releases) 

4 stars You know what I'm going to ask next   November 12, 2005 - 4am Central time zone
Reviewer: andrew boocock 
That's good to know. I assume at best this will be an
underscore parameter.

I guess you can't tell me so maybe I'll have to trawl through all the _underscore params looking 
for something with *hint* or *optimizer* in. Unless you can whisper it !

BTW is the documentation going to include this anytime soon?

Thanks

Andrew 


Followup   November 12, 2005 - 10am Central time zone:

run a 10053 trace and you'll see them all (the optimizer related parameters) in the trace file.

undocumented things are undocumented, don't expect them to become "documented" anytime soon.  If 
and only if they decide to make this a "feature" would it become documented. 

5 stars comparing nulls   November 13, 2005 - 1am Central time zone
Reviewer: A reader 
It would be nice to have an equality operator that treated two null values as equal to each other.  
E.g. I'd like to be able to write something like 
   
  where col1 == col2

instead of 

  where nvl( col1, 'x' ) = nvl( col2, 'x' )

where "x" is some character that I pray never actually appears in my column data.
 


Followup   November 13, 2005 - 10am Central time zone:

how about:

decode( col1, col2, 'equal, even if null', 'not equal, even if null' )

where decode( col1, col2, 1, 0 ) = 1

for example.... 

3 stars My 2 cents   November 13, 2005 - 5pm Central time zone
Reviewer: Mike Wilson from Los Angeles, CA
I've been working with Oracle for 10+ years now (yes, I know I'm still a newbie) but if I had to 
pick the single greatest thing I don't like about Oracle it would be:
*) Command-line history in SQL*Plus using up arrow on Unix platforms.

Yes, I know you can download a third-party patch to get this to work in Linux but why, oh, why 
hasn't this "feature" ever just worked on install?  I can't count the number of times I've hit the 
up arrow in SQL*Plus and then sworn quietly, repeatedly under my breath at a client site.  It would 
have saved me literally man weeks in the past 10 years.  

Will Raptor include command-line up-arrow history out of the box?

Defaulting to vi rather than ed would have also been a nice touch once we made it to the 21st 
century but at least you can configure this with a startup script ...   


Followup   November 13, 2005 - 5pm Central time zone:

raptor is more gui than command line - but with a full history.  

(i agree with you, rlwrap has been "life changing" :) 

5 stars To andrew   November 14, 2005 - 12pm Central time zone
Reviewer: oraboy 
Well you know, when experts like Tom say not to use undocumented parameters, I suppose you realize 
the meaning & good intention behind it.

and here comes the whisper..(just thought I can save your search time, as you sound very decisive 
about finding that  secret parameter).

I hope you dont use it for Prod..but for testing in pre-prod or at session level to verify where 
CBO's default plan is superior than the one hinted by developers (90% of the time) .. you can try 
this

SQL>explain plan for 
  2   select /*+ no_index(t test_t_idx) */ * from test_t t where owner='SYS';

Explained.

SQL>select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------

--------------------------------------------------------------------
| Id  | Operation            |  Name       | Rows  | Bytes | Cost  |
--------------------------------------------------------------------
|   0 | SELECT STATEMENT     |             |   327 |  6867 |     2 |
|   1 |  TABLE ACCESS FULL   | TEST_T      |   327 |  6867 |     2 |
--------------------------------------------------------------------

SQL>alter session set events '10143 trace name context forever'; 

SQL>explain plan for 
  2    select /*+ no_index(t test_t_idx) */ * from test_t t where owner='SYS';

Explained.

SQL>select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------

---------------------------------------------------------------------------
| Id  | Operation                   |  Name       | Rows  | Bytes | Cost  |
---------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |             |       |       |       |
|   1 |  TABLE ACCESS BY INDEX ROWID| TEST_T      |       |       |       |
|   2 |   INDEX RANGE SCAN          | TEST_T_IDX  |       |       |       |
---------------------------------------------------------------------------

SQL>alter session set events '10143 trace name context off';

Session altered.

SQL>explain plan for 
  2     select /*+ no_index(t test_t_idx) */ * from test_t t where owner='SYS';

Explained.

SQL>select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------

--------------------------------------------------------------------
| Id  | Operation            |  Name       | Rows  | Bytes | Cost  |
--------------------------------------------------------------------
|   0 | SELECT STATEMENT     |             |   327 |  6867 |     2 |
|   1 |  TABLE ACCESS FULL   | TEST_T      |   327 |  6867 |     2 |
--------------------------------------------------------------------

Again, please be informed Tom never advocates using undocumented parameters and thats the strong 
foundation I have learnt from him. But if you need to show a demo on how bad the application (if it 
has been hinted by developers on every SQL) is , by all means you can use this , as your quickest 
way in test or dev. 

hope that helps

and I really hope Tom doesnt mistake me for putting this (* but hey, this is not a secret per se, I 
found it in metalink :) ) 


Followup   November 14, 2005 - 2pm Central time zone:

as long as everyone knows "not supported, use at your own risk, caveat emptor, get support 
permission to use in production, etc etc etc"

 

5 stars Thing I "don't like"   November 15, 2005 - 12pm Central time zone
Reviewer: Andrew Max from Russia
Hi Tom,

I'd like to point out one more "what-you-don’t-like" thing here. 
It’s about ORA-30005 error. Please consider:

SQL> create table Employee as
  2  select 1 EmpNo, 'John Smith' EmpName from dual
  3  union all
  4  select 2, 'Peter Pen' from dual;

Table created.

SQL> select * from Employee
  2    where EmpNo = 1
  3    FOR UPDATE WAIT 5;

     EMPNO EMPNAME
---------- ----------
         1 John Smith

So far so good. We just asked Oracle "hey, give me that row and if it’s already locked then please 
wait, but no longer than 5 seconds".

However, *why we can not* do it this way???

SQL> variable Wait_Time number
SQL>
SQL> exec :Wait_Time := 5

PL/SQL procedure successfully completed.

SQL> select * from Employee
  2    where EmpNo = 1
  3    FOR UPDATE WAIT :WAIT_TIME;
  FOR UPDATE WAIT :WAIT_TIME
                  *
ERROR at line 3:
ORA-30005: missing or invalid WAIT interval

In other words, we can not use bind variables to specify wait timeout -- only some integer 
constant. While it may seem obvious, this is where I got a bit confused. I believe that allowing 
not only constants but also bind variables here would be a nice feature.

Suppose, for example, we want to implement a procedure:

SQL> create procedure UpdateEmp (p_EmpNo in number, p_Wait in number) is
  2     cursor Cur is
  3     select null from Employee where EmpNo = p_EmpNo for update wait p_Wait;
  4  begin
  5     open Cur;
  6     -- Row locked -- do some updates ...
  7     close Cur;
  8  end;
  9  /

Warning: Procedure created with compilation errors.

SQL> show errors
Errors for PROCEDURE UPDATEEMP:

LINE/COL ERROR
-------- -----------------------------------------------------------------
3/4      PL/SQL: SQL Statement ignored
3/68     PL/SQL: ORA-30005: missing or invalid WAIT interval

Of course, it failed for obvious reasons. But if it were implemented, it would be possible for 
end-users to call this procedure passing different wait intervals to it.
As for me, it makes sense: some "impatient" user would call it like this:

exec UpdateEmp (1, 1)

while the other (say, more "patient") would be able to issue:

exec UpdateEmp (1, 10).

Furthermore, as far as I understand implementing this feature would not affect much anything (I 
mean, query parsing strategy -- there's no need to change something radically). But may be I’m just 
wrong?

So what do you think about this?

Thanks and best regards,
Andrew. 


5 stars to Andrew Max   November 15, 2005 - 3pm Central time zone
Reviewer: Oraboy from MI, USA
create or replace procedure updateemp(n number) as
begin
 count:= 0;
 Loop
 declare
  cursor cur_emp is select ... for update nowait;
 begin
 open cur_emp; 
 count:= 10000;
 exception
 when time_out_error or data_Locked_by_someone then
  count:= count + 1;
 -- your other application code
 end
 exit when count>n;
 end loop;
end updateemp; 

-- if you really want to wait 'n' seconds (and not just try n attempts), simply add a 
dbms_lock.sleep to sleep one second within the inner loop

PL/SQL gives all the power you want



 


5 stars Include ALM?   November 15, 2005 - 4pm Central time zone
Reviewer: Oraboy from MI, USA
This is something what just came to my mind..sort of 'nice to have' feature.

9 out of 10 developers dont understand concurrency issues and things that work fine obviously get 
blown away when exposed to many concurrent users. (and yes, simply they blame it on Oracle and move 
away - is a different story)

Now , just think some application is already there in production ..getting beaten to death..No one 
has a clue..I am thinking if there is an option to just capture all production happenings that 
could be rerun  in Non-Prod env, that would be great (to test any system after changes)

what I mean is..say we experience problems around 10 am every morning, if there is some way to 
record all user activities from say 8am to 11 am , and transfer over to other databases (like 
dbms_stats and stat table)..we can simply rerun this activity (load) to check whether the modified 
code makes this any better

I am not sure whether this sounds more like load-runner or volume testing tool (which I dont have 
any experience)..but I am looking for something within database (may be room for a new acronym: ALM 
->Automatic Load Management or ALLM-> Automatic Load Management Monitor)

 


Followup   November 16, 2005 - 8am Central time zone:

that is load runner - I'm not sure if we'd be going into that area anytime soon.

Neat idea though. 

5 stars Oraboy, thanks but...   November 15, 2005 - 4pm Central time zone
Reviewer: Andrew Max from Russia
Hi Oraboy,

And thanks a lot for your comments.
But there’s a small but very crisp difference between FOR UPDATE WAIT approach and the one you 
posted above.

As far as I know, SELECT ... FOR UPDATE WAIT *enqueues* session request to lock row(s). This means 
that if some row of interest is locked and session #1 issued such request at some point before 
session #2, it’s guaranteed that session #1 will be able to lock that row when it’s freed while 
session #2 will continue to wait.

Consider:

Blocker> select EmpNo from Employee
  2       where EmpNo = 1 for update;

     EMPNO
----------
         1

Session #1> select to_char(sysdate, 'HH24:MI:SS') cur_time from dual;

CUR_TIME
--------
23:49:03

Session #1> select EmpNo from Employee
  2  where EmpNo = 1 for update wait 60;
-- Session #1 began to wait...

Session #2> select to_char(sysdate, 'HH24:MI:SS') cur_time from dual;

CUR_TIME
--------
23:49:18

Session #2> select EmpNo from Employee
  2  where EmpNo = 1 for update wait 60;
-- Session #2 began to wait...

Blocker> commit;

Commit complete.

Session #1> ...

     EMPNO
----------
         1

Session #2> ... continue to wait, and in less than minute:
select EmpNo from Employee
*
ERROR at line 1:
ORA-30006: resource busy; acquire with WAIT timeout expired

If we were using "retry counter" logic with LOOP, NOWAIT and dbms_lock.sleep the ordering would be 
unpredictable and quite *random*. Suppose, some session began to sleep on dbms_lock.sleep and 0.001 
sec. later the row of interest is unlocked. Then our sleeping session may have no luck: some third 
session can "steal" row immediately.

Is this important? Well, it depends... 
And I believe sometimes it’s important.

Thanks again for your comments.

Cheers,
Andrew. 


5 stars create or replace table   November 16, 2005 - 10am Central time zone
Reviewer: Baker from Coloardo
I would like to see the keyword "or replace" added to the create table syntax, instead of using a 
key word "truncate".  

There are times where I use a drop table in script to wipe out temp tables that I don't want 
hanging around the database, followed by a create table.  Of course, I end up getting the "table do 
not exist" error.  If the syntax was changed to "create or replace table", then I could elimate the 
drop table and thus remove the error message.
 
 


Followup   November 16, 2005 - 6pm Central time zone:

begin
  execute immediate 'drop table t';
exception
  when others then null;
end;
/


is one method 

5 stars To Andrew Max   November 16, 2005 - 11am Central time zone
Reviewer: Oraboy from MI, USA
Andrew - 
 Again what you are trying (to serialize) is already available , just a matter of how to write the 
code.

since you said " I believe sometimes its important", I am putting this reply (dont mean to showcase 
my plsql knowledge)

SQL>desc test_t
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------
 C1                                                 NUMBER
 C2                                                 TIMESTAMP(6)

SQL>ed
Wrote file afiedt.buf

  1  Create or replace procedure Update_test_t( p_c1 in number, p_willing_maxwait in number ) as
  2   cur_c1 sys_refcursor;
  3   lv_c1 number;
  4  begin
  5    open cur_c1 for 'select * from test_t where c1='||p_c1 ||' for update wait 
'||p_willing_maxwait;
  6    loop
  7     exit when cur_c1%notfound;
  8     fetch cur_c1 into lv_c1;
  9     update test_t set c2=systimestamp where c1=lv_c1;
 10    end loop;
 11  exception
 12    when others then
 13     dbms_output.put_line('Error '||SQLERRM(SQLCODE));
 14* end;
 15  /

Procedure created.

----
se1 ==> Session1
se2 ==> Session2


T1:
----
Se1>exec Update_test_t(2,2);

PL/SQL procedure successfully completed.

se2>set time on
10:41:30 se2>exec Update_test_t(2,2); -- waited 2 seconds..no luck
Error ORA-30006: resource busy; acquire with WAIT timeout expired

PL/SQL procedure successfully completed.

10:41:38 se2>
10:41:49 se2>exec Update_test_t(2,5); -- waited 5 seconds..no luck
Error ORA-30006: resource busy; acquire with WAIT timeout expired

PL/SQL procedure successfully completed.

10:42:22 se2>exec Update_test_t(2,25);
***WAITING ***

 -- flip to Session1 and release the lock
 Se1>commit;
 Commit complete.
 -- swictch to session2 , its done
PL/SQL procedure successfully completed.

checking the update
====================
SQL>select * from test_t;

        C1 C2
---------- -----------------------------
         1
         2 16-NOV-05 10.42.28.018745 AM <-- session 2's time
         3
         4
         5
         6
         7
         8

8 rows selected.

hope that answers your need..
 
Thats probably the last answer from me as I feel this topic is moving away from intended topic 
(things I dont like or I like to have  - in Oracle) and I dont want to earn the wrath of other 
oracle guru's here

Sorry Tom, for overstepping in your thread.



 


Followup   November 16, 2005 - 6pm Central time zone:

Andrew is correct about the enqueue waits though.

Think about it like this....


You get into a line, a queue.  You are blocked (waiting for the chance to buy tickets).

If you get out of line every three seconds, you may NEVER be able to buy the ticket (because once 
you get out of line, you lose your place, you go to the end of the queue).

If you stay in line - you don't lose your place, you don't lose your place. 

5 stars The last reply to Oraboy...   November 16, 2005 - 12pm Central time zone
Reviewer: Andrew Max from Russia
Hi Oraboy,

Thanks for your response but I still have a problem with it.

> open cur_c1 for 'select * from test_t where c1='|| p_c1 ||' for update wait' || 
p_willing_maxwait;

Huh?... Not sure I would use this. If such code is "rarely" executed -- well, may be... But 
re-executing this using many different p_c1 and p_willing_maxwait would force Oracle to hard-parse 
each brand new statement again and again, thus littering shared pool and killing scalability.

"Parse as little as possible" -- this is Tom’s mantra, and I agree 100% with it.

Consider:

SQL> select /* TAG */ * from Emp where EmpNo = 1
  2   for update wait 1;

EMPNO EMPNAME
----- ----------
    1 John Smith

SQL> select /* TAG */ * from Emp where EmpNo = 1
  2   for update wait 2;

EMPNO EMPNAME
----- ----------
    1 John Smith

SQL> select /* TAG */ * from Emp where EmpNo = 1
  2   for update wait 3;

EMPNO EMPNAME
----- ----------
    1 John Smith

SQL> column SQL_TEXT format a65
SQL> set numwidth 4
SQL>
SQL> select s.SQL_TEXT, s.CHILD_NUMBER CH
  2   from v$sql s
  3  where s.SQL_TEXT like 'select /* TAG */%';

SQL_TEXT                                                            CH
----------------------------------------------------------------- ----
select /* TAG */ * from Emp where EmpNo = 1  for update wait 3       0
select /* TAG */ * from Emp where EmpNo = 1  for update wait 2       0
select /* TAG */ * from Emp where EmpNo = 1  for update wait 1       0

Just look at that: different SQL areas, different execution plans -- say good bye to scalability 
and performance. Bind variables really rock. And I would prefer parse query once, use binds and 
re-execute it many times rather than resorting to dynamic SQL.

But unfortunately we can not use binds to specify WAIT timeout ...

Thank you again, and agree with you: our discussion is surely off-topic and I'd better stop here 
... ;)

Cheers,
Andrew.

P.S. Tom, sorry for spamming this thread. 


5 stars LIKE operator   November 16, 2005 - 5pm Central time zone
Reviewer: RAVI from Dallas TX USA
Hi Tom,
       I am not sure whether, my request fits here or not, I apologize if I have posted in a wrong 
place. 
      below are two sql statements in first I am using LIKE operator and passing a absolute value, 
but I want to pass that value using a variable where the value of the variable changes. but in this 
case how would i substitue %, if I have it in the variable, it is loosing its special value.
       In the second sql statement I did it using substr function but it is bit slow, is there any 
other way to do it. can you please suggest me any work around

SQL> select count(*) from patient_enrollment where 
group_id like '6257%';

  COUNT(*)
----------
   1164589
Elapsed: 00:00:04.22

SQL> var client_id varchar2(15);
SQL> exec :client_id := 6257;

PL/SQL procedure successfully completed.
SQL> select count(*) from patient_enrollment where 
substr(group_id,0,length(:client_id)) = :client_id;

  COUNT(*)
----------
   1164589

Elapsed: 00:00:33.19

 


Followup   November 16, 2005 - 6pm Central time zone:

but in this case how would i substitue %, if I have it 
in the variable, it is loosing its special value.

i don't know what that means?



but seems you want:  where group_id like :client_id||'%';

 

5 stars To Ravi   November 16, 2005 - 6pm Central time zone
Reviewer: oraboy from MI,USA
Will this work?

SQL> select count(*) from patient_enrollment where 
group_id like :client_id||'%' ;
 


5 stars that works   November 16, 2005 - 10pm Central time zone
Reviewer: Ravi from dallas TX USA
Thank you Tom, and thank you Ravi. sorry for confusing you, but that's what I was looking for

Thank you,
Ravi 


5 stars May be.....   November 16, 2005 - 11pm Central time zone
Reviewer: Muhammad Ibrahim from Hongkong
1) nice to have some of usefull scripts/functions/codes which were provided by you and others 
inside some oracle packages/Apis like dbms_utility. so that it will be well tested in performance 
wise, everyone in the world use the same functionality and ofcourse easy to use!

   eg: scripts like : 
                  owa_sylk
                  mail_pkg
                  spell_number/Spell out numbers to words
                  who_called_me and who_am_I
                  whoami
                  tkfprof
                  runstats etc...

2) include leap_year in the date functions
   eg: leap_year[year] like next_day()

3) more exception handling
   eg: no_data_found for implicit cursor.

4) utl_file may support to store the files in the client side too.

5) greatest/least as sql function like max/min.

6) some more mathematical/scientific formulas like sqrt etc as SQL functions.


Regards,
Ibrahim. 


Followup   November 17, 2005 - 8am Central time zone:

1) many of them are (the who functions for example...  tkprof, mail_pkg is utl_mail)

3) ?  no_data_found is there for implicit cursors

4) that would be called a "virus".  plsql is running in the *server*, only the client application 
itself can touch the client filesystem.

5) ?  they are??  not sure what you mean.

6) ?  it is??? 

3 stars sqlplus   November 17, 2005 - 7am Central time zone
Reviewer: A reader 
Hi Tom, I think you should improve sql plus
Option
1. Fusion sqlplus with perl
2. a perl command line including sql plus command line, or at leats the more important

I don't think in window program, command line is still nice. But with more commands and options 


5 stars to Muhammad Ibrahim   November 17, 2005 - 8am Central time zone
Reviewer: Peter from UK
You can get square roots like this!

SQL> select exp(ln(144)/2) from dual;

EXP(LN(144)/2)
--------------
            12

 


Followup   November 17, 2005 - 8am Central time zone:

ops$tkyte@ORA10GR2> select sqrt( 5 ) from dual;

   SQRT(5)
----------
2.23606798


it is already (and has been) a builtin. 

5 stars Sqrt using LN and EXP   November 17, 2005 - 8am Central time zone
Reviewer: Bob B from Mechanicsburg, PA
Try getting the sqrt of 0 with that ;-) 


Followup   November 17, 2005 - 8am Central time zone:

ops$tkyte@ORA10GR2> select sqrt(0) from dual;

   SQRT(0)
----------
         0
 

5 stars   November 17, 2005 - 8am Central time zone
Reviewer: Dave from UK
It was the other comment he said couldn't be done

SQL> select exp(ln(0)/2) from dual;
select exp(ln(0)/2) from dual
              *
ERROR at line 1:
ORA-01428: argument '0' is out of range

 


Followup   November 17, 2005 - 8am Central time zone:

I understand, I'm just following up with the right way to get the sqrt. 

5 stars   November 17, 2005 - 8am Central time zone
Reviewer: Alberto Dell'Era from Milan, Italy
The power of IEEE floating-point arithmetic "infinity":

SQL> select exp(ln( cast(0 as binary_double) )/2) from dual;

EXP(LN(CAST(0ASBINARY_DOUBLE))/2)
---------------------------------
                                0 


5 stars nice   November 17, 2005 - 10am Central time zone
Reviewer: A reader 
however
select exp(ln( cast(-1 as complex_number) )/2) from dual;
still does not work 


5 stars   November 17, 2005 - 10am Central time zone
Reviewer: Muhammad Ibrahim from Hong kong
3) no_data_found for implicit cursor 
   i know and i am following your trick like
   for r_something in ( select ... ) 
   loop
     l_found := true;
   end loop;
   if not(l_found) then
     means noting found do what ever..
   end if;
   instead of this exception handling for when no_data_found for the implicit cursor may be just 
like exception handling for normal plsql blocks.

5) sorry i meant in other way round. we can not use min/max in plsql code or is it possible??? so 
normally i use greatest/least in plsql code. 

6) sqrt i know it is there i meant like this function may be some other usefull mathematical 
functions which is more usefull in business side like commercial applications. may be some ready 
made formulas! tom this is just a thinking only :-) 


Followup   November 18, 2005 - 7am Central time zone:

3) that doesn't make sense to me - it is not an error or anything to have zero rows.  ;)   


5) min/max are aggregates - greatest/least are comparable equivalents for scalars...

6) sorry, I was looking for concrete examples - there are a wealth of math functions in the 
database - from analytics with linear regression to the new matrix packages in 10gr2 and so on... 

5 stars Oracle load testing   November 17, 2005 - 11am Central time zone
Reviewer: canuck 
This may be of interest to the reader who was looking for a load testing tool (free, open source): 
http://hammerora.sourceforge.net/about.htm
"Hammerora is used to parse Oracle trace files and convert them into Oratcl programs that can then 
be replayed against the Oracle database with multiple users.

The tool came from the desire to simulate a number of users against the database as an aid to 
learning. Thereby a small home-based learning/developing system could simulate more closely a 
production environment. It has grown into a tool that can load test an Oracle database from the 
smallest development system through to large RAC based clusters.

TCL has been used as it provides high performance OCI interaction with an Oracle database without 
the inconvenience of needing to recompile generated programs. Each generated program has strict 
TCL/Oratcl compliance and can therefore be run independently of Hammerora at the command line TCL 
Shell. The power and flexibility of TCL means that the potential functionality is unlimited. The 
TCL Threads package is used to establish multiple connections against a Oracle 8i,9i or 10g 
Database." 


5 stars   November 17, 2005 - 1pm Central time zone
Reviewer: Alex 
Whoo-hoo we're up over 300 posts now.  What do I win for submitting the record breaking question ;) 


5 stars What do you win ...   November 18, 2005 - 8am Central time zone
Reviewer: A reader 
A cookie!!! ... for your machine (boooo) 


5 stars   November 18, 2005 - 5pm Central time zone
Reviewer: Alex 
I'm just glad I didn't get banned for causing Tom all kinds of extra work.... 


5 stars import show=y   November 25, 2005 - 12pm Central time zone
Reviewer: Andrew from temecula, ca usa
Tom,

If import had an option of the show command to indicate one ddl per line that would make it much 
more usable.  either one per line or some other tag that would make parsing it deterministic. I 
know dbms_metadata extracts ddl but export/import has ddls in the correct order for recreation.  
I've taken out the quotes and tried adding the lines together but it takes a full scrub of the file 
each time.  


5 stars export from rman backups   December 4, 2005 - 7pm Central time zone
Reviewer: Gianluca from Torino, Italy
nice feature I found on DB2 zOS: the ability to uload (export in Oracle terminology) data from a 
COPY (rman backup in Oracle terminlogy).

on zOS, we use it for these useful things (consider we keep 2 months of daily full backups over GDG 
files on tapes)
- we avoid daily exports (saving time and disks/tapes) and performing them "on request", usually 
for moving data from production to test or similar requests from developers
- we can run an export from the past (yes, you could save exports as well as rman backup, I know, 
but that means extra time and space)
- we can export on another system (es. test machine) avoiding cpu and I/O laod, using rman files
- we can have consistent exports even with lots of activity during the run (full backup alwayes 
gives you a consistent image thanks to archived logs)
- you can restore the content of a single table in a multitable tablespace from rman backups 
without restoring the entire tablespace in a commodity instance (tools like BMC do that for you but 
you still need a complete tablespace recover  in a dedicated instance)
 


5 stars Is the new MetaLink built using HTMLDB?   December 19, 2005 - 10am Central time zone
Reviewer: A reader 
It looks familiar. It is also slow, but hopefully they will work the kinks out. 


4 stars Oracle stress test,   December 19, 2005 - 7pm Central time zone
Reviewer: sns from austin,tx
Tom,

I am using this thread for my general question.

Tom,

We have a situation that the application with web server and Oracle 9i database needs a stress 
test.  The database is about 10 GB (not a big one), but the application is pretty complex (like 
logging time for employees and so on).

The application along with the database is delivered to customer.  

From our end we need to simulate that 500 users are logging into the database , run the reports, do 
DML activities on certain tables (assuming all the 500 could do DML activities) and so on.

I need your suggestion on how to go about this.  If you have already done something like this could 
you please share your ideas (in detail if possible)?

Thanks 


Followup   December 20, 2005 - 8am Central time zone:

... I am using this thread for my general question. ...


why?  why would you do that - especially after reading:

Please limit this to a comment or question relevant to the other text on this page.

In order to permit NEW questions on this site, I am taking the firm stance that anything deemed a 
'new question' asked here will be ignored.

Please think about what you are going to put into here and unless it is very relevant to the 
existing thread -- a true FOLLOWUP or REVIEW or CLARIFICATION, please do not post it.

This will allow me to accept new questions (I took 2,000 less in 2004 than 2003, but only because I 
followed up to 3,000 'reviews' that were actually new questions). This is by popular demand -- we 
need 'fresh blood' in there. 

???


there are hundreds of stress test tools, google will likely be hugely helpful.

http://www.google.com/search?q=oracle+stress+test+tool&start=0&ie=utf-8&oe=utf-8&client=firefox-a&rl
s=org.mozilla:en-US:official

4 stars got it,   December 20, 2005 - 4pm Central time zone
Reviewer: sns from austin,tx
Tom,

Actually I searched the site for "stress tool" and couldn't find one and have to force my question 
in this thread. 

I will make sure this does not happen again.

Regards, 


5 stars Followup   December 23, 2005 - 11pm Central time zone
Reviewer: Michael Friedman from Shenzhen, China
1.  Lack of proxy capability within the DB - we should be able to log onto a non-[rivileged 
account, authenticate ourselves, and then have our connection switched to a selected privileged 
account.

TK: That is not within the database.  We have that ability in the database, sqlplus doesn't "do it"

Well, it's not just SQL*Plus - this should be core PL/SQL functinality.  There is an undocumented 
system privilege, "become user".  It's used by IMP/EXP.  I would like similar capability.

--

2.  Merge statement should take multiple actions just like Insert

TK: it does - when matched, when not matched.  you can insert and update and delete from a table 
???  

You should be able to merge into multiple tables at the same time just like with Insert.

--

3.  The current move away from PL/SQL and transactional interfaces to many components needs to be 
reversed.  For example, there is no way to make use of CDM SDK direct from PL/SQL while maintaining 
transaction atomicity, etc. 

TK: that seems to be a contradictory statement?  You say "don't go components" but then say "we 
need interface to components"?  (frankly, I don't know what the CDM SDK is..) 

Sorry... that's CMSDK.

I don't care how you build things as long as I get transactional PL/SQL APIs to them.  How can I 
get a document in Oracle Forms and then save it to CM SDK in the same transaction as I save the 
other form data?  I can't... Oracle seems to be turning its back on its core strength - an 
amazingly functional and reliable transactional platform.

--

Here's a fourth complaint...

Why the heck is there a BITAND operator but no BITOR, BITXOR, or BITNOT?

I'm using UTL_RAW now to replace what should be core DB functionality.

 


Followup   December 24, 2005 - 9am Central time zone:

1) you have it, it is called n-tier proxy authentication - that is your interface to it.  That is 
how you and I can perform this exact feature.  It does and has existed since 8i of the database.

2) that would be entirely ambigous - I disgree very much with that idea.  If I merge into "t1 and 
t2" using "t3" and I find a row in t2 that matches - but not in t1 - should I insert it?  if not, 
why, if so why?  And if a row matches in both t1 and t2 - should both be allowed to be updated and 
so on.

and if I don't have a match on either t1 or t2 - into which table should the row go?  and why?

Whereas it makes sense to be able to take a "set" and insert any given row into any number of 
tables (we control completely what table(s) the given row goes into) - it does not make sense to me 
to merge into multiple tables.

We can use multiple tables as the "input" to build the set - but to merge into multiple table for 
me raises more questions than answers.

 

5 stars Raptor   December 29, 2005 - 3am Central time zone
Reviewer: Joe 
Raptor is now available for download.

http://www.oracle.com/technology/products/database/project_raptor/index.html
Cheers!
 


5 stars Hmmm...   January 6, 2006 - 12pm Central time zone
Reviewer: Dave from Eden Praire, MN
Preamble- For the most part Oracle rocks.  It has kept me gainfully employed for a number of years. 
 Glad I didn't bet on Ingres in 1996...

My "What don't you like about Oracle?" list...

1. <rant> Silly bugs in released products.  I understand the esoteric critters but there were a 
number of releases and patches that were released profoundly QC-challenged.  I remember an flawed 
8.x patch that ruined two days of my life and was not revoked for two weeks after my TAR fingered 
it.
2. No courier font in the metalink forum posts.

What I'd like to see... 
1. A raptor or sqlplus utility to show side by side 
a. Expected return set for each explain plan stage (already there) vs the actual rowcounts , 
timings, I/Os  for each nesting/hash stage (event 10046 without manually processing traces)
b. If the CBO is "surprised" by a cardinality allow it to learn and update by the actual results or 
additional stat gathering. 
c. Feedback if the query's plan would have changed and allow a rerun of the new plan.

2. An EM utility showing horizontal bars representing the start/stop intervals for every active and 
inactive SQL statement (for span "X" subject to a resonable number).  The x-axis would be time and 
the y-axis hash value.  This concurrency visualization can be quite useful but is a pain to do 
manually.

Let me know if I need to rtdm...

Regards,
-Dave
 


Followup   January 6, 2006 - 2pm Central time zone:

what I'd like....

1.b - is there, 10g SQL Profiles 
1.c - not sure what you meant?

 

5 stars Forgot one   January 6, 2006 - 1pm Central time zone
Reviewer: Dave from Eden Praire, MN
Tom,
Forgot one.

The ability to specify and use a RAM-only landing location for a source temp set using Oracle's 
"WITH temp AS" SQL structure. This would help with that class of problems where you want to use a 
large SQL source set a number of times/ways (where inline views and global temp tables might be 
awkward) and you want to avoid re-pulling the direct reads for every UNION set underneath. 

There may be an existing elegant solution I'm unaware of.  I'm sure you'll let me know...

Regards,
Dave 


4 stars multi-merge   January 6, 2006 - 7pm Central time zone
Reviewer: Michael Friedman from Shenzhen, China
TK:  Whereas it makes sense to be able to take a "set" and insert any given row into 
any number of tables (we control completely what table(s) the given row goes 
into) - it does not make sense to me to merge into multiple tables.

Why not?  Why can't we use the same methods we use to control which tables the insert rows go to to 
control which tables the merge rows go to?  You could even use almost the same syntax.

 


Followup   January 7, 2006 - 9am Central time zone:

how would that be any more efficient than "multiple merges"

Think about the activity that would take place - you would just be saying "hey, if x=5, merge into 
T1, if x=6 merge into T2 if x=7 merge into T3" - meaning you need three separate joins in the first 
place - nothing at all would be gained (beyond enourmously complex syntax) by doing this in a singl 
DML statement.
 

3 stars Rename an Oracle Directory   January 15, 2006 - 10am Central time zone
Reviewer: Michael from Allentown, PA
It would be nice if we could rename an oracle directory, or alter it to point to a different 
location. I know the rename command does not specify this, but I can't imagine why. I can not find 
any reference to a command to do it, or even alter a directory. We are on 9.2.0.5 on Solaris. 
Logged in as sys:

SQL> create directory pooper as '/u02/ftpdata/davox/pooper';

Directory created.

SQL> rename directory pooper to popper;
rename directory pooper to popper
                 *
ERROR at line 1:
ORA-00946: missing TO keyword


SQL> rename pooper to popper;
rename pooper to popper
*
ERROR at line 1:
ORA-04043: object POOPER does not exist

etc.

alternatively, it would be okay to do the following:

alter directory accts as '/f06/ftpdata/davox/accts'; assuming you had already created a unix 
"accts" directory in that location on the server. (the current directory location is /u02).

We have about 20 directories on our development server that we want to relocate to a new file 
system to better mimic production. (We did not have the ability to do this when the database was 
originally set up). Seems right now I would have to drop and recreate all of the directories, redo 
grants, etc. 

If we had any references in any code to the old path (it would be unusual), we would be more than 
happy to replace that code with the production version, which would almost always work right out of 
the box because the development database directories and external tables would be named (and 
located) just like in production.



 


1 stars Merge with Conditional Insert   January 19, 2006 - 9am Central time zone
Reviewer: Koshal from Rockville,US
It is great we had merge statement in Oralce. 
One of things I would like to have is the ability to filter the records. Normally  out of the 100 
records that I Process 10 records I would like to Update,
89 Records I would like to Insert and One record I would to 
ignore/put them in error log table.

MERGE INTO t1
 USING      t2 
on (t1.col1=t2.col1)
 WHEN MATCHED THEN
  UPDATE
    SET t1.col2 =t2.col2  /* where  t1.col>10 */
  WHEN NOT MATCHED THEN
/* case when t1.col<20 */
INSERT (col1,col2,col3)
values (t2.col1,t2.col2,t2.col3) /*where t1.col<20  */

/* else
insert into err_log(err_message) values('invalid values '||t1.col) end ; */

Something like this is more common in business application.
In this way the entire routine can be accomplished by a single SQL Statement.  


5 stars Merge   January 19, 2006 - 10am Central time zone
Reviewer: koshal from Rockville, US
1. It would be nice if we had merge with Returning Clause and insert (within merge)  with select 
clause /where clause.
2. It would be nice if we can query from PL/SQL Table in the same way as we query a table/temporary 
table.
3. It is better if we have isnumber(),isnull() function Rather than using translate etc. or pl/sql 
functions. This is especially usefull when u r migrating from legacy systems to Oracle, wherever 
data cleasing is required.
4. Ability to  Automatically Analyze(Mark as needs analyze) if the table Size has grown  by X%. 
6. A better V$session_Lonops atlease in case of  query single table. Needs to shown Estimated Time 
for the Whole Query Not a part.
6.Ability to have default value for a column referring to another column. In the below example in 
99% of cases i would be inserting value for y but wherever i dont insert it should take the default 
value as x
create table t1(x number, y number default x-2)
                                           *

Thanks
Koshal
 


5 stars   January 20, 2006 - 11am Central time zone
Reviewer: Alex 
This shouldn't compile:

SQL> declare
  2     type rc is ref cursor;
  3     ref_cur rc;
  4     v_dummy number;
  5  begin
  6     open ref_cur for
  7       select 1
  8       into v_dummy
  9       from dual;
 10  end;
 11  /

PL/SQL procedure successfully completed.

And this will run successfully up until 10g, then it will throw a run-time error. 


3 stars Problem With Metalink   January 28, 2006 - 1pm Central time zone
Reviewer: A reader 
Tom, Sorry to post the question here.
I am unable to login to Metalink from the time it moved to HTMLDB.
Any idea or solution. I cannot report this problem to Oracle as Metalink itself is not available.

Any browser setting issue ?? 


Followup   January 29, 2006 - 8am Central time zone:

metalink is, has been and will be available - please try again, it has been working from the very 
time it was ported over (and given that you pay for metalink, I cannot imagine you would be paying 
for something you cannot access - doesn't make sense??)

That and I have no idea what you are refering to here as far as a problem goes... No idea what 
problem you might be having. 

2 stars Use of multi-merge   January 29, 2006 - 11am Central time zone
Reviewer: Mike Friedman from Shenzhen, China
I asked for multi-merge functionality just like the existing multi-insert.

Tom responded:

----
how would that be any more efficient than "multiple merges"

Think about the activity that would take place - you would just be saying "hey, if x=5, merge into 
T1, if x=6 merge into T2 if x=7 merge into T3" - meaning you need three separate joins in the first 
place - nothing at all would be gained (beyond enourmously complex syntax) by doing this in a singl 
DML statement.
---

Same benefit as with multi-insert:

1.  You are guaranteed that the result from the driving query remains the same for each merge
2.  You do not need to run the driving query three times - an important issue if it is slow
3.  By only specifying the driving query once instead of three time you reduce the opportunity for 
errors and produce clearer and more transparent code
 


5 stars Can i use hints in the query clause of export?   February 7, 2006 - 6pm Central time zone
Reviewer: ravinder matte from austin,TX
Thanks 


Followup   February 8, 2006 - 1am Central time zone:

nope, you provide a where clause, hints don't go there (well, ok, if you have a subquery in the 
where, you could hint that query block) 

4 stars Oracle front-end?   February 8, 2006 - 12pm Central time zone
Reviewer: Ashutosh 
After working on Oracle from versions 8 through 10g (and on Forms 3.0, incidentally) I believe I 
can make this statement: Oracle lacks in a solid front-end for its database. Even with Forms 3.0, I 
remember that the extremely tiresome and intimidating key-sequences discouraged a new user from 
adopting it as a standard front-end, but I guess that is history now. This lack of a sound 
front-end from Oracle Corp. has spawned numerous third-party vendors offering "easy-to-use" 
front-end software for Oracle databases. This usually translates to an additional investment for 
the user - in addition to what he/she paid for an Oracle license. I wish Oracle database came 
bundled with an all-encompassing front-end application, for all platforms, that would totally 
obviate the need of third-party software. Something that encompasses the functionality of PL/SQL 
Developer & TOAD, two of the most popular "front-ends" around. How many third-party vendors are 
there who provide "easy-to-use" front-end software for MS SQL Server? Hardly any, to my knowledge. 
Can people at Oracle take a cue from this fact? 


Followup   February 9, 2006 - 4am Central time zone:

Have you ever looked at htmldb?  It's been around for a while. 

5 stars Alter table unmigrate   February 22, 2006 - 1pm Central time zone
Reviewer: A reader from San Francisco
A utility to un-migrate migrated rows.  The utility does not make indexes unusable, as "alter table 
move" does.  The utility shares the following characteristics with online segment shrink:

Segment shrink is an online, in-place operation.
DML operations and queries can be issued during the data movement phase of segment shrink. 
Indexes are maintained during the shrink operation and remain usable after the operation is 
complete.

Unmigrating rows is an online, in-place operation. 
DML operations and queries can be issued during the operation. 
Indexes are maintained during the operation and remain usable after the operation is complete. 

Syntax:
ALTER TABLE employees SHRINK SPACE;
ALTER TABLE employees UNMIGRATE ROWS; 


5 stars New features in next release   March 8, 2006 - 6am Central time zone
Reviewer: Anil Pant from Hyderabad
Tom,
May be you have been asked these questions many times. But please take sometime in answering my 
queries. 

(1) Every release of Oracle has some new features. I was wondering what do you think will be the 
new features in next release?

(2) Say after 10 years or after 2-3 releases from now, what new features will be available? Agreed 
some of the core functionalities will remain intact but other than that will there be any 
significant change? Iam asking from a developer&#8217;s and DBA&#8217;s perspective.

(3) Every release is easing (talking about LMTs, PCTFree and PCTUsed) the work of DBA. How do you 
see that in future releases?

(4) 10 years back there were DBMS packages like DBase, FoxPro and Clipper which would to solve the 
business needs (Iam referring to small and meduim size companies) Since these were not able to 
handle the amount of data and had other performance issues, RDBMS has taken over them. I do agree 
there are many companies which still run on these DBMS but the number has come down. 
Do you see something of this sort happening with RDBMS? By the way, please don't feel bad.

Thanks
 


Followup   March 9, 2006 - 12pm Central time zone:

1) no comment right now, bit early.


2) see #1 :)

3) more of it happening, we add more stuff for you to do, we better make the mundane tasks more 
automated.

4) no, not really, I seem the becoming more important - for the reasons you listed that the others 
have gone away for. 

5 stars My single largest beef   March 9, 2006 - 3pm Central time zone
Reviewer: Asher from IL USA
Is in direct relation to PL/SQLs error handling. Quite honestly... when compared to most of the 
newer languages that have come out, oracle's error handling capabilties are left lacking.

In order to generate a named exception with a text message you have to A: declare the exception, B: 
use a pragma to assign a number to the exception, and C: then use a seperate procedure which you 
can not directly reference your named error in to get the number out of it. Quite honestly and 
simply, I'd love to be able to write 'My_Custom_Exception Exception(-20000)' and cut out the pragma 
exception_init, and then be able to do a raise My_Custom_Exception, "Usefull application error" (or 
raise_application_error(My_Custom_Exception, "Usefull application error") )

It is quite honestly one of my largest annoyances with PL/SQL. I don't wanna need to memorize all 
of my error codes, or write database tables & functions to store them all away. I'd also like to 
have access to more then a mere 1000 different error numbers for raise_application_error, as in a 
large installation going through 1000 error codes would be exceedingly easy.

My final annoyance is with the lack of ability to, programatically, access the call stack. It may 
seem like a fairly simple thing, but in atleast one occasion (the one I've been doing most of my 
work in over the past couple of months) it'd be usefull to be able to read that so it can be 
displayed. I'm writing procedures which are accessed through the OAS, and if one of those 
procedures has a problem it can sometimes be a pain in the ass to diagnose.

As a result I've resorted to committing the ultimate evil (atleast by your eyes, not that I can 
really fault them) and I've put a when others clause on many of my procs which does an htp.p with 
the error code and message because it's the best I can manage to do. 


5 stars   March 9, 2006 - 4pm Central time zone
Reviewer: Alberto Dell'Era from Milan, Italy
desiderata: Having an all_ind_modifications that records modifications on indexes (same thing that 
all_tab_modifications do for MONITORING tables).

I just have this huge DWH table that gets MERGEd, 99% updates and 1% inserts - would be happy to 
skip the analyze of the immutable PK (and other indexes that aren't defined on the updated columns 
and so aren't "stale") most of the time.

Another example with GLOBAL indexes - when I drop a partition using UPDATE GLOBAL INDEXES, maybe 1% 
of the global index gets updated - I'd like to analyze them only when it's needed. 


3 stars Check whether a particular query ran in parallel or in serial   March 27, 2006 - 12pm Central time zone
Reviewer: Anto 
Hi,

Some column in V$sql ( or in any other dictionary table) to check whether any past query (select ) 
against the database, ran in parallel or not - or is this already available in some other dict. 
table ?

thanks
Anto 


Followup   March 27, 2006 - 3pm Central time zone:

v$sql_plan would be the place to peek - what plans are in there that represent parallel plans. 

4 stars   March 28, 2006 - 10am Central time zone
Reviewer: A reader 
Hi,

Suppose a parallel query - which would have run in parallel under normal circumstances, ran in 
serial due to parallel_max_processes reaching their maximum limit.

Will this be reflected in v$sql_plan ?  I guess not, since that just shows the plan which would be 
used, not the actual one used

thx
Anto 


Followup   March 28, 2006 - 4pm Central time zone:

v$sql_plan shows the actual plan, always the real actual plan - but it would still be a "parallel", 
it just would have used less execution servers. 

4 stars   March 28, 2006 - 10am Central time zone
Reviewer: A reader 
Does V$SQL_PLAN contain the plan of  all the SQL s after the instance restart or is it also like 
V$SQL which contains only the latest SQL's for the past few hours or so ?

thx
Anto 


Followup   March 28, 2006 - 4pm Central time zone:

things can age out of there, definitely.

it will not have the plans of EVERY query ever executed in that instance since startup in general. 

4 stars   March 29, 2006 - 6pm Central time zone
Reviewer: A reader 
Hi,

Let me rephrase the question in another way :)

Suppose

SELECT * FROM V$sysstat a where a.NAME like '%Parallel  operations downgraded%'   

shows there are 1300 operations which were downgraded to serial('Parallel operations downgraded to 
serial')  due to lack of parallel processes or whatever reason it may be

Is there any way we can find out which were these 1300 operations ?

thanks
Anto

 


Followup   March 29, 2006 - 7pm Central time zone:

no, because the v$ views are instance wide, not statement by statement executed. 

4 stars   March 29, 2006 - 6pm Central time zone
Reviewer: A reader 
 >> v$sql_plan shows the actual plan, always the real actual plan 

thanks for this info,  but I remember you saying in some other thread that columns like TEMP_SPACE 
in this V$SQL_PLAN contains an estimate of the temp. tablespace usage anticipated, not the actual 
temp. space used by the query - is that right ? 


Followup   March 29, 2006 - 7pm Central time zone:

that is correct, but that is the query plan that was used. 

3 stars limit on pramametrs   March 30, 2006 - 11am Central time zone
Reviewer: satya from usa
is there a limit for the number of the paramaters to be pass into the procedure  we are using 8.i 
in prod and 9.i in prod  


Followup   March 31, 2006 - 11am Central time zone:

not that I've ever hit and I tested over 1,000 at one point (would never actually DO THAT - used 
1000 as an unreasonable upper bound) 

5 stars Limit on parameters   March 30, 2006 - 1pm Central time zone
Reviewer: 3360 
64 K

http://download-west.oracle.com/docs/cd/B10501_01/appdev.920/a96624/e_limits.htm#LNPLS018
 
http://forums.oracle.com/forums/thread.jspa?messageID=996304󳏐
 


3 stars Broken link above   March 30, 2006 - 1pm Central time zone
Reviewer: 3360 
http://forums.oracle.com/forums/thread.jspa?messageID=996304
Should have & # 996304 on the end with no spaces, but it keeps getting chopped off. This is a bit 
better 


5 stars select * except col1 from t;   April 3, 2006 - 7pm Central time zone
Reviewer: Jack from Little Rock, AR USA
Wouldn't it be nice if we could select all but a few columns from a table by listing only the ones 
we don't want?  For example:

create view restricted_emp_vw
as
select * except salary
from emp_tb
;

Or this:

create table dedupe_tb
as
select * except my_row_number
from (
     select a.*,
            row_number () over 
              (
              partition by id order 
              order by date_added desc
              ) my_row_number
     from dupe_tb a
     )
where my_row_number = 1
;

 


5 stars Easier unusable indexes   April 24, 2006 - 2pm Central time zone
Reviewer: Stewart W. Bryson from Atlanta, GA
Tom, tell me if this seems conceivable:

It would be great if I could issue a DDL statement against a partitioned table that would prepare 
all LOCAL indexes to immediately become unusable if a DML statement were going to touch that 
partition. Something like: "alter table set local indexes to unusable on dml;" That way, oracle 
could just set all the indexes for a particular partition to unusable as soon as a DML statement 
started to work on that partition, but leave the other partitions of the local indexes as usable. 
After the load was done, I could simply issue: "alter table rebuild local unusable indexes".

That would really change things for ETL developers. Not as big of a paradigm shift as the DML 
logging clause in 10gR2 or the MERGE in 9i... but still big. 


3 stars "indirect index"   April 25, 2006 - 1pm Central time zone
Reviewer: just nobody 
If table had a primary key then it would sometimes be beneficial to have a secondary index that 
would not use rowid to point to row, but have primary key value instead.  In index would have this 
primary key by definition, then there would be no need for any "extra pointer to row".

Just like Index organized tables have. 

There are some cases where actual reference to table is not needed. Only information contained in 
index.  


Followup   April 25, 2006 - 2pm Central time zone:

we call that a concatenated index

create index on t( primary_key_col1, primary_key_col2, ..., 
                   another_column, another_column2 );

 

5 stars followup to earlier response   April 25, 2006 - 4pm Central time zone
Reviewer: Jeff from NJ
Tom, I have a question regarding one of your earlier responses to a comment that I thought sounded 
useful.

"6. Batch commits. When I should be able to do a mass update but ask Oracle to commit at a certain 
frequency only. I could do this by cursors; but a simple SQL will be very useful. Something very 
similar to the commit frequency setting in COPY command."

and you said

"6, I disagree, that would be excessively dangerous.  How do you restart safely such an operation?"

Why is it dangerous?
This could be very useful for not blowing out all your rollback space when you're doing huge DML 
operations.

What if this 'feature' existed and we used it as such to update 50 million rows of a 100 million 
row table.

  update emp set id=10 where status='X' commit every 10000;

If the update fails for some reason after updating just 100,000 rows, why couldn't we just restart 
the update later?

  update emp set id=10 where status='X' and id != 10 commit every 10000;


Maybe I'm over-simplifying things, but I'm not seeing the danger. 


Followup   April 25, 2006 - 11pm Central time zone:

because IN GENERAL updates could be:

update emp set sal = sal*1.1 where status = 'X';


Now what? 

4 stars batch commits - not such a good idea   April 25, 2006 - 5pm Central time zone
Reviewer: John from Chicago, IL
Jeff,

In your example, no problems, but what about this one:

update emp set sal=sal*1.04 where status = 'X' commit every 100000 rows

What happens when that crashes? 


3 stars indirect index   April 26, 2006 - 1am Central time zone
Reviewer: just nobody 
Just trying to clarify my original idea:
In heap organized table your index entry would be

(column1, column1, primarykey_column1, primarykey_column2, rowid)

Now if (primarykey_column1, primarykey_column2) form together the primary key they actually define 
the row in use. There is no need for rowid. Naturally it is faster to fetch the row from heap table 
using the rowid. But there are situations when these kind of index is done to support queries and 
actual row is not at all referenced.

IOT -tables have this kind of index for non primary key indexes. Could this be brought also to heap 
organized tables ? 


Followup   April 26, 2006 - 7am Central time zone:

I don't see this micro optimization that would not be used in most all general cases (an index that 
is never used to access the table) as being useful or implemented myself.   

3 stars Yes, but they are not ALWAYS dangerous.   April 26, 2006 - 9am Central time zone
Reviewer: Jeff from NJ
"because IN GENERAL updates could be:

update emp set sal = sal*1.1 where status = 'X';

Now what?"


The answer is simple.  You don't use the 'commit every' option in that scenario.
If we're going to say NO because it COULD BE dangerous, then there's dozens of other things that we 
shouldn't have in the database because they could be dangerous.  How about truncate?  That could be 
really dangerous if used incorrectly.

I'm just saying that having the option available would be very useful, assuming you use it 
correctly.
 


Followup   April 27, 2006 - 4am Central time zone:

but if you permit it, people will do it.  No, I don't see this as being a good idea personally.   

5 stars more on batch commits...   April 26, 2006 - 10am Central time zone
Reviewer: Jeff from NJ
Better yet, if you know you will need batch commits, just modify the table and add a 'flag' column.

update emp 
set sal = sal*1.1, bulk_update = 'sal x 1.1' 
where status = 'X'
and bulk_update != 'sal x 1.1'
commit every 10000;

If the statement fails, just re-run.
 


Followup   April 27, 2006 - 4am Central time zone:

loop
   update emp set sal = sal * 1.1, bulk_update = 'sal x 1.1'
     where status = 'X'
       and bulk_update <> 'sal x 1.1' 
       and rownum <= 10000;
   exit when sql%rowcount = 0;
   commit;
end loop;


 

2 stars stateless packages   April 27, 2006 - 11am Central time zone
Reviewer: a writer from emea
When using J2ee architecture there is usually not a meaningfull state of database package. Each 
connection is taken from a connection pool, packages are called, sql-statements executed and then a 
connection is released back to connection pool.

If one would define these packages 'stateless' then there would not be (atleast so many) these 
error messages stating 'existing state of package has been discarded' and calls failing.
 


Followup   April 27, 2006 - 3pm Central time zone:

Scary - I have no clue what you are refering to - our latest discussion has been about 
transactional integrity.  What are you discussing? 

4 stars Jeff: “update … commit every n“   April 27, 2006 - 12pm Central time zone
Reviewer: Gabe 
<quote>
Why is it dangerous?
This could be very useful for not blowing out all your rollback space when you're doing huge DML 
operations.
</quote>

Except for the rollback space concern (which can be mitigated without this new syntax) … what would 
be the other advantages?

Otherwise it seems to be just syntactic sugar.

And the existing transactional model is thoroughly impacted … you now have a DML statement which 
commits any pending changes for the existing/current transaction … you have a DML statement which 
in itself represents many transactions. Forget about restart … how do you rollback this entire 
statement?

So unless one changes the entire transactional system the only option is to make this kind of 
"statement" something other than a "DML statement" … which would be a program … which you can do 
right now with a pl/sql procedure taking the update as a string and batch_size as a second 
parameter and dynamically executing the string||'and rownum < '||batch_size and commit until the 
job is finished. Document it commits prior work, document it may commit part way through, document 
reversing the modifications is the end-user responsibility, sql injection maybe, dynamic sql with 
hard parses, etc.

gabe@XE> create or replace procedure run_batch
  2                              ( sql_stmt varchar2
  3                               ,batch_size number
  4                              )
  5  authid current_user
  6  as
  7    stmt varchar2(32000);
  8    sfty number := 10000;
  9    n    number := 0;
 10  begin
 11    commit;
 12    loop
 13      execute immediate sql_stmt||' and rownum <= '||batch_size;
 14      exit when sql%rowcount = 0;
 15      commit;
 16      n := n + 1;
 17      exit when n > sfty;
 18    end loop;
 19    commit;
 20  end;
 21  /

Procedure created.

Elapsed: 00:00:00.06
gabe@XE> select status,count(*) from x group by status;

S   COUNT(*)
- ----------
X      12064

Elapsed: 00:00:00.01
gabe@XE> exec run_batch('update x set sal=-sal, status=''A'' where status!=''A''',1000);

PL/SQL procedure successfully completed.

Elapsed: 00:00:00.19
gabe@XE> select status,count(*) from x group by status;

S   COUNT(*)
- ----------
A      12064

Elapsed: 00:00:00.01

So sure, in theory they could implement something like 'update … commit every n' in the database, 
but that will not be a SQL DML statement any more. 


1 stars stateless packages   April 28, 2006 - 1am Central time zone
Reviewer: a writer from emea
I was trying to discuss about things I don't like about in Oracle.

I don't like about the idea that state of package is kept in situations when from applications 
point of view there is no 'state'.
I would like to get out of these 'existing state of package has been discarded' error messages 
(atleast most of them).

 


Followup   April 28, 2006 - 2am Central time zone:

umm, but like I was saying


Oracle keeps the state of packages that programers who wrote them - included "state".

The developer of the package created a package, wrote a package - that HAS A STATE.

If the developer did not use package global variables - then the package WOULD NOT HAVE A STATE.

If the developer codes a package that does use package global variables - the developer has 
explicitly told Oracle "maintain state"

Oracle does what it is told (usually).  In this case, the developer asked us to maintain a state.

IF YOU DO NOT WANT a state, thou shall not use package global variables and no state will exist.

Still not getting your point, unless and until you write a package that says "hey, I've got a state 
- maintain it" - we won't.  It is entirely up to you. 

2 stars well aware of the cursor approach...   May 1, 2006 - 1pm Central time zone
Reviewer: Jeff from NJ
no one said it couldn't be done, the cursor approach was already mentioned in the previous quote.

"Except for the rollback space concern..."
Gabe, that IS the concern.

All I was saying is that a 'commit every' feature would be nice to have, and is not dangerous if 
implemented properly. 


Followup   May 2, 2006 - 3am Central time zone:

it is - I disagree with you, and we'll have to agree to disagree.  There are many features I wish 
we could "pull" from the database due to the abuse heaped upon them by developers just "not getting 
it" and using them entirely inappropriately, such as:

o autonomous transactions
o when OTHERS in plsql
o TRIGGERS

I will not promote the addition of features that I obviously know will be used entirely 
inappropriately (not when I cannot get features that looked useful - but turn out to be used wrong 
more than they are used correctly - retracted!)


That "commit every N records" is like having a "lets trash data integrity and generate ora-1555's 
as easy as we can" feature (eg: the commit every N records is a ora-1555 just *waiting* to happen - 
you are

o reading table A

o modifying table A

o committing bits of work on table A, allowing the undo to be overwritten - in fact THIS IS YOUR 
STATED GOAL/DESIRE - to overwrite this undo

o but your query READING table A needs those bits of undo you are overwriting in order to get a 
consistent read on table A


so, not only would you have to DEAL with the fact that this statement might fail, you have to deal 
with the fact that the probability of this statement failing is VERY HIGH.   

5 stars Records, Collections and Forall   May 3, 2006 - 9pm Central time zone
Reviewer: Chris Seymour from My desk
I came across an annoying thing today that to the best of my knowledge is still not allowed in any 
version (even 10G).  If this is actually allowed in 10G now I apologize.

I was trying to use forall with a pl/sql table that was made up of records.  Unfortunately I found 
out the hard way that you cannot specify the elements individually, and you can only only use 
forall if you insert the entire record in one shot.  This assumes however that your columns match 
the record order exactly.  I would love to be able to do something like this:

declare
  type r_project is record
  (project_id  number,
   task_id     number,
   parent_task number);
  
  type tb_project is table of r_project 
    index by binary integer;
  
  t_project tb_project;

begin
  --Fill array with values (assume this step is already done)
  forall i in t_project.first..t_project.last
   insert into table 
    (col1, 
     col2, 
     col3, 
     col4, 
     creation_date,
     created_by,
     last_update_date)
   values
    (t_project(i).project_id,
     t_project(i).task_id,
     t_project(i).parent_task_id, 
     'Y',
     sysdate,
     fnd_global.user_id,
     sysdate);

This hits an pls unimplemented feature error.  The workaround (so I'm told) is to create a separate 
pl/sql table for each variable.  It would be nice to be able to use a record and table in the 
format above. 


4 stars Regarding REUSE SETTINGS   May 9, 2006 - 1am Central time zone
Reviewer: Giridhar from India
Hi Tom,
In order to recompile a pl/sql procedure or function
with the same settings (whatever were defined at the time of earlier compilation) in oracle 10G, we 
need to use
REUSE SETTINGS. Otherwise, oracle will take the current session settings. 

Wont this new clause force users the existing scripts/programs to modify to use REUSE SETTINGS if 
we have to take advantage of the new features?

suppose if i want to use the new feature compiler warnings. I recompiled few of my objects using 
new settings.

If i have some scripts, which just recompile without the RESUSE SETTINGS, they would be recompiled 
with default values of the session. 

Wouldn't it be nice to have the new keyword as 
"RESET SETTINGS" instead of "REUSE SETTINGS" if i want to change the settings to current session 
settings and simply use the previous compilation settings by default.

Thanks tom..
 


Followup   May 9, 2006 - 7am Central time zone:

This will force no one to do nothing.

If you want to use a feature, you shall modify your scripts to support the use of such a feature.

Else, you won't.

(not sure why you'd be recompiling manually anyway, I never do, just let it "happen") 

5 stars small fry...   May 17, 2006 - 12pm Central time zone
Reviewer: Robbert from The Netherlands
Hello Tom,

My wishes are actually pretty small compared to the wishes above:
1) DBMS_OUTPUT.FLUSH, or something like that, that flushes out the dbms_output. In the meantime I 
use inserts into a dummy table, but that means committing repeatedly.
2) A public view variation on  DBA_DEPENDENCIES that  lists  whether the tables used are source or 
target tables. This would allow lineage insight of larger batch jobs.
2_sub_A)  A similar public view on the OWB repository.
2_sub_B)  DBA_DEPENDENCIES listing actual procedures/functions besides PACKAGE BODY.

cheers,
Robbert 


Followup   May 18, 2006 - 9am Central time zone:

1) you would have to use a pipelined function - control has to return to the CLIENT application, 
because the client fetches the data and prints it.

So, instead of:

exec some_procedure;

you would

select * from table( some_function );

and your function would "pipe row( 'your message' );".  The flush size would be the client array 
fetch size.


 

4 stars Follow-up to an old post   May 18, 2006 - 3pm Central time zone
Reviewer: Michel Cadot from France
Hi Tom,

I come back to my post above:
http://asktom.oracle.com/pls/asktom/f?p=100:11:::::P11_QUESTION_ID:48704116042682#50678380017237
It now works in 10.2:

SQL> select ( select dummy
  2           from ( select dummy
  3                  from dual b
  4                  where b.dummy = a.dummy
  5                )
  6         ) dummy
  7  from dual a
  8  /

D
-
X

1 row selected.

I didn't check how many levels we can have.

Regards
Michel 


4 stars Correction   May 22, 2006 - 3am Central time zone
Reviewer: Michel Cadot from France
The previous query works in 10.2.0.1 but no more works in 10.2.0.2.
I opened a SR to know which is the correct behaviour.

Regards
Michel

 


3 stars pipelined function vs dbms_output flush   May 23, 2006 - 5am Central time zone
Reviewer: Robbert from the Netherlands
Hello Tom,

your suggestion to use a pipelined function has definite merit if the function of the code is 
generate all this output.
I however tend to use dbms_output for debugging, usually between "if l_debug = 1 then ... end if".
In this case you're actually just waiting for the output to see where it goes wrong.
The flush would do 2 thing:
1 - print the output to screen, even though the procedure is still running.
2 - clear the buffer so that you don't get a buffer overflow when looping through more data. 


Followup   May 23, 2006 - 7am Central time zone:

there is nothing to "flush to", stored procedures run from START to FINISH.  All dbms_output does 
it fills in "an array" and later a client makes yet another call to the database to GET the array 
and print it.


If you want "real time" sort of feedback for debugging, I suggest always to use UTL_FILE.

That way you can generate a trace file (in production for example) and have a dba mail it to you 
for debugging.

That way you can use "tail -f" in test for "real time" feedback. 

5 stars UTL_FILE for debugging.   May 23, 2006 - 7am Central time zone
Reviewer: Robbert from the Netherlands
Good tip.

Thanks! 


Followup   May 23, 2006 - 7am Central time zone:

should mention

http://asktom.oracle.com/~tkyte/debugf
or log4plsql 

http://log4plsql.sourceforge.net/

4 stars   May 29, 2006 - 3am Central time zone
Reviewer: Beroetz 
Isn't this strange?
Consider the following scripts:

ORA9i2 > CREATE TABLE Table1 (a INT PRIMARY KEY, b INT)
OK, done in 1,456 seconds

ORA9i2 > CALL Dbms_Wm.EnableVersioning('Table1')
OK, Done in 1,996 seconds

ORA9i2 > RENAME Table1 TO Table2
OK, Done in 0 seconds  
Oracle has been renamed only the created from WM view, not the table itself!!! Now I can all kind 
of DML operations over the new Table2 view. But:

ORA9i2 > CALL Dbms_Wm.DisableVersioning('Table1')
Error: ORA-00942: table or view does not exist

ORA9i2 > CALL Dbms_Wm.DisableVersioning('Table2')
Error: ORA-20132: table 'Table2' is not version-enabled
So in this situation I can't disable the versioning of the table!!!

I have to rename back the view to disable the versioning:
ORA9i2 > RENAME Table2 TO Table1
OK, Done in 0 seconds
ORA9i2 > CALL Dbms_Wm.DisableVersioning('Table1')
OK, Done in 0.845 seconds

1) Is it a bug? Why Oracle let me rename the system created view?
2) Is there a way to rename the version-enabled table without such unpleasant consequences?

Best Regards! 


Followup   May 29, 2006 - 7am Central time zone:

You are not supposed to perform DDL directly on the workspace manager tables, this is documented in 
the workspace manager guide.  There is in general nothing "preventing" you from doing this (just 
like there is in general nothing preventing you from modifying the data dictionary)

Workspace manager provides an API to perform DDL.

http://download-east.oracle.com/docs/cd/B19306_01/appdev.102/b14253/long_intro.htm#sthref196

4 stars Subquery name resolution   June 9, 2006 - 7am Central time zone
Reviewer: Michel Cadot from France
Hi,

Following up my previous post:
http://asktom.oracle.com/pls/asktom/f?p=100:11:::::P11_QUESTION_ID:48704116042682#64283169182746
The test I made "succeeded" because of a bug in 10.2.0.1 exclusively on Windows XP. It's bug 
n°5240169.
Currently the "correct" behaviour is a limit of one level in the name resolution.

Regards
Michel 


4 stars Idle Time parameter.   June 13, 2006 - 9pm Central time zone
Reviewer: Suren Dharanikota from Milwaukee, WI
Tom,

I have seen this specific issue ":N" number of times now. And i am sure you can use a "Bind 
Variable" for this issue in your forum. ;-)

The last time i talked to you, you have mentioned it that there is an "Enhancement Request" for 
this feature. I am not sure in which release will this come up.

Anyways, When an application is poorly written ( And Is ofcourse poorly written 90% of the times 
),it does`nt not close the connections gracefully after the transaction is completed, even with the 
Idle_time parameter set the Process remains at the server level with a "Sniped status" at the 
database level. It would be nice if Oracle just terminates the connection at the server level. 

1)Why should Oracle care .. waiting for the application to give a hand shake. "Idle time" parameter 
should always take precedence.

2)Once Oracle starts throwing the End-Of-Communication channel errors at the application, they will 
definitely fix there app :).

3) OR ... Oracle should provide a clean-up script/utility which will terminate all the processes 
with "SNIPED" status at the database level and its corresponding server processes.

Thanks,
Suren 


Followup   June 14, 2006 - 8am Central time zone:

I would hope it would NOT close the connections - that would be really bad.

 

3 stars Merge and Lock   June 14, 2006 - 6pm Central time zone
Reviewer: Branka from VA, USA
Should I lock whole table before I start merge? 


Followup   June 15, 2006 - 8am Central time zone:

no, not in general. 

3 stars Merge and Lock   June 15, 2006 - 9am Central time zone
Reviewer: Branka from VA, USA
Can you tell me mora about it?
I have "batch" program that insert data into table that users use at same time. It run 3 times a 
day.
Merge need 2-3 minutes to execute. Can users be able to update / delete data from that table, while 
I am doing merge? 


Followup   June 15, 2006 - 9am Central time zone:

sure, merge will only lock the data it modifies, other users may modify the rest of the data as 
they wish. 

5 stars Merge and Lock   June 15, 2006 - 9am Central time zone
Reviewer: Branka from VA, USA
Thanks a lot.
Just to clarify.
Since, merge modify whole table, I understand now, that from the user perspective it will modify 
one by one row, so it is big chance that merge and user will not try to modify same row at the same 
time. 


Followup   June 15, 2006 - 4pm Central time zone:

merge does not modify "entire table" unless you have a set that will match every row.

If you have a set that will cause every row to be updated - sure, you may certainly use the lock 
table command to ensure you can do the merge "as fast as possible".


but - to say "merge modify whole table" is just not accurate. 

4 stars Is Raptor Working for everybody?   June 15, 2006 - 4pm Central time zone
Reviewer: Maverick 
I don't know about others but When I tried Raptor couple of months back, it took 4 minutes to start 
and bring up it's GUI[??].Takes the same time every time i start Raptor. 

I am not sure if it was just my PC or everybody is facing this problem ..

I am very much frustrated by TOAD [with it's Access violation messages] and when I heard about 
Raptor, felt glad Oracle was bringing it to replace TOAD. But when I used it, my feelings changed 
and stopped using it immediately. It was that slow. Worse, My VSS got associated all SQL's with 
Raptor. Now when I open Code directly from VSS [i know we don't have to], it opens up with Raptor, 
and 
takes sweet 4 minutes to show the code..

I thought of pointing it out, since everyone is talking about Improvements and changes to Oracle 
database and it's Tools.

Thanks, 


Followup   June 16, 2006 - 6pm Central time zone:

try it again . 

5 stars Merge and Lock   June 15, 2006 - 6pm Central time zone
Reviewer: Branka 
Thank you one more time. 
I was thinking about specific problem that I am working on, where I do modify whole table. 
 


5 stars Merge changes pending   June 16, 2006 - 4pm Central time zone
Reviewer: Rakesh Bansal from Chicago
My Wish List

(1) Ability to print column name also when oracle throws error "Inserted value too large for 
column", something like "Inserted value too large for column EMP_NAME, ... ". It is very difficult 
to pin point the column when dealing with table having 200 columns and values are not hardcoded but 
used as variables.

(2) Merge is still throwing error "Unstable set of rows". Remember TOM, you filed a bug on 21st 
Feb'05 when I raised this issue in this forum.

(3) SQL Loader with Insert-Update facility same as of Merge statment or DB2 Import utility. 


Followup   June 16, 2006 - 7pm Central time zone:

1) wish granted

ops$tkyte@ORA10GR2> create table t ( x varchar2(1), y varchar2(1) );

Table created.

ops$tkyte@ORA10GR2> insert into t values ( '1', '1' );

1 row created.

ops$tkyte@ORA10GR2> insert into t values ( '1x', '1' );
insert into t values ( '1x', '1' )
                       *
ERROR at line 1:
ORA-12899: value too large for column "OPS$TKYTE"."T"."X" (actual: 2, maximum:
1)


ops$tkyte@ORA10GR2> insert into t values ( '1', '1y' );
insert into t values ( '1', '1y' )
                            *
ERROR at line 1:
ORA-12899: value too large for column "OPS$TKYTE"."T"."Y" (actual: 2, maximum:
1)


2) give me a pointer - I believe the "bug" was it should have thrown it BOTH TIMES (and I believe 
you never wanted it - so no wish granted)

3) you have it - we call it "external tables" - wish granted. 

5 stars Yes very useful thread   June 17, 2006 - 11am Central time zone
Reviewer: Khalid from MD, USA
Here's what I wish:

I wish pl/sql gave me the ability to skip an iteration in the loop, such as break, and continue 
statement in the C language. without using a goto statement?

for rec1 in c1 loop
  -- How do I skip an iteration?
  for rec2 in c2 loop
  end loop;
end loop; 


Followup   June 17, 2006 - 4pm Central time zone:

I've always used "if" myself (finding continue to be a glorified goto - but very very DIFFERENT 
from break).


eg: instead of:

for rec1 in c1
loop
   if some_condition 
   then 
      continue; -- to skip over rest of code
   end if;

   ...... rest of code ...
end loop;


you code:

for rec1 in c1
loop
   if NOT(some_condition)
   then
     ..... rest of code ....
   end if;
end loop;

same net effect, no "goto" like processing.
 

4 stars Thanks, but   June 17, 2006 - 6pm Central time zone
Reviewer: Khalid from MD
First of all thanks for the response.

Yes 'break' is much different than continue, I have the equivalent of sorts of break in 'exit', but 
I don't have an equivalent of 'continue', is what I should have said, but I ended up saying 
something else (my communication needs some improvement there)

Your solution of using a NOT (some_condition) is what I did this morning also, but I had a 'for 
rec2 in c2' as shown below. Not a problem, but sometimes difficult to read when there are large 
blocks nested.

I don't look upon continue as a glorified GOTO, rather I got this neat way in which I can pre-empt 
from all the extra processing upon a certain condition, and forget about dealing with it.

for rec1 in c1
loop
   if NOT(some_condition)
   then
     ..... rest of code ....
     for rec2 in c2; loop
        .... c2 processing
     end loop;
   end if;
end loop;
 


Followup   June 18, 2006 - 12pm Central time zone:

...
I don't look upon continue as a glorified GOTO, rather I got this neat way in 
which I can pre-empt from all the extra processing upon a certain condition, and 
forget about dealing with it.
.....

but that is "goto" :)  virtually by definition.  Skip over this stuff, goto this place and pick up 
again.


"for rec2 in..." is just part of .... rest of code .....


(in fact - .... rest of code might make a nice subroutine!) 

3 stars cost of procedure in explain plan   June 23, 2006 - 11am Central time zone
Reviewer: A reader 
There should be a method to get the cost of whole procedure/package in explain plan rather then 
looking at all sql's individually. 


Followup   June 23, 2006 - 1pm Central time zone:

the cost of a procedure.... hmmm, think about it...


tell me how to 'cost' this:


  if ( something )
  then
      select 
      if ( something from select is 'x' )
      then
         update
      else
         insert
         delete
         select
      end if
  else
      select 
      if ......



if stored procedures didn't have any sort of procedural processing, then maybe - ust maybe - you 
could "add up all of the costs of all of the sql since they would be all executed"

But then you would have a pretty good "random number that is not useful to use in any sense of the 
word for anything"

 

3 stars Don't likes.....   June 23, 2006 - 4pm Central time zon