Thema: Delphi tabellen abgleichen

Einzelnen Beitrag anzeigen

Robert_G
(Gast)

n/a Beiträge
 
#4

Re: tabellen abgleichen

  Alt 23. Aug 2004, 14:40
uff
Zitat:
... except end;
Ein leerer Exception Block ist irgendwie, wie russisches Roulet mit einem vollen Magazin.


Nur um dir zu zeigen, dass es auch außerhalb von Delphi geht habe ich mal den Rest meiner verspäteten Mittagspause genutzt und das da gebastelt:
SQL-Code:
/**/
create or replace function getCompareSQL
(
  pTable1 in varchar2
 ,pTable2 in varchar2
) return varchar2 is
  -- Types
  type ItemList is table of varchar2(32);
  type TableDef is record
  (
     Owner varchar2(32)
    ,TableName varchar2(32)
  );
  -- Constants
  Intend constant char(7) := ' ';
  Lf constant char(1) := Chr(10);

  -- Variables
  Items ItemList;
  Table1 TableDef;
  Table2 TableDef;
  i integer;
  LinkStmt varchar2(4000);

  -- Cursors
  cursor getItems(iTable1 in TableDef, iTable2 in TableDef) is
    SELECT a.Column_Name
    FROM All_Tab_Columns a
          ,All_Tab_Columns b
    WHERE a.Owner = iTable1.Owner and
           a.Table_Name = iTable1.TableName and
           b.Owner = iTable2.Owner and
           b.Table_Name = iTable2.TableName and
           a.Column_Name = b.Column_Name;

  -- nested functions
  function getDef(pTable in varchar2) return TableDef is
    lPos integer;
    tempDef TableDef;
  begin
    lPos := InSTR(pTable
                 ,'.');
    if lPos = 0 then
      tempDef.Owner := User;
      tempDef.TableName := Upper(Trim(pTable));
      return tempDef;
    else
      tempDef.Owner := Upper(Trim(SubStr(pTable
                                        ,1
                                        ,lPos - 1)));

      tempDef.TableName := Upper(Trim(SubStr(pTable
                                            ,lPos + 1)));

      return tempDef;
    end if;
  end;
begin
  -- seperate Owner & Table
  Table1 := getDef(pTable1);
  Table2 := getDef(pTable2);

  -- get equal Items
  open getItems(Table1
               ,Table2);

  fetch getItems bulk collect
    INTO Items;
  close getItems;

  -- Build up WHERE Clause
  if Items.Count > 0 then
    for i in Items.first .. Items.last loop
      LinkStmt := LinkStmt || ' and' || Lf || Intend || 'a.' || Items(i) || ' = b.' || Items(i);
    end loop;
    LinkStmt := SubStr(LinkStmt
                      ,6 + Length(Intend));

    -- Return SQL Statement
    return('SELECT Count(*) EqualRecs' || Lf ||
           'FROM ' || Table1.Owner || '.' || Table2.TableName || ' a' || Lf ||
           ' ,' || Table2.Owner || '.' || Table2.TableName || ' b' || Lf ||
           'WHERE (' || LinkStmt || ') ');

  else
    return null;
  end if;
end;
Ich hatte in der ursprünglichen Version einen Ref Cursor übergeben, der danach direkt in einer TOracleQuery oder einem DataAdapter ( .Net ) verwendet werden könnte.
Da ich aber bezweifle, dass IB überhaupt weiß, was ein REF Cursor ist, übergebe ich nur ein olles SQL Statement.

BTW: Der Code muss natürlich von PL/SQL zu IB/FB - PSQL übersetzt werden, dürfte aber nicht allzu viele Probleme machen.
  Mit Zitat antworten Zitat