![]() |
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é |
Re: Zeichen in Feldinhalten per Konsole und SQL ersetzen
Sind die ";" bestandteil eines anderen Strings? Welche DB?
|
Re: Zeichen in Feldinhalten per Konsole und SQL ersetzen
die ";" sind inhalte von strings, db:interbase
|
Re: Zeichen in Feldinhalten per Konsole und SQL ersetzen
... das Problem
SQL-Code:
hat sich nun gelöst:
select elem_bez from elemente where elem_bez like '%;%'
SQL-Code:
select elem_bez from elemente where elem_bez like '%;;%'
|
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:
Edit: Tippfehler...
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; |
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. |
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é |
Re: Zeichen in Feldinhalten per Konsole und SQL ersetzen
Zitat:
Zum Bleistift: User Ernie hat eine Tabelle names Tab1, mit diesen Spalten:
SQL-Code:
Du könntest jetzt das Ganze mit den Werten ausführen
Feld1 -> Integer
Feld2 -> VarChar2(2000) Feld3 -> Char(5)
SQL-Code:
Als Ergebnis wird er für Tab1 diesen Code erzeugen und ausführen:
ReplaceSomeChars('ERNIE', 'Hallo', 'Gudd''n Aabend');
SQL-Code:
Falls IB keine anonymen Böcke unterstützt, könnte man auch nur ein UPDATE nehmen.
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; (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 06:20 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz