Recursive Queries in Oracle

I’ve come across a very neat trick in Oracle that I thought I’d share. Its useful for situations where you can have circular references in the data diagram, for example when the table includes a column which is a reference for another entry in the same table. Usually it would be necessary to write some function which could be called recursively and allow you to traverse this tree layout, however in Oracle there is the CONNECT BY PRIOR syntax.

The users and groups example

Sticking with my earlier example let’s say I’ve got an employees table and the employee can have a manager, which is an employee

users

ID USERNAME FIRST_NAME LAST_NAME MANAGER JOB_TITLE
1 esme Esmerelda Jones   Chief
2 rose Rose Micklethwaite 1 Queen Secretary
3 simon Simon Hirst 2 Secretary
4 tom Thomas Pockleton 1 Assistant Chief
5 miranda Miranda De Silva 4 Chief Assistant to the Assistant Chief
6 emily Emily Smith 2 Secretary
select first_name || ' ' || last_name, level
from users
connect by prior id = manager
start with id = 1

Will output the list of people followed by their reports. We can distinguish who is where in the tree using the magical column “level” which is available when we connect in this way. I’ve used the level to indent the name column by two spaces for each level down the tree the person is and to show their job title:

select lpad('  ', (level - 1) * 14) || first_name || ' ' || last_name, job_title
from users
connect by prior id = manager
start with id = 1

The Alt-Tab-while-you’re-waiting Trap

Today I’m working on a complicated database driven web page. I edit the source using vim on the main file server. In order to get the file onto the webserver, I then quit out of the file and a script checks my syntax and ftps the file into the correct location on the webserver. Once its there, my prompt returns and I know its time to refresh the web page. Which is interesting, but if you are still reading then you must be wondering what my point is.

Its this, the file check and write takes too long. Its not ages, its like, seven seconds. But its long enough for me to jump to the other window (or in this case, tab) and read the next headline in my feedreader, or the message in my chat window … and you can guess what happens next! I read the article, or reply to the message, or whatever. About three minutes later (if I’m lucky), I’ll remember to refresh the page, check my changes and go on with the task in hand.

This is why all programmers need fast hardware and efficient tools to develop with. My waiting attention span just isn’t long enough to wait more than about three seconds for compile/upload/reload/whatever else is needed. I think I can multitask but actually I end up distracting myself completely!

Speaking of which, my upload is finished ….

Compulsive Multitasker

Do you know someone who seems innately unable to focus on one thing? They can only complete a task when there are twenty others vying for attention and even then they’re flitting between them like a lizard.

You know the person I mean, you call them to ask if they want to go to the cinema, they don’t answer the call so you leave a message. They return the call from the car dashing between a meeting and the supermarket and explain they would love to go to the cinema with you, and can schedule a 2 hour slot on Thursday, between evening class and preparing for a dinner party the next day. This sliver of time means the choice of films is reduced, and while waiting in line to buy tickets, the person is checking their diary and calling their mother. By the time you wave them goodbye, you’re exhausted and wondering how they ever get anything big done when they can’t make space in their lives for one thing at a time. Well here’s the revelation:

I am that person. The only way to get me to do something is to present me with 20 harder and equally urgent tasks. There’s no need to shuffle my priorities to facilitate task switching, I will just switch. Somehow I am the embodiment of that famous phrase or saying “If you want something doing, ask a busy woman”. Give me one thing to do and no deadline, and it will probably never get done. Show me an impossible task list and I can do easily ninety percent of it. Here’s another revelation:

I like new paragraphs in the pauses I would use when speaking …. no! That’s not what I’m supposed to be saying! My next revelation is that I don’t understand why this is the case. I’m an energetic and organised person, why isn’t my throughput of tasks constant? The resources available to me are more or less constant, I’m the same person all the time, but somehow unless I’m being stretched either by workload or task complexity, I just can’t seem to keep the volume of activity up for long.

Perhaps its to do with momentum. The harder or longer your to-do list is, the more it weighs and the faster you have to go to get through everything. So once you get moving you just roll and roll. That’s my theory.

Regular Expressions in Oracle

I need to operate on a big table with lots of records, but only on rows where the primary key starts with a number. Because obviously its a good idea to differentiate types of records in this way …. only joking! Its just one of those little tasks that crops up from time to time.

The Fast and Dirty Way

select code
from products
where substr(code,1,1) in (0,1,2,3,4,5,6,7,8,9)

Oracle Regular Expression Method

select code
from products
where regexp_like(code,'^[[:digit:]]')

Further Resources

I got this from this article on technology and also the definition of some of the character classes from this very helpful resource on psoug

Good Advice for Life at the Office

I came across this when reading an article on Mike’s site yesterday:

_“The best advice I ever received from a manager is that it is easier to get forgiveness than permission.”

The article is at Top 3 Ways to Fight Bureaucratic Inertia in IT and it makes for interesting reading. More than once I’ve had projects cancelled or stalled indefinitely because of two superiors’ inability to agree on the requirements and Mike’s article has given me some ideas on how to manage this type of situation in the workplace.

How Has Netball Changed Your Life?

Recently, an email went around the netballing fraternity asking for stories of how netball has changed your life. I put together something to send back to them and thought I’d share it here too.

This is going to be a long story … netball has accompanied most of the major changes in my life so far, and I’m only 25!

I’ve played netball on a regular basis since going to secondary school at the age of eleven. As I was a good 6 inches taller than pretty much everyone else, I was put at goal shooter. I wasn’t any good at it but I was very keen and after a couple of years of my mum cringing on the sideline at my hopeless efforts, the penny dropped and I actually got quite good. That’s lesson one, most things can be learned with enough perseverance.

