Datenbank: Firebird • Version: 2.5 • Zugriff über: IBDAC
Stored Procedure: Wie varchar iterieren?
Ich möchte in einer Stored Procedure über eine varchar-Variable iterieren und auf jeden Buchstaben zugreifen können um bestimmte Buchstaben durch etwas zu ersetzen. Im Pseudocode soll das so aussehen:
Code:
CREATE Procedure GetFoo(myString varchar(10))
RETURNS (myreturn varchar(10)) BEGIN myreturn := ''; for i := 1 to length(myString) do if myString[i] = 'A' myreturn := myreturn + 'X' else if myString[i] = 'A' myreturn := myreturn + 'Y' else myreturn := myreturn + myString[i]; END |
AW: Stored Procedure: Wie varchar iterieren?
Auf die Gefahr hin, dass es nicht das richtige ist. Hast Du zufällig den vorigen Thread gesehen?
http://www.delphipraxis.net/191132-s...d-mit-sql.html |
AW: Stored Procedure: Wie varchar iterieren?
variante 1: nutze die replace funktion
http://www.ibexpert.net/ibe/index.php?n=Doc.REPLACE Variante 2: so was in der Art mit substring
Code:
Wichtiger Hinweis noch: O.a. Verfahren nicht mit BLOB Variablen machen , siehe http://tracker.firebirdsql.org/browse/CORE-5114
create procedure repl
(val varchar(10)) returns (res varchar(10)) as declare variable c char(1); begin res=''; while (char_length(val)>0) do begin c=substring(val from 1 for 1); val=substring(val from 2 for 10); if (c='A') then c='1'; else if (c='C') then c='3'; res=res||c; end suspend; end select repl.res from repl('ABCDEFGHIJ'); |
AW: Stored Procedure: Wie varchar iterieren?
@IBExpert: Danke das klappt.
Jetzt habe ich nur das Problem, dass ich beim String-Vergleich if (c='A') then zwischen Groß- und Kleinschreibung unterscheiden muss. c='a' und c='A' sollen also unterschiedlich behandelt werden. Momentan wird ist die Schreibweise aber egal. |
AW: Stored Procedure: Wie varchar iterieren?
dann nimm doch einfach upper() oder lower()
|
AW: Stored Procedure: Wie varchar iterieren?
Zitat:
|
AW: Stored Procedure: Wie varchar iterieren?
bei mir wir ein kleines a nicht ersetzt, weil 'a'<>'A' ist
habe das gerade mit einer fb25 und einer fb3 DB getestet |
AW: Stored Procedure: Wie varchar iterieren?
Zitat:
select repl.res from repl('abc'); -> 1b3 select repl.res from repl('ABC'); -> 1B3 aufgerufen. Was könnte dafür verantwortlich sein? Spielt da irgendwie eine Zeichensatz/String/Sortier-Defintion mit rein? In meiner DB nutze ich UTF8 / UNICODE_CI_AI in allen VarChar-Feldern. Dabei ist dann ja auch die Schreibweise egal. Aber das dürfte ja in keiner Verbindung zu der StoredProcedure stehen?! Oder gibt es da eine globale DB-Einstellung? |
AW: Stored Procedure: Wie varchar iterieren?
Das CI in UNICODE_CI_AI steht IMHO für Case Insensitive.
Also könnte das schon das Problem sein. Frank |
AW: Stored Procedure: Wie varchar iterieren?
Zitat:
|
AW: Stored Procedure: Wie varchar iterieren?
Wenn bei den Parametern der Prozedur kein Zeichensatz/COLLATE angegeben ist, wird wohl der Standardzeichensatz der jeweiligen Datenbank verwendet.
http://www.ibexpert.net/ibe_de/index...ardzeichensatz http://firebirdsql.org/refdocs/langr...procedure.html |
AW: Stored Procedure: Wie varchar iterieren?
Diese Version trennt Klein- und Großschreibung weil explizite Nutzung collate unicode ohne ci
Code:
Und diese Version unterscheidet das nicht. Wenn die DB mit Default UTF8 Charset
create or alter procedure REPL (
VAL varchar(10)) returns ( RES varchar(10)) as declare variable C char(1) character set utf8 collate unicode; begin res=''; while (char_length(val)>0) do begin c=substring(val from 1 for 1); val=substring(val from 2 for 10); if (c='A') then c='1'; else if (c='C') then c='3'; res=res||c; end suspend; end und Default Collation Unicode_ci angelegt wurde, würde das so auch funktionieren, wenn man keine explizite Angaben dafür aufnimmt. In so einer DB kann man das dann aber trotzdem wie oben für diesen Zweck überschreiben.
Code:
create or alter procedure REPL (
VAL varchar(10)) returns ( RES varchar(10)) as declare variable C char(1) character set utf8 collate unicode_ci; begin res=''; while (char_length(val)>0) do begin c=substring(val from 1 for 1); val=substring(val from 2 for 10); if (c='A') then c='1'; else if (c='C') then c='3'; res=res||c; end suspend; end |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:26 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