Friday, April 27, 2007

ORA-00439: feature not enabled: Online Index Build

If you are getting ORA-00439 for a different feature, you may want to check out other postings concerning this family of error messages.

I was trying to execute this DDL, on my hosted database, a 10.1.0.5 standard edition running on solaris:
alter index CONTEXT_STEM_IDX rebuild online;

ORA-00439: feature not enabled: Online Index Build
This statement is supposed to rebuild a context index online, that is without preventing users from issuing queries against this index while the operation is in progress.

Unfortunately online index build will only work on an Enterprise Edition and a feature comparison list made by Don Burleson back in 2003, presumably for Oracle 9i, seems to support this interpretation.

I tried to locate an official Oracle feature map and indeed i found two, a detailed Oracle Product Feature by Edition and also a web page, but, unfortunately, i can't tell whether this optional feature is listed or not, the closest match i could spot is called parallel index build.
While searching for "feature comparison", i stumbled also on this interesting whitepaper concerning Oracle 10G R2 Online Data Reorganization & Redefinition where there is absolutely no mention of which database edition supports which feature.

If anyone can come up with something more precise on this subject, i'll most delighted to include a link to the document.

At any rate, a less demanding:
alter index CONTEXT_STEM_IDX rebuild;
worked well and rebuilt my index in a few seconds.

If you can't afford to run the risk of blocking any users, you may want to consider rebuilding the index during off-peak hours, by running a scheduled job.

Tuesday, April 24, 2007

ORA-12725: unmatched parentheses in regular expression

Lately i am working a lot with regular expressions.
At first the syntax of regular expressions is rather tough to remember, but after a while a whole world of possibilities opens up to the developer.

One of the most useful features of Oracle's implementation of regular expressions is the support for backreference expressions, sorts of variables holding the values of matching subexpressions delimited by round parentheses "(...)".

While backreference expressions can appear in the regular expression pattern of any REGEXP function and also in the replacement parameter of REGEXP_REPLACE, the example given below applies only to the latter case.

Now you might ask: what's so cool about this backreference expression?
Well, backreference expressions allow you to move around bits of text in an easy way.

Example:

I just registered for the upcoming ODTUG Kaleidoscope Apex Training in Daytona Beach, and i came across a screen where different registration fees were proposed.

Imagine that this information must be stored in a database in a different format, with the currency symbol to the right.

We can do this operation with the help of a regular expressions and function REGEXP_REPLACE.

In the frame below a fully functional Yocoya's Regular Expression Workbench is encapsulated, you can follow the instructions given below and interact with the tool, without leaving the blog.



Then, in the input box containing "put the pattern here" cut and paste:
(\$)([[:digit:]]{1,3})

and in the input box containing "put the replacement here", cut and paste:
\2\1

then click APPLY.

The test report should now display the prices with currency postfix notation.

Backreference expressions must be in the range 1-9 and, as far as i know, you can tell which number refers to which expression by counting the left open parentheses "(" starting from the leftmost position in the pattern, so if we take the following slightly modified expression where i added one more pair of parentheses around it:

((\$)([[:digit:]]{1,3}))
12   3

we'd have to change the replacement string to
\3\2
to keep it working like before.


So, what about ORA-12725?

Try to remove the rightmost parenthesis from
((\$)([[:digit:]]{1,3}))

you'll see that the following error is reported:

ORA-12725: unmatched parentheses in regular expression


This error will be raised only when a round parenthesis is missing, a missing square bracket "[" or "]" would return instead:

ORA-12726: unmatched bracket in regular expression

See you at the ODTUG Kaleidoscope 2007!

Monday, April 23, 2007

Off topic: Routers, VPN gateways, MTU, chili peppers and the unbearable lightness of buyer's comments

If you ask me today what occurs to my mind if you say "1492", i'd reply without hesitation: the perfect value for the TCP/IP MTU parameter of my new router!

I know that 1492 is an important date, actually i am enthusiast reader of books about the discovery of America, the Conquest and so forth, but this fatal number proved to be also the turning point between a crippled network and a perfectly working one.