Throughout my teens I played a lot of netball at a high level, representing my club, county, school and even region. I met a lot of people from different walks of life and sort of floated through my teens with fewer distractions than most. With no saturday job (because I was always on court) and no late night (always got a match the next day), the scope for getting into teenage scrapes was much diminished. At the time I thought I was missing out but now I’m not so sure that was the case. I travelled all over the country and went to different events, meeting women of many different ages along the way.

When I accepted my place at university, in with the forms was a leaflet from the AU, asking me to tick which sports I was interested in, as there were introductory sessions in Fresher’s Week. So off I toddled, at 10am on the first morning after arriving while my peers were nursing hangovers, and met the girls. Some of the girls that were there that day are still my closest friends. We laughed, cried and partied together. Involvement with the netball club at university transformed me from the schoolgirl who couldn’t hand in her homework on time (ever) to a young woman with a degree in engineering who started her own sports club and organised information systems for a large campus event. I have learned that I’m a leader, a team player, and someone who can get things done. Without the sport and the other girls in the club I feel sure that I’d have eaten better, had far fewer injuries, rung my mother more often and probably got a lot more sleep while I was at university … but I wouldn’t swap it for the world.

Now, three years out of university, I’m on to my third job, my fourth address and my third netball club as well. In every place I’ve met women and girls that have been welcoming, supportive and also a lot of fun. They all have their own reasons for playing, but together they make the club(s) what it is. I’m now starting my first full season with the new club and look forward to another thirty years of this (at least!)

About Blogging About Work

Until now, I’ve avoided blogging about work in pretty much any way. I’ve written about technical stuff that have come up at work but I haven’t written about much beyond that sphere, and even that is only so that I don’t have to hunt for the information next time I run into the same thing and so that others can find the information in the event that google ever admit to having heard of me. I am blogging under my real name (more or less) and I’ve heard enough horror stories of people getting dooced to be shy of this topic.

Until now.

In this day and age, work is a big part of our lives. When I socialise with friends, we mostly talk about who we are and what we do – our occupation is our profession and forms a big chunk of our entire identity. Certainly it is a large portion of who we are today – our selves without the bit that comes from how we got here and so mostly takes account of what we are currently making of life.

Its strange that this subject eludes discussion here, in our household we’ve had more than our fair share of employment-related excitement over the last year – including redundancy, contracting, unemployment and a 200-mile relocation. As an issue, work/jobs/employment/career has never been very far from my consciousness.

So my new resolve is to stop being hung up about this, to write in the abstract about work in relevance to our lives, and to never ever rant about any current workplace, colleagues or customers. Wish me luck!

the trouble with being tall

I’m tall. Not landmark-sized but well above the average for a woman (5’11’). My role model is Allison Janney who is taller than me again and interviews wonderfully on the subject of tall women. I’d like to outline the main points of having this personal feature.

Good Points

  • Not many people can tower over you without standing on something
  • People assume you are confident, which is useful if you wanted them to assume this (such as at a job interview), but can be a pain the rest of the time
  • It helps on a netball court
  • People don’t have to stoop to hear what you are saying

Bad Points

  • Its very hard to hide behind another girl
  • When holding an umbrella and walking in the rain, unless the rain falls vertically, your feet are still going to get wet because there’s so much space between the umbrella and the floor
  • If you wear women’s clothing, you risk looking like you are either a cross-dresser or a teenager that grew too quickly
  • If you wear men’s clothing, you will actually look like a man
  • If you go to specialist shops to get clothes to fit (rather than marginally longer leg lengths), you will spend a lot of money on clothes
  • Pretty shoes are never pretty by the time they are big enough to get your feet into
  • It is very difficult to buy ladies’ gloves to fit
  • When you are growing up, you are going to spend 5 years being 6-12 inches taller than any of your dates

The bad list is longer than the good list, but I wouldn’t swap my height for anything!

Workplace Eating Arrangements

Its a funny thing but the smallest details when you are looking for a job are actually the most important. I’ve never actually asked to see inside the ladies when I’ve been at a job interview but I’ve always wished I had once I got the job!

I’ve been a big fan of Joel Spolsky for some time, but he posted an advert to his site today that had me riveted. He’s looking for a sysadmin for Fog Creek, and in the advert he writes

“We’re still a small friendly company and we all eat lunch together every day at one big table.”

This is what I’m looking for in a company, this sums up my requirements for my entire working life, and he’s nailed it in a single sentence.

A shell script to set an environment variable

I’m having a problem with a program that I run at work. It does a bunch of stuff1 , and then runs vim to edit the file I specified when I ran the thing. The problem is that it doesn’t run my vim, it runs the system version. And I have mine aliased to run using the -T switch to use dtterm to make my syntax highlighting work, so this program is bypassing this setting.

“Easy”, you say, “Just set your terminal type when you log in”. Nice try, mister. My function keys (F13 to F20) don’t work under dtterm (and I had a hassle getting them working at all, see earlier post so I only want to run it for vim.

To cut a long story short, I’ve written a shell script to toggle my terminal type for me, and named it term. Here it is:


#!/bin/ksh
	

T="vt220"

if [ $TERM = $T ]
then TERM=dtterm
else TERM=vt220
fi

export $TERM
echo "term set to " $TERM

There’s a gotcha with this code, a shell script can’t modify your environment variables unless you use the . to tell it to. To run my script I use the following.

. term

1 irrelevant and proprietary stuff, which I won’t start ranting about here