Wednesday, August 26, 2009

Eclipse DTP vs Oracle PL/SQL - DESC is not SQL!

I have tripped up on this a few times. The Data Tools Project in Eclipse is excellent for SQL work, but against an Oracle database it runs SQL only, not PL/SQL.

A couple of times now I have tried to run "DESCRIBE SOME_TABLE" in an SQL file within Eclipse and gotten ORA-00900: invalid SQL statement (0 rows affected). This is because under Oracle, DESC[RIBE] is PL/SQL, not SQL.

Here is the SQL equivalent.

SELECT column_name "Name", nullable "Null?",
   concat(concat(concat(data_type,'('),data_length),')') "Type"
FROM user_tab_columns
WHERE table_name = 'SOME_TABLE';

Sunday, August 02, 2009

Open Total Commander from Cygwin command line

A script to open the file explorer Total Commander from the Cygwin command line. Allows user to:

  • Open paths in currently running instance.
  • Open paths in existing or new tabs.
  • Specify paths for left and/or right panels.

Purpose. To provide a flexible way to open paths in Total Commander from Cygwin. Now I can use this or Windows Explorer from the Cygwin command line.

Input. Paths to open. Options to open new tabs.

Output. Total Commander opened to given paths.

Dependencies. Total Commander must be installed! Paths must exist.

<>Examples. See usage section in script.

Here is the script.

#!/bin/bash
#===============================================================================
#
#          FILE:  totalCommander.sh
#
#         USAGE:  see usage
#
#   DESCRIPTION:  Open Total Commander to whatever path.
#
#       OPTIONS:  - see usage
#  REQUIREMENTS:  - Total Commander be installed http://www.ghisler.com/
#                 - Paths requested to be opened exist
#          BUGS:  ---
#         NOTES:  ---
#        AUTHOR:  Robert Mark Bram (RMB), robertmarkbram@gmail.com
#       COMPANY:  http://robertmarkbramprogrammer.blogspot.com/
#       VERSION:  1.0
#       CREATED:  07/31/09 16:54:46 AUSEST
#      REVISION:  ---
#===============================================================================

set -o nounset                              # Treat unset variables as an error


#-------------------------------------------------------------------------------
#  Variables for this script.
#-------------------------------------------------------------------------------
# Open new tabs? Blank for no, '/T' for yes.
newTab=
# Path to open on left.
tcpathLeft=
# Path to open on right.
tcpathRight=
# Total Commander command.
totalCommander=/apps/totalcmd/TOTALCMD.EXE
# Should we be verbose?
verbose=no


#-------------------------------------------------------------------------------
#  Common functions for this script.
#-------------------------------------------------------------------------------


#===  FUNCTION  ================================================================
#          NAME:  checkVars
#   DESCRIPTION:  Check initial state of vars in this script.
#    PARAMETERS:
#       RETURNS:
#===============================================================================
function checkVars() {
   if [ -z "$tcpathLeft" -a -z "$tcpathRight" ] ; then
      tcpathLeft=.
   elif [ ! -z "$tcpathLeft" -a ! -e "${tcpathLeft}" ] ; then
      usage "Left location [${tcpathLeft}] does not exist."
      exit 2;
   elif [ ! -z "$tcpathRight" -a ! -e "${tcpathRight}" ] ; then
      usage "Right location [${tcpathRight}] does not exist."
      exit 2;
   fi
   type $totalCommander &> /dev/null
   if [ ! -e "$totalCommander" ]; then
      echo "There is no spoon. Or total commander @ '$totalCommander'."
      exit 2;
   fi
}


#===  FUNCTION  ================================================================
#          NAME:  message
#   DESCRIPTION:  Output message if verbose is on
#    PARAMETERS:  message to be printed
#       RETURNS:  -
#===============================================================================
message ()
{
   if [ "$verbose" == "yes" ] ; then
      echo -e "${1}"
   fi
}    # ----------  end of function message  ----------


#===  FUNCTION  ================================================================
#          NAME:  processArgs
#   DESCRIPTION:  Check command line arguments.
#    PARAMETERS:  $@ from this script invocation
#       RETURNS:  Exit or take other action with error messages
#===============================================================================
processArgs ()
{
   # Process all the opening arguments.
   while [ "$#" -gt 0 ]
   do # until we have no more args to process.
      case "${1}" in
         "-h"     )  usage; exit 0;;
         "--help" )  usage; exit 0;;
         "-l"     )  tcpathLeft="${2}"; shift; shift;;
         "-r"     )  tcpathRight="${2}"; shift; shift;;
         "-t"     )  newTab="/T"; shift;;
         "-v"     )  verbose=yes; shift;;
         *        )  usage "Unknown option: $1" ; exit 2;;
      esac
   done
}    # ----------  end of function processArgs  ----------


#===  FUNCTION  ================================================================
#          NAME:  help
#   DESCRIPTION:  Output usage statement and exit.
#    PARAMETERS:  Error message.
#       RETURNS:
#===============================================================================
function usage() {
# Here document for help.. less or cat
errMessage=
if [ "$#" -gt 0 ] ; then
   errMessage=$1
else
   errMessage=HELP
fi
# Here document for help.. less or cat
cat << STOP_HELP
$errMessage
usage: $0 [-t] [-l leftPath] [-r rightPath]
Open Total Commander to paths, if specified, or current directory otherwise.
Always uses currently running instance. Opens new instance if none are running.
   -l    - Path to open in left tab.
            If neither -l or -r are given, default value is "-l .".
   -r    - Path to open in right tab.
            If neither -l or -r are given, default value is "-l .".
   -t    - Open paths in new tabs.
   -v    - verbose
Examples
1) Open current directory in left panel, current tab.
      $0
2) Open current directory in left panel, parent directory in right panel in new
   tabs.
      $0 -l . -r .. -t
STOP_HELP
}


#-------------------------------------------------------------------------------
#  Script Logic
#-------------------------------------------------------------------------------


processArgs "$@"
checkVars

if [ ! -z "$tcpathLeft" ] ; then
   tcpathLeft=/L=`cygpath -d -a "${tcpathLeft}"`
fi
if [ ! -z "$tcpathRight" ] ; then
   tcpathRight=/R=`cygpath -d -a "${tcpathRight}"`
fi

message "TC with left [$tcpathLeft], right [$tcpathRight] with new tab [$newTab]."

$totalCommander /O $newTab "${tcpathLeft}" "${tcpathRight}" &

# echo Done.