Some weeks ago i bought a replacement for the "old" VPN gateway router D-Link 804V and, by the way, the ADSL modem and the Wi-fi Access point that made up my network configuration. For some reason i picked the Belkin G+ MIMO and ADSL2 Router Modem.
It's like when you go to the store to buy apples and you come home with a bunch of oranges.
In the end it's just fruit, isn'it?

Finally, last Saturday, i managed to find some spare time to do the swap:
the installation was quick, i just changed the default IP address in order to let my existing configuration work transparently and in a matter of minutes i was on-line, so i decided to download the latest version of SQL Developer and see if there were any problems with relatively "large" downloads.

The first impression was good, but then the download rate began to drop until it stabilized itself at around 80Kb/s, a fairly bad value compared to the 250Kb/s of my previous configuration.

Then i went to download the e-mail and i got mixed results. I downloaded emails without problems from certain servers but i could not get past the "connected" message on others.

Hum, strange, let's try from another computer.
Nope, still the same problem.
But i could not download emails even on my PDA, so i concluded that there must be a problem at the remote site.
I rang the provider and they said that the server was slow even at their site.
Well, hopefully they will fix it by tomorrow, i thought.

On Sunday afternoon i went back to check the email, but there was still the "connected" issue.
I checked with my PDA, but this time i could download my emails from there.

So, just for curiosity i began searching on the internet what people said about this router:
needless to say, opinions ranged from "the best product ever" to the "worst piece of plastic that you can buy".
How can it be that people got such mixed experiences on the same product?

Tired to read dozens of useless reviews, i refined my web search and i started finding some more useful comments of people who had troubles setting up the device.

In particular i found a few comments of people describing poor download rates.

Suddenly i remembered that years ago, when installing the DI-804V, i had had more than a headache trying to figure out the value of the MTU.
I repeated also the manual procedure that allows you to find out (by trial and error) the current MTU parameter using ping:
ping -f -l mtu_value IP_address
If you get an error message, then you must decrease the MTU size, otherwise you can try increasing it.

So, i connected to the console screen of the Belkin router and it turned out that the current MTU value was 1432.
Why did the installation procedure set it to 1432?
Is that a factory default or is it derived after doing some "probing" on the network?

I don't really know and i could not find any clues in the accompanying documentation.

I know that after changing the value to 1492, the maximum allowed by the device, suddenly the email started working again, the download rate increased to 254Kb/s and i could finally go the backyard to seed my favorite chili peppers: guajillo, jalapeƱo, serrano, poblano and chile de arbol, whose cultivation is one of the outcomes of the other 1492, the circle is closed.

Yet there is one outstanding question: how should i rate this router?

Thursday, April 19, 2007

ORA-06550 and PLS-00201:identifier 'NVL2' must be declared

I must admit if was a bit surprised when i saw the following error this morning:

1 error has occurred
ORA-06550: line 4, column 3: PLS-00201: identifier 'NVL2' must be declared
ORA-06550: line 2, column 1: PL/SQL: Statement ignored

What's wrong with NVL2?!?!

Well, i tried using NVL2 as a PL/SQL expression rather than inside a SQL statement.

my_var := NVL2(old_value, new_value_if_not_null, new_value_if_null);

The fact is that there is a bunch of built-in functions like DECODE that have no counterpart in PL/SQL.
And Oracle documentation is a bit naive on this subject because it gives a list of built-in PL/SQL functions and says "refer to the SQL reference for a description of other functions", but it doesn't say "there is no NVL2 function", you must derive this rule looking up the desired function name in the list. Actually i found a paragraph where it mentions the absence of DECODE and others, but it doesn't mention NVL2.

In oracle SQL terms is if we had two tables containing the built-in functions accepted by SQL and built-ins accepted by PL/SQL, and we had to run a special query using set operators to find out what's missing.

select function_name
from sql_functions
minus
select function_name
from plsql_functions;

function_name
---------------
DECODE
DUMP
NVL2
...

Who knows why they forgot to include NVL2 in the PL/SQL built-ins.

DRG-11729/DRG-11728: phrase does not have any narrower/broader terms of this type

One more note regarding CTX_THES.DROP_RELATION

CTX_THES.DROP_RELATION('TEST_THES', 'COMPUTER', 'NT');

When you omit parameter relphrase (the 4th) and there are no associated narrower or broader terms associated with parameter phrase (the 2nd), the procedure will return either of the following two error messages:

ORA-20000: Oracle Text error:
DRG-11729: phrase does not have any narrower terms of this type
DRG-11728: phrase does not have any broader terms of this type

depending on the value of rel (the 3rd, NT in the example above).
Again, if you get either of these two errors it means that phrase is in the thesaurus, otherwise you would get DRG-11704.

Click on the Oracle Text label below to see all postings regarding this class of errors.

DRG-11730: relation does not exist

Just a quick note today about the following error:

ORA-20000: Oracle Text error: DRG-11730: relation does not exist

As explained in my previous posting, the lack of the qualifier associated to either phrase in the relation may cause the error above.

Yet it's interesting to note that if you receive this error, it means implicitly that the term(s) specified in the CTX_THES.DROP_RELATION call are actually existing, what is not existing is the relation between them because if either of the term(s) wouldn't exist in the specified thesaurus, you'd get DRG-11704.

The reason why i wrote term(s), with an optional plural is due to the fact that you can omit the related phrase in CTX_THES.DROP_RELATION, which means that you can drop all narrower or broader terms related to the primary phrase with a single call.

Wednesday, April 18, 2007

DRG-11704: phrase CARD does not exist

Today i finally found time for some outstanding issues i had with one application i developed on top of Oracle Text, in particular i wanted to understand well how phrase qualifiers were used in text queries.

If i look up the term qualifier in the Oracle 10G ultrasearch engine, there are just 5 hits under the category Oracle Text.

This qualifier thing appears in the definition of the hierarchical operators like BT and NT, where it says that you can append this qualifier to the term inside round parentheses as follows:

BT(CARD(PC), 2, TEST_THES)
It appears also in the view definition of CTX_THES_PHRASES.

But how do i enter a term with a qualifier?

In the Oracle Text reference, in the chapter dedicated to package CTX_THES, section CREATE_RELATION, there is another reference to such qualifier (why didn't show up earlier in the search?), where it says that such qualifier is required if you have two homographs.

Translated into english :-), it means that if you have a word with two distinct meanings, depending on the context, you had better to specify which one you are interested in by means of this qualifier.

For instance, say we have this CARD phrase.
We want to create a BT relation with COMPUTER and STATIONERY.
Clearly computer cards have little to do with paper cards, but let's see what happens if i create these two relations without qualifiers.

CREATE_RELATION('TEST_THES','CARD','BT','COMPUTER');
CREATE_RELATION('TEST_THES','CARD','BT','STATIONERY');

Now, supposing you run a CONTAINS query looking for broader terms of the word CARD, but meaning a COMPUTER card, you would get also the STATIONERY broader term.
This can be less than desirable if you are using the returned broader terms for selecting their narrower terms, because you start looking for computer cards and you end up with paper cards.

Here is where such qualifiers come into play. By specifying the qualifier in the BT query, you can prevent the wrong match to happen.

It's worth noting however that the manual doesn't provide us with any additional information or example as to how such qualifier can be entered.
Fortunately it didn't take me more than 10 seconds to figure out the correct syntax, basing on the previous information regarding BT and NT.

Let's start from scratch.
CTX_THES.DROP_PHRASE('TEST_THES','CARD');

This will drop automatically all existing relations as well as the word CARD.

Then let's create the new qualified relation:

CREATE_RELATION('TEST_THES','CARD(PC)','BT','COMPUTER');

I picked the word PC as qualifier, but there is no constraint on it, you can pick XYZ if you like, it's up to you to specify such qualifier in a meaningful way. Actually i think that one should consider very carefully the choosing of this qualifier, but this is an entirely different subject.

Now, if you look at CTX_THES_PHRASES, you will see that there is
one record matching the word card:

select * from CTX_THES_PHRASES
where thp_phrase = 'CARD';

THP_THESAURUS THP_PHRASE THP_QUALIFIER THP_SCOPE_NOTE
TEST_THES
CARD PC
-




Suppose that you want to drop the newly created qualified relation and by mistake you execute:

CTX_THES.DROP_RELATION('TEST_THES','CARD','BT','COMPUTER');

ORA-20000: Oracle Text error: DRG-11704: phrase CARD does not exist
You can get confused by the fact that looking at the view CTX_THES_PHRASES the word CARD actually exists, but there is also the PC qualifier in the next column.

