Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Zeichen in Feldinhalten per Konsole und SQL ersetzen (https://www.delphipraxis.net/25880-zeichen-feldinhalten-per-konsole-und-sql-ersetzen.html)

ibp 14. Jul 2004 10:09


Zeichen in Feldinhalten per Konsole und SQL ersetzen
 
Hallo,
gibt es eine möglichkeit per console und sql-befehl bestimmte datensätze zu bearbeiten. situation ist: eine db und es sollen bestimmte zeichen z.b.: ; gefunden werden und durch ein anderes oder ersetzt werden. ok finden kann ich ja, aber was ist mit verändern aller gefundenen datensätze?
danke
rené

Sharky 14. Jul 2004 10:12

Re: Zeichen in Feldinhalten per Konsole und SQL ersetzen
 
Sind die ";" bestandteil eines anderen Strings? Welche DB?

ibp 14. Jul 2004 10:16

Re: Zeichen in Feldinhalten per Konsole und SQL ersetzen
 
die ";" sind inhalte von strings, db:interbase

ibp 14. Jul 2004 11:19

Re: Zeichen in Feldinhalten per Konsole und SQL ersetzen
 
... das Problem

SQL-Code:
select elem_bez from elemente where elem_bez like '%;%'
hat sich nun gelöst:
SQL-Code:
select elem_bez from elemente where elem_bez like '%;;%'

Robert_G 14. Jul 2004 11:44

Re: Zeichen in Feldinhalten per Konsole und SQL ersetzen
 
Dein Problem lässt sich IMHO nur mit dynamischem SQL lösen.
Ich habe dir gerade mal was getippt, es ist zwar in PL/SQL, aber hoffentlich einfach genug, damit du es zu IBs PSQL übersetzen kannst. :zwinker:

SQL-Code:
CREATE OR REPLACE PROCEDURE ReplaceSomeChars( pOwner  IN Varchar2 
                                             ,pSearchStr IN Varchar2 
                                             ,pReplStr IN Varchar2) Is
  -- Created on 14.07.2004 12:34:12 by ROBERTG

  -- Local cursors
  Cursor TableCur(i_Owner In Varchar2) Is
    SELECT t.Owner
          ,t.Table_Name
    FROM  All_Tables t
    WHERE t.Owner = i_Owner;

  Cursor ColumnCur(i_Owner In Varchar2, i_Table In Varchar2) Is
    SELECT t.Column_Name
    FROM  All_Tab_Columns t
    WHERE t.Owner = i_Owner And t.Table_Name = i_Table And
           t.data_type In ('VARCHAR', 'VARCHAR2', 'CHAR');

  -- Local records
  tabRec TableCur%Rowtype;
  ColRec ColumnCur%Rowtype;

  -- Local variables
  SQLStmt Varchar2(6000);
Begin

  For tabRec In TableCur(upper(Trim(pOwner))) Loop
    SQLStmt := Null;
    Open ColumnCur(tabRec.Owner
                  ,tabRec.Table_Name);
 
    Fetch ColumnCur
      INTO ColRec;
    While Not ColumnCur%NotFound Loop
      SQLStmt := SQLStmt || chr(10) || -- 
                 '        ,' || ColRec.Column_Name || ' = replace(' || 
                 ColRec.Column_Name || ', lSearchStr, lReplStr)';
   
      Fetch ColumnCur
        INTO ColRec;
    End Loop;
    If ColumnCur%Rowcount > 0 Then
      Execute Immediate 'Declare' || chr(10) || -- 
                        ' lSearchStr Char('||length(pSearchStr)||') := :iSearchStr;' || chr(10) || -- 
                        ' lReplStr  Char('||length(pReplStr)||')  := :iReplStr;' || chr(10) || -- 
                        'Begin' || chr(10) || -- 
                        ' Update ' || tabRec.Owner || '.' || tabRec.Table_Name || chr(10) || -- 
                        ' SET    ' || SubSTR(SQLStmt, 12) || ';' || chr(10) || -- 
                        'End;'
        Using pSearchStr, pReplStr;
    End If;
    Close ColumnCur;
  End Loop;
End;
Edit: Tippfehler...

Robert_G 14. Jul 2004 18:08

Re: Zeichen in Feldinhalten per Konsole und SQL ersetzen
 
Ich muss dich wohl vollkommen falsch verstanden haben. :lol:
Ich habe gedacht, du willst in mehreren Tabellen ein Art Search'n Replace auf alle Felder machen.

ibp 14. Jul 2004 18:16

Re: Zeichen in Feldinhalten per Konsole und SQL ersetzen
 
@robert_g
1. war auch so, das problem hat sich aber nun auf andere weise gelöst
2. hab ich deinen sc nicht wirklich kapiert, wo und wie wende ich das denn an?
gruß rené

Robert_G 14. Jul 2004 18:55

Re: Zeichen in Feldinhalten per Konsole und SQL ersetzen
 
Zitat:

Zitat von ibp
wo und wie wende ich das denn an?

Du gibst ihm ein Schema, einen SuchString und den string mit dem ersetzt werden soll. Die Prozedur wird in allen Tabellen dieses Schemas in alen Feldern vom Typ Char, VarChar oder VarChar2 pSearchStr mit pReplStr ersetzen.

Zum Bleistift:

User Ernie hat eine Tabelle names Tab1, mit diesen Spalten:
SQL-Code:
Feld1 -> Integer
Feld2 -> VarChar2(2000)
Feld3 -> Char(5)
Du könntest jetzt das Ganze mit den Werten ausführen
SQL-Code:
ReplaceSomeChars('ERNIE', 'Hallo', 'Gudd''n Aabend');
Als Ergebnis wird er für Tab1 diesen Code erzeugen und ausführen:
SQL-Code:
Declare
  lSearchStr Char(5) := :iSearchStr;
  lReplStr  Char(13)  := :iReplStr;
Begin
  Update ERNIE.Tab1 
  SET    Feld2 = replace(Feld2, lSearchStr, lReplStr)
         ,Feld3 = replace(Feld3, lSearchStr, lReplStr);
End;
Falls IB keine anonymen Böcke unterstützt, könnte man auch nur ein UPDATE nehmen.
(da ich für jedes Auftauchen eines Parameters in Oracle's dyn. SQL einen Wert übergeben müsste, nehme ich anonyme Blöcke ;) )

Für All_tables brauchst du das IB-Conterfei einer Tabelle, in der alle Tabellen aufgelistet sind.
All_Tab_Columns ist (guess what...), eine Liste aller Spalten aller Tabellen (inklusive deren Datentyp)


Falls du wirklich in vielen Tabellen Werte ersetzen musst, könnntest du das da oben jedenfalls als Grundlage nehmen.
Es war nur schnell hingetippt und an meinem "Sandkasten" getestet. (Irgendwofür müssen Raucherpäuschen doch gut sein :zwinker: )
:arrow: Ich garantiere für nix :stupid:


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:18 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz