Oracle: on Overloading and Hiding Constructors

From Oracle 12c documentation:

You can overload user-defined constructors, like other type methods.

User-defined constructors are not inherited, so a user-defined constructor defined in a supertype cannot be hidden in a subtype. However, a user-defined constructor does hide, and thus supersede, the attribute-value constructor for its type if the signature of the user-defined constructor exactly matches the signature of the attribute-value constructor. For the signatures to match, the names and types of the parameters (after the implicit SELF parameter) of the user-defined constructor must be the same as the names and types of the attributes of the type. The mode of the parameters (after the implicit SELF parameter) of the user-defined constructor must be IN.

If an attribute-value constructor is not hidden by a user-defined constructor that has the same name and signature, the attribute-value constructor can still be called.

Note that, if you evolve a type—for example, by adding an attribute—the signature of the attribute-value constructor of the type changes accordingly. This can cause a formerly hidden attribute-value constructor to become usable again.

Open cmd here as admin .reg file

Windows Registry Editor Version 5.00
[-HKEY_CLASSES_ROOT\Directory\shell\runas]
[HKEY_CLASSES_ROOT\Directory\shell\runas]
@="Open Command Window Here as Administrator"
"Icon"="C:\\Windows\\System32\\imageres.dll,-78"
[-HKEY_CLASSES_ROOT\Directory\shell\runas\command]
[HKEY_CLASSES_ROOT\Directory\shell\runas\command]
@="cmd.exe /s /k pushd \"%V\"" 

[Pascal Error] YourUnit.pas(224): E2015 Operator not applicable to this operand type

I’ve got this error when was concatinating stings to build pl/sql call. Here’s an example code:

      sql := 'begin '  +
        packageName + '.calc_report(' +
          ' in_dateend=>to_date('''+ LMRFrm.a_Date2_i + ''',''dd/mm/yyyy''),' +
          ' in_code_list=>''' + LMRFrm.a_ListCat_i + ''',' +
          ' in_currency=>''' + LMRFrm.a_currency + ''',' +
          ' in_kr=>''' + LMRFrm.a_kr + ''',' +
          ' in_vseason=>''' + LMRFrm.a_season + ''',' +
          ' in_level=>''' + IfThen( ( 1 = LMRFrm.a_family_agg ), 'FAMILYSC', 'SC' ) + ''',' +
          ' in_filter=>''' + LMRFrm.a_filter + ''',' +
          ' in_report_code=>''' + LMRFrm.a_tpl_code + ''',' +
          ' in_version=>''' + IfThen( _useDevPackage , 'DEV' , 'PROD' ) + ''',' +
          ' in_week_data=>''' + IfThen( ( 1 = LMRFrm.a_week_data) , 'WEEK_DATA ', '' ) + IfThen( ( '1' = LMRFrm.a_show_sparks ), 'TRENDS ', '' ) +  IfThen( ( 1 = LMRFrm.a_full ) , 'FINANCIAL ', '' ) + ''',' +
          ' in_cache_options=>''' + IfThen( LMRFrm.a_use_cache, '', 'BYPASS' ) + ''''
          + ' ); '
          + packageName + '.create_xls( ''' + LMRFrm.a_tpl_code + ''',''' + IfThen( _useDevPackage , 'DEV' , 'PROD' ) + ''');'
          + packageName + '.fill_tmp_lmr_flat; ' + // tmp_lmr_flat используется для выгрузки картинок
      + 'end;';

Can you spot an error? Don’t think you can do it at a glance. Neither could I. So I had to comment line after a line till I found an extra plus sign near the last comment.
So the error was saying: I can not increment the string that I’ve build so far. Strings are not numbers dude.
‘Operator not applicable to this operand type’ is not very informative message. And it came without pointing to the exact line. As always.

Uniqualize rows of any table using ora_te

One of the cool ways to use my small template engine for Oracle (ora_te).

procedure uniqualize_rows_no_commit( a_table_name in varchar2 ) as 
  v_clob clob;
  v_te_uniq ty_te;
begin
  v_te_uniq := ty_te.compile_named( q'#
  delete from {$table_name} 
  where rowid in ( 
    select rowid 
    from (
      select rowid
        , row_number() over ( partition by {%for cur:1|join(',')%}{$column_name}{%endfor%} order by null ) rn
      from {$table_name}
    ) 
    where 1 < rn
  )
#'
  );  
  
  select pk_te.substitute( 
    v_te_uniq
    , ty_m( ty_p('table_name', a_table_name ) )
    , cursor( select ty_m( ty_p( 'column_name', column_name ) ) from user_tab_columns where table_name like upper( a_table_name ) ) 
  )
  into v_clob
  from dual;
--  pk_utils.eat( pk_utils.dbms_output_clob( v_clob ) );

  execute immediate v_clob;
end;