In order to drop it, you'll have to specify the qualifier as follows:
CTX_THES.DROP_RELATION('TEST_THES','CARD(PC)','BT','COMPUTER');
The bottom line is that there is no way of dropping a qualified phrase unless you specify its qualifier and even if it shows up in the view CTX_THES_PHRASES as a simple phrase, you won't be able to drop it unless you manually append the qualifier embedded in round parentheses.

And this ends the quirk of the day.

Monday, April 16, 2007

better SQL WITH subquery factoring

I beg you pardon if I'm not going to write about an Oracle quirk today.
On the contrary, I'll cover an interesting feature of Oracle that appeared for the first time with Oracle 9i and that only recently became one of my favorite lifesavers.

I am referring to the obscure and perhaps neglected subquery factoring feature, that is that strange syntax beginning with WITH.

If you open What's new in the SQL Reference (for Oracle 9i), i believe you can easily overlook this new query syntax flavor as it is not particularly emphasized, in spite of its virtues.

I mean, every time a new feature is introduced either you try them all soon or you just place a sort of mental bookmark on it while thinking hum, this sounds cool, I'll see where i can use it.
Then you completely forgot it.

Otherwise, if the description isn't too fancy, you may end up thinking that you can live perfectly well without it.

I must admit that probably the latter applied to my case as i didn't realize the existence of the subquery factoring clause until i read about it somewhere two years ago. But even at that time, i failed to see its potential, until i recently hit against a big SQL statement made up of a bunch of nested SQL subqueries containing bind variables.

One of the situations i see most frequently when developing with Oracle Application Express, is the need of splitting a list of string values into a recordset. This usually involves calling a function returning a user defined object type in form of an object table.

select column_value
from table(csv_to_table('firenze,roma,venezia'));

column_value
--------------
firenze
roma
venezia

Where csv_to_table is a function i created that splits up a string separated by commas by default.

Now, imagine that a colon separated list of values, returned by a multiselect list for instance, so typical of Oracle Application Express, serves as a parameter for a query, using a bind variable:

select column_value from table(csv_to_table(:user_supplied_list, ':'));

Suppose you need to perform some kind of operation involving each pair of items in the list, excluding the case where both items are the same.

This means creating a Cartesian product between two exact copies of our input list and perform such calculation:

WITH user_defined_values AS
( SELECT COLUMN_VALUE AS my_value
FROM TABLE(csv_to_table(:user_supplied_list, ':'))
)
SELECT my_function(a.my_value, b.my_value) as result
FROM user_defined_values a,
user_defined_values b
WHERE a.my_value != b.my_value;

The main advantage i see here is in that SQL statements become much easier to read.
This can be even more noticeable with more complex queries, like those taking two or three pages of conditions, GROUP BYs, OLAP functions, you know what i mean, those that you love so much, especially when they are written by someone else in a hurry...

So, this sample query can be seen as a sort of template that you can build upon for developing more complex structures while retaining some code readability.

For instance, this simple template could work well in a situation where you need to calculate the reciprocal distance between each pair of cities specified by a user, supposing you have a routing algorithm that can compute the distance between any two locations.

WITH list_of_locations AS
( SELECT COLUMN_VALUE AS location_name
FROM TABLE(csv_to_table(:user_supplied_list, ':'))
)
SELECT calculate_distance_between(a.location_name, b.location_name) as result
FROM list_of_locations a,
list_of_locations b
WHERE a.location_name != b.location_name;

Of course this is a simplification of a real problem, but let's suppose that locations are specified using a syntax like, "town,province,region", just to shake up things a little bit.

So, supposing we want to further refine the query above, by using a numerical primary key instead of the location name, we get:

WITH list_of_locations AS
(
SELECT location_id
FROM locations
WHERE (town,province,region) IN
(
SELECT get_nth_from_csv(COLUMN_VALUE,1) as town,
get_nth_from_csv(COLUMN_VALUE,2) as province,
get_nth_from_csv(COLUMN_VALUE,3) as region
FROM TABLE(csv_to_table(:user_supplied_list, ':'))
)
)
SELECT calculate_distance_between(a.location_id, b.location_id) as result
FROM list_of_locations a,
list_of_locations b
WHERE a.location_id != b.location_id;

