Sunday, September 28, 2008

Code Nuggets: Getting two SQL column values in a single column

Well this type of thing doesn't come up very frequently (at least to me) and if you're like me working on multiple databases it gets very frustrating when it does come up. Since I don't use it very frequently, I tend to forget how to do it properly in the database system I am using at the time.

So it goes something like this: Suppose you have a simple SQL table called Users. Now this table has three columns, id (int), firstName (varchar) and lastName (varchar). Sometimes you have to return the full name from the database in a single column (for reasons of sanity, or otherwise). How do you do it depends on your DBMS. (We assume that we have a record (1, 'George', 'Lucas') in the table.)

MySQL:

MySQL supports it via the CONCAT function. You can have as many values as you want as the parameters to the function.

Example:
SELECT CONCAT(firstName, LastName) from Users

would return:
GeorgeLucas

and would even be better if you use a CONCAT(firstName, " ", LastName) in its place which would give you a nice space in between the names.

Oracle:

Oracle also supports the CONCAT function, but you are restricted to only two values as parameters. However you can CONCAT the CONCAT function itself on the cost of getting your code ugly. Another way of concatenating multiple strings in Oracle is actually using the || operators.

Example:
SELECT CONCAT(firstName, CONCAT(" ", lastName)) from Users

or

SELECT firstName || " " || lastName from Users

both accomplish the same thing and would return:

George Lucas

SQL Server:

With SQL Server it actually gets a little bit easier if you are used to concatenate your strings through the '+' operator. However make sure that you CAST any numeric values to varchar before trying to concatenate it, as '+' also works as the addition operator.

Example:
SELECT firstName + " " + lastName from Users

That's all to it to the concatenation function, and remember that selecting two values and displaying them as a single values is also called concatenation (a thing that I usually look over).

Wednesday, September 03, 2008

java.CompilerError when running RMIC

The other day I was trying out a Java RMI program in connection to an assignment. Let me be very clear here: I really like Java as it was one of my first proper programming languages (mind you, I am talking here circa 1999-2000 when Java-fever hadn't caught up) and I am a big fan of its elegance. The only turn-off which made me head towards Microsoft's direction was the lack of a proper, Visual Studio-league IDE for Java in those days. Much water has passed under the bridge, and there are many better IDEs for Java now, like Eclipse and NetBeans, but the curse still remains. (You might also want to give JCreator a shot, one of my favorite Java editing tools)

So back to where I was, trying RMI. I made a simple interface class, which compiled fine, and then an implementation class, which compiled fine in itself too. Then I had to run RMIC on one of the classes (which I tried doing from command line, since I am not sure how NetBeans handles it), and plop, I got a java.CompilerError stating that something has gone horribly wrong and the compiler is now mangled, and that I am supposed to file a bug report. Something like this (extra line-breaks have been added for readability):

error: An error has occurred in the compiler; 
please file a bug report (http://java.sun.com/cgi-bin/bugreport.cgi).
1 error
----------log:rmic(7/491)----------
sun.tools.java.CompilerError: mangle NItem1Impl     javasoft$sqe$tests$api$java$rmi$Naming$NItem2Impl     javasoft$sqe$tests$api$java$rmi$Naming$NItem3Impl     javasoft$sqe$tests$api$java$rmi$Naming$NItem4Impl
at sun.tools.java.Type.mangleInnerType(Type.java)
at sun.tools.java.Type.tClass(Type.java)
at sun.tools.java.ClassDeclaration.(ClassDeclaration.java)
at sun.rmi.rmic.Main.doCompile(Main.java)
at sun.rmi.rmic.Main.compile(Main.java)
at sun.rmi.rmic.Main.main(Main.java)

Undaunted, I ran a Google search for the error which lead me to this bug report. Mind you, there is no solution in there. I figured the solution out myself. You just have to make sure that the jdk/bin directory is in your PATH variable (I am talking about Windows), and then compile the class from the command line from the class's directory. For example, earlier I was trying to run:
C:\Sun\SDK\jdk\bin>rmic 
"C:\Documents and Settings\uxuf\RMITest\build\RMIImpl"
but this threw an error everytime, so after setting the path variable (through System Properties->Advanced->Environment Variables) I found out that I had to pass the parameter to rmic without the quotes, which automatically means without any spaces :) and became something like:
C:\Documents and Settings\uxuf\RMITest\build>rmic RMIImpl
So if you are stuck in a similar situation, when no solution to that stupid error is in sight, try out rmic from the directory which contains the class. It worked for me!