AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Zeichen in Feldinhalten per Konsole und SQL ersetzen
Thema durchsuchen
Ansicht
Themen-Optionen

Zeichen in Feldinhalten per Konsole und SQL ersetzen

Ein Thema von ibp · begonnen am 14. Jul 2004 · letzter Beitrag vom 14. Jul 2004
Antwort Antwort
Benutzerbild von ibp
ibp

Registriert seit: 31. Mär 2004
Ort: Frankfurt am Main
1.511 Beiträge
 
Delphi 7 Architect
 
#1

Zeichen in Feldinhalten per Konsole und SQL ersetzen

  Alt 14. Jul 2004, 10:09
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é
  Mit Zitat antworten Zitat
Benutzerbild von Sharky
Sharky

Registriert seit: 29. Mai 2002
Ort: Frankfurt
8.251 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Zeichen in Feldinhalten per Konsole und SQL ersetzen

  Alt 14. Jul 2004, 10:12
Sind die ";" bestandteil eines anderen Strings? Welche DB?
Stephan B.
"Lasst den Gänsen ihre Füßchen"
  Mit Zitat antworten Zitat
Benutzerbild von ibp
ibp

Registriert seit: 31. Mär 2004
Ort: Frankfurt am Main
1.511 Beiträge
 
Delphi 7 Architect
 
#3

Re: Zeichen in Feldinhalten per Konsole und SQL ersetzen

  Alt 14. Jul 2004, 10:16
die ";" sind inhalte von strings, db:interbase
  Mit Zitat antworten Zitat
Benutzerbild von ibp
ibp

Registriert seit: 31. Mär 2004
Ort: Frankfurt am Main
1.511 Beiträge
 
Delphi 7 Architect
 
#4

Re: Zeichen in Feldinhalten per Konsole und SQL ersetzen

  Alt 14. Jul 2004, 11:19
... das Problem

select elem_bez from elemente where elem_bez like '%;%' hat sich nun gelöst:
select elem_bez from elemente where elem_bez like '%;;%'
  Mit Zitat antworten Zitat
Robert_G
(Gast)

n/a Beiträge
 
#5

Re: Zeichen in Feldinhalten per Konsole und SQL ersetzen

  Alt 14. Jul 2004, 11:44
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.

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...
  Mit Zitat antworten Zitat
Robert_G
(Gast)

n/a Beiträge
 
#6

Re: Zeichen in Feldinhalten per Konsole und SQL ersetzen

  Alt 14. Jul 2004, 18:08
Ich muss dich wohl vollkommen falsch verstanden haben.
Ich habe gedacht, du willst in mehreren Tabellen ein Art Search'n Replace auf alle Felder machen.
  Mit Zitat antworten Zitat
Benutzerbild von ibp
ibp

Registriert seit: 31. Mär 2004
Ort: Frankfurt am Main
1.511 Beiträge
 
Delphi 7 Architect
 
#7

Re: Zeichen in Feldinhalten per Konsole und SQL ersetzen

  Alt 14. Jul 2004, 18:16
@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é
  Mit Zitat antworten Zitat
Robert_G
(Gast)

n/a Beiträge
 
#8

Re: Zeichen in Feldinhalten per Konsole und SQL ersetzen

  Alt 14. Jul 2004, 18:55
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
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 )
Ich garantiere für nix
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:41 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