Note also that for commutative functions, it's normally useless to compute both fn(A,B) and fn(B,A) as they would return the same result, so you can optimize the non-equijoin to return just a triangular matrix, provided the values can be compared using lesser-than (<) or greater than (>).
WITH list_of_locations AS
(
SELECT location_id
FROM locations
WHERE (town,province,region) IN
(
SELECT get_nth_from_csv(COLUMN_VALUE,1) as town,
get_nth_from_csv(COLUMN_VALUE,2) as province,
get_nth_from_csv(COLUMN_VALUE,3) as region
FROM TABLE(csv_to_table(:user_supplied_list, ':'))
)
)
SELECT calculate_distance_between(a.location_id, b.location_id) as result
FROM list_of_locations a,
list_of_locations b
WHERE a.location_id < b.location_id

Instead of N*(N-1) values, you end up with just N*(N-1)/2 values.

However, this holds only for commutative functions and certainly calculate_distance_between is not the best example of such a function.

I say this because yesterday i was on a trip with my family and we were visiting friends living in a small town near Rome.
We managed to arrive as close as 100 meters from the crossroad where theoretically we'd had to turn left, just to discover that some fanciful city planner recently decided to convert the main road from two-way to one-way.

All right i thought, piece of cake, let's go back and see how we can bypass it.
It was 12.00 PM.

At 12.25 we passed in front of the main town square for the third time in a row and i was yelling insults at the address of the mayor.

Then we decided to take a radical decision and go out of the town and see if our GPS could sort out this mess starting from a different point.
And so it did, by proposing a route of 4.8Km, around the town, a very pleasant journey through lovely hills and green fields, at the end of which we arrived at the destination from the opposite direction.

4.8 km instead of 100 meters, a small journey for a car, but a giant leap for mankind, especially for the heirs of the Romans, world's famous city planners.

When finally we met our friends they were quite surprised to see us right there because usually they have to go out and pick up the lost people along the route!
I never got lost in New York, in London or in Mexico City, but i was almost to the point of giving up the task in Mentana, a town of nearly 16,000 inhabitants or perhaps 20,000 including the sheep.

Moral:
a distance of 100 meters from B to A can easily increase up to 4800 meters when you swap A and B and you are in Mentana.

Happy factoring!

Thursday, April 12, 2007

ORA-12152: TNS:unable to send break message

Let's start this short topic with the so called "managerial summary":

ORA-12152 means that the session has expired for some reason and the only way to move forward is to log in into Oracle again and re-execute, if possible or if applicable, any uncommitted transactions.

Now, supposing you are not a manager, you may find useful some additional technical details.

I am referring in particular to a scenario that i've outlined in a previous post concerning ORA-12170 and ORA-12152 means that your session is no longer alive on the server because oracle's PMON process got rid of it as it presumed that it was dead.
As a consequence it rolled back any pending transactions and it reclaimed the resources used by the session.

Now your question probably is:
why did PMON assume that the session was dead?

I can't tell you for sure why it happened in your case, but here is why it happened to me.

I was connected to my db server over the internet (no VPN) and, in order to get through the remote firewall, i had to force the connection to occur on port 1521 by setting the server O/S environment variable USE_SHARED_SOCKET=TRUE and, as if it were not enough, my client pc was also behind a firewall.
Then PMON saw that my session had been idle for a while and when it tried (without success owing to the pc firewall perhaps?) to probe my client session, it came to the conclusion that the connection was gone and removed it.
Thereafter, when i went back to execute a new command from sqlplus (or another client program), the Oracle client returned:
ORA-12152: TNS:unable to send break message
I hope this makes sense to you too.

In conclusion i wouldn't expect this error to happen very frequently inside a private network or when using a stable VPN connection, but you may want to comment basing on your own experience.




