NAME
    Oracle::SQL::Builder - Perl extension for building SQL statements.

SYNOPSIS
      use Oracle::SQL::Builder;

    No automatically exported routines. You have to specifically to import
    the methods into your package.

      use Oracle::SQL::Builder qw(:sql);
      use Oracle::SQL::Builder /:sql/;
      use Oracle::SQL::Builder ':sql';

DESCRIPTION
    This is a package containing common sub routines that can be used in
    other programs.

   new (%arg)
    Input variables:

      any input variable and value pairs 

    Variables used or routines called:

      None

    How to use:

       my $obj = new Oracle::SQL;      # or
       my $obj = Oracle::SQL->new;     # or

    Return: new empty or initialized Oracle::SQL object.

  Export Tag: sql
    The *:table* tag includes sub-rountines for accessing Orable tables.

      use Oracle::SQL::Builder qw(:sql);

    It includes the following sub-routines:

   build_sql_stmt($idn,$idv,$hrf,$dft,$acm)
    Input variables:

      $idn - id/key name
      $idv - id/key value
      $hrf - hash ref with column definition. It is from
             getTableDef method
      $dft - date format. Default to 'YYYYMMDD.HH24MISS'
      $acm - add comma. If $acm = 1, then add a comma in 
             the end.

    Variables used or routines called:

      fmtTime      - get current time

    How to use:

      my $cs  = 'usr/pwd@db';
      my $dbh = $self->getDBHandler($cs, "Oracle");
      my $tab = "test_table";
      my ($cns,$cd1,$hrf) = $self->getTableDef($dbh,$tab,'*','hash');
      my $dft = 'YYYYMMDD.HH24MISS'; 
      my $v   = $self->build_sql_stmt('dept',10,$hrf,$dft); 

    Return: value string to be used in SQL statement.

    Any undef or 'null' value of $idv will be translated to '' for
    insert_records method and 'null' for update_records so that the DBI can
    handle correctly.

   build_sql_value($k,$v,$ar,$dft,$act)
    Input variables:

      $k   - column name
      $v   - column value 
      $ar  - hash ref for column definition: ${$ar}{$k}{$itm}. 
             It is from getTableDef with 'hash' type. 
      $dft - date format. 
             Default to 'YYYYMMDD.HH24MISS'? - not sure that we need
             to do that. 
             It checks the dft in $ar for $k first;
             If not, then call id_datetime_format to get a format
             If not, then return undef.
      $act - action: update|insert

    Variables used or routines called:

      id_datetime_format - get date and time format based on
              the date and time value provided.

    How to use:

      my $cs  = 'usr/pwd@db';
      my $dbh = $self->getDBHandler($cs, "Oracle");
      my $tab = "test_table";
      my ($cns,$cd1,$ar) = $self->getTableDef($dbh,$tab,'*','hash');
      my $dft = 'YYYYMMDD.HH24MISS'; 
      my $v   = $self->build_sql_value('dept',10,$ar,$dft); 

    Return: undef or value string to be used in SQL statement.

      undef  - value string can not be determined if no $k. 
               Do not use the column in your SQL statement.
      'NULL' - null if $v is not defined and $v is not required.
      "''"   - empty string if $v is not defined and data type is CHAR
              or VARCHAR and NOT NULL. 
      str    - any value string: number or quoted string

    This method returns the value with proper quotes and format string. For
    date datatype, it gets date and time format and use it in the TO_DATE
    function. If the $dft is provided or defined in the $ar for the column,
    then it convert the $v to the same format as defined in $dft if the $v
    has different date and time format.

   build_sql_operator($k,$v,$ar)
    Input variables:

      $k   - column name
      $v   - column value 
      $ar  - hash ref for column definition: ${$ar}{$k}{$itm}. 
             It is from getTableDef with 'hash' type. 

    Variables used or routines called:

      None

    How to use:

      my $cs  = 'usr/pwd@db';
      my $dbh = $self->getDBHandler($cs, "Oracle");
      my $tab = "test_table";
      my ($cns,$cd1,$ar) = $self->getTableDef($dbh,$tab,'*','hash');
      my $v   = $self->build_sql_operator('dept',10,$ar); 

    Return: SQL operator to be used in SQL statement.

      undef  - could not determine operator based on the inputs
               Do not use the column in your SQL statement.
      'LIKE' - match string with wild characters in $v. 
      'IN'   - $v contains a list of values of string or number 
               separated by comma.
      '='    - any number or quote strings 

    This method returns SQL operator based on column data type and the value
    in $v.

   build_sql_where($str,$ar,$dft)
    Input variables:

      $str - a string with k1=v1,k2=v2,...
      $ar  - hash ref for column definition: ${$ar}{$k}{$itm}. 
             It is from get_table_definition with 'hash' type. 
      $dft - date format. 
             Default to 'YYYYMMDD.HH24MISS'? - not sure that we need
             to do that. 
             It checks the dft in $ar for $k first;
             If not, then call id_datetime_format to get a format
             If not, then return undef.

    Variables used or routines called:

      None

    How to use:

      my $cs  = 'usr/pwd@db';
      my $dbh = $self->getDBHandler($cs, "Oracle");
      my $tab = "test_table";
      my ($cns,$cd1,$ar) = $self->getTableDef($dbh,$tab,'*','hash');
      my $s = "id=1,ln=tu,fn=han"; 
      my $whr = $self->build_sql_where($s,$ar,$dft); 

    Return: SQL WHERE clause

   form_sql($dbh,$arf,$rtp)
    Input variables:

      $dbh - database handler
      $arf - input array ref. It has the following elements: 
        act - SQL action such as SELECT, UPDATE, DELETE, etc.
        tab - target table or view name
        cns - column names separated by comma
        where - condition array reference: ${$ar}[$i]{$itm}
             $i is condition index number
             $itm are: 
             cn - column name
             op - operator such as =, <, >, in, lk, etc
             cv - value, or values separated by comma
             so - set operator such as AND or OR
        group_by - a list of columns separated by comma
        order_by - a list of columns separated by comma
        data - data array reference ${$ar}{$cn} 
        dft - date format
        rwd - right column width for formating sql statement
      $rtp - return type: default - SQL statement string
        where    - just where clause
        hash     - hash array. It has
            table - table name
            cns  - column specification such as '*' or column names
            columns - column names. If '*', then all the column names.
            select/update/delete - actions
            from  - from a table
            where - where clause
            group_by - group by clause
            order_by - order by clause
            sql   - full SQL statement
        hash_ref - hash array reference pointing to the above hash
        sql      - the whole SQL statement  

    Variables used or routines called:

      echoMSG      - echo message
      isObjExist   - check object existence
      getTableDef  - get table definitions
      getTableData - get table data 

    How to use:

      my $cs  = 'usr/pwd@db';
      my $dbh = $self->getDBHandler($cs, "Oracle");
      my $drf = $self->getTableData($dbh,$srctab,'*','','hash');
      my $arf = bless {}, ref($self)||$self;
         ${$arf}{act} = 'SELECT';
         ${$arf}{tab} = 'test_tab';
         ${$arf}{cns} = 'id,name'; 
         ${$arf}{data} = $drf; 
      my $tab = "test_table";
      $self->form_sql($dbh,$arf); 

    Return: string, hash, hash ref based on return type.

   split_cns($str,$len,$chr,$nbk)
    Input variables:

      $str - string with words or column names separated by comma
             or by spliting character
      $len - length allow in a line, default to 65 
      $chr - spliting character, default to comma
      $nbk - number of blank space in from of each line. 
             If this is set, it will return a string with line breaks.

    Variables used or routines called:

      None 

    How to use:

      my $cs  = 'col1, col2, col3, this, is, a multiple,line'; 
      my @a   = $self->split_cns($cs,10);

    Return: array with lines within length limit or a string.

   genWhere($so,$cn,$op,$cv,$ar,$dft)
    Input variables:

        $so  - set operator: AND, OR
        $cn  - column name
        $op  - operator: =, <=, >=, <>, lk, btw, in, nn, nl, etc.
        $cv  - column value
        $ar  - hash array ref: ${$ar}{$cn}{$itm}.
               $itm: col, typ, wid, max. dec, req, min, dft, and dsp
        $dft - date format
    Variables used or routines called:

      None 

    How to use:

      my $whr = $self->build_where('','id','=',1); 
         $whr .= $self->build_where('Or','name','lk','A'); 

    Return: string - where clause.

   run_sql($dbh,$sfn)
    Input variables:

        $dbh - datebase handler or connection string 
               usr/pwd@db: for Oracle 
        $sfn - sql file name with full path 
        $hmd - home directory 

    Variables used or routines called:

      None 

    How to use:

      my $dbh = $self-?getDBHandler('usr/pwd@db'); 
      my $sfn = '/my/dir/sqls/crt1.sql'; 
         $self->run_sql($dbh, $sfn); 

    Return: the following status codes:

      0 - ok; 
      1 - no DB handler
      2 - inproper inputs
      3 - sql not found

AUTHOR
    Hanming Tu, hanming_tu@yahoo.com

SEE ALSO (some of docs that I check often)
    Oracle::Trigger, Oracle:DDL, Oracle::DML, Oracle::DML::Common,
    Oracle::Loader, etc.