ORA-12152: TNS: impossibile inviare il messaggio di interruzione
ORA-12152: TNS:no se ha podido enviar mensaje de ruptura
ORA-12152: TNS: no es pot enviar el missatge d'interrupciĆ³.
ORA-12152: TNS : impossible d'envoyer un message de rupture
ORA-12152: TNS:Unterbrechungsmeldung kann nicht gesendet werden.
ORA-12152: TNS:Ī“ĪµĪ½ ĪµĪÆĪ½Ī±Ī¹ Ī“Ļ…Ī½Ī±Ļ„Ī® Ī· Ī±Ļ€ĪæĻƒĻ„ĪæĪ»Ī® Ī¼Ī·Ī½ĻĪ¼Ī±Ļ„ĪæĻ‚ Ī“Ī¹Ī±ĪŗĪæĻ€Ī®Ļ‚
ORA-12152: TNS:Kan ikke sende afbryd-meddelelse
ORA-12152: TNS: kan inte sƤnda brytningsmeddelande.
ORA-12152: TNS: kan ikke sende bruddmelding
ORA-12152: TNS: katkosanomaa ei voi lƤhettƤƤ
ORA-12152: TNS:nem lehet megszakĆ­tĆ³ Ć¼zenetet kĆ¼ldeni
ORA-12152: TNS:nu s-a putut trimite mesajul de Ʈntrerupere
ORA-12152: TNS:kan geen onderbrekingsbericht verzenden.
ORA-12152: TNS:nĆ£o Ć© possĆ­vel enviar mensagem de interrupĆ§Ć£o
ORA-12152: TNS:incapaz de enviar mensagem de quebra
ORA-12152: TNS:Š½Šµ Š² сŠ¾ŃŃ‚Š¾ŃŠ½ŠøŠø ŠæŠµŃ€ŠµŠ“Š°Ń‚ŃŒ ŠæрŠµŃ€Ń‹Š²Š°ŃŽŃ‰ŠµŠµ сŠ¾Š¾Š±Ń‰ŠµŠ½ŠøŠµ
ORA-12152: TNS:nelze odeslat přeruÅ”ovacĆ­ zprĆ”vu
ORA-12152: TNS: Nemožno vyslaÅ„ sprĆ”vu preruÅ”enia
ORA-12152: TNS:nie można wysłać komunikatu przerwania
ORA-12152: TNS: kesim mesaj gƶnderme olanağı yok.

Thursday, April 05, 2007

Lost in translation? Hopefully not at oraclequirks!

It can be of little interest for the English speaking audience, but i see from the access statistics of this site that oraclequirks is often read using automatic translators.

I am not a fan of automatic translators, actually i have a whole list of anecdotal stories that remount to the paleolithic era of computers, when Taiwan had just started creating the famous "clone" computers.
I remember two of them especially:

a funny translation of some Taiwanese company on an italian pc magazine that traslated back to english would sound like: AT PC mother board for babies (baby AT motherboard), with additional color post card (color card was translated as "cartolina", that in italian is the post card) and 8Mhz wall-clock (8 Mhz clock was translated literally whereas in italian there is no translation for this computer term, we just use the english one).

Another one inside some IBM device that sounded like: tamed servant person only "ammaestrato servente uomo soltanto", from the original trained service personnel only (or something alike).

Automatic translations are very funny and we shall see if Oracle ones are any better, so don't be scared and don't run away if you see any Cyrillic messages at the tail of some postings!

Have a nice translation!

Tuesday, April 03, 2007

ORA-12170: TNS:Connect timeout occurred aka TNS-12170

If you are wondering why are you getting this error *and* all the following prerequisite conditions apply to you:

  1. you are trying to connect to a remote database through the internet;
  2. tnsping net_service_name is working telling you that the remote listener is up and running;
  3. the remote database is running on a Windows platform;
  4. server parameter USE_SHARED_SOCKET is not set or is set to FALSE;
  5. your client is attempting to connect in dedicated server mode;
  6. you get ORA-12170:TNS:Connect timeout occurred (or TNS-12170 on versions earlier than 10g), when you try to open a connection from SQL*Plus or from another client program;
then you might try setting USE_SHARED_SOCKET=TRUE and see if it works.
USE_SHARED_SOCKET can be either an environment variable or a windows registry value.
I preferred the former option and i defined it as a system variable, in My computer's properties/advanced tab/environmental variables.

If you look up ORA-12170 in the Oracle error message list for Oracle 10G, then you are confronted with an explanation where either network delays or a denial-of-service attacks are the most probable causes.
Well, in my humble opinion, is also very likely that you are trying to access a database behind a firewall and the only open port is 1521 (or a non-standard port if that's the case).

Opening port 1521 is not enough because the listener is only accepting initial requests through that port, but once the dedicated server process is started, the connection between client and server is moved to a different port, typically a randomly chosen port, if i am not wrong.

In view of this fact, you can't just open up all the ports of the firewall and here's where this USE_SHARED_SOCKET=TRUE comes in handy, because it forces the connection to occur on the same initial port.

See Appendix C of the Database Platform Guide for further information.


Hope it helps.



Updated April 12.
If the above scenario doesn't fit well to your case, you may want to read the official documentation, starting from this section of the Net Services Admininistrator's Guide (10G).

Updated October 12.
I am getting ORA-12170 also when i try to access Oracle XE running on my Windows laptop when i forget to start the OracleTNSListener service that i modified from "Automatic" to "Manual". After starting OracleTNSListener, you may get ORA-12514 until the Oracle database server registers with the listener (within 1-2 minutes typically).



ORA-12170: TNS:Connect timeout occurred

is the english message corresponding to the following translated versions:

ORA-12170: TNS: si ĆØ verificato il timeout della connessione
ORA-12170: TNS:Se ha producido un timeout de conexiĆ³n
ORA-12170: TNS:S'ha superat el temps d'espera de la connexiĆ³
ORA-12170: TNS : dƩlai de connexion dƩpassƩ
ORA-12170: TNS: ZeitĆ¼berschreitung bei Verbindung
ORA-12170: TNS:Ī ĻĪæĪ­ĪŗĻ…ĻˆĪµ Ļ„Ī­Ī»ĪæĻ‚ Ļ‡ĻĻŒĪ½ĪæĻ… ĻƒĻĪ½Ī“ĪµĻƒĪ·Ļ‚
ORA-12170: TNS:Forbindelses-timeout opstod
ORA-12170: TNS: TidsgrƤnsen ƶverskreds vid anslutning
ORA-12170: TNS:Det oppstod et tidsavbrudd for tilkoblingen
ORA-12170: TNS: Yhteyden aikakatkaisu
ORA-12170: TNS:CsatlakozĆ”si időtĆŗllĆ©pĆ©s tƶrtĆ©nt.
ORA-12170: TNS:A survenit o eroare la expirarea timpului alocat pentru conectare
ORA-12170: TNS: time-out van verbinding.
ORA-12170: TNS:Ocorreu timeout de conexĆ£o
ORA-12170: TNS:OcorrĆŖncia de tempo de espera esgotado da ligaĆ§Ć£o
ORA-12170: TNS:Š˜ŃŃ‚ŠµŠŗŠ»Š¾ Š²Ń€ŠµŠ¼Ń Š¾Š¶ŠøŠ“Š°Š½Šøя сŠ¾ŠµŠ“ŠøŠ½ŠµŠ½Šøя
ORA-12170: TNS:Vyskytlo se odpojenĆ­ z dÅÆvodu vyprÅ”enĆ­ časovĆ©ho limitu
ORA-12170: TNS: DoÅ”lo k uplynutiu časovĆ©ho limitu pripojenia
ORA-12170: TNS:przekroczenie limitu czasu połączenia
ORA-12170: TNS: Bağlantı zaman aşımı oluştu

Monday, April 02, 2007

Regular Expressions

Would you mind to give me some feedback on this tool?



It's an online regular expression workbench, it's just a beta version, but it's almost (or so i presume...) fully functional.

It's powered by Oracle Application Express and it's my first multilingual application.
By default it will display in italian, but a preliminary english translation is available, including all the help windows, and you can switch language by clicking on the appropriate link in the lower left corner.

I used it myself for developing and testing some regular expressions and i found it's pretty neat.
Of course there is room for improvement and that is why i'd really like to hear from you.

A spanish translation is underway and more languages will be added later on.

This online environment is also an excellent way for showing you why you get certain errors like:

ORA-12726 unmatched bracket in regular expression

or how Oracle regular expressions work compared to other implementations.

So, let's start playin' with the toy, it's free.

yes you can!

Two great ways to help us out with a minimal effort. Click on the Google Plus +1 button above or...
We appreciate your support!

latest articles