30. marts 2005 - 10:48Der er
12 kommentarer og 1 løsning
konvertering af MS-SQL database til DB2 med DB2Migration Toolkit
I forbindelse med en migrering af en MS-SQL database til DB2 har jeg en række problemer. (Jeg bruger DB2 Migration Toolkit.)
Hvis jeg prøver at oversætte en meget simpel procedure, fås en række fejl, som jeg ikke forstår (se nedenfor) Jeg er ubekendt med DB2, men kender meget til Oracle og MS-SQL....
Spørgsmålene er:
1) kan DB2 ikke anvende alias for tabelnavne ? 2) hvorfor bliver et simpelt select forsøgt oversat til temporære cursorer og handlere ?
mvh Anne
**************************' MS-SQL input: CREATE PROCEDURE [TestProc] (@mail varchar(20)) AS select M.Brugerid, M.Kodeord from TestM M where M.Email = @mail
**************************' DB2 output resultat -* [300000]MTK T-SQL Converter. Version: 041209.0332 CREATE PROCEDURE TestProc (v_mail VARCHAR(20) ) LANGUAGE SQL BEGIN DECLARE SQLSTATE CHAR(5) DEFAULT '00000'; DECLARE l_error CHAR(5) DEFAULT '00000'; --* [200011]"C:\MTK\projects\Test3\SQLTranslator.input"(2:8)-(2:17)Reference to unknown object: M.Brugerid --* [200011]"C:\MTK\projects\Test3\SQLTranslator.input"(2:20)-(2:28)Reference to unknown object: M.Kodeord --* [200011]"C:\MTK\projects\Test3\SQLTranslator.input"(2:35)-(2:53)Reference to unknown object: TestM --* [200011]"C:\MTK\projects\Test3\SQLTranslator.input"(2:63)-(2:69)Reference to unknown object: M.Email DECLARE temp_cursor CURSOR WITH HOLD WITH RETURN TO CLIENT FOR SELECT M.Brugerid, M.Kodeord FROM TestM WHERE M.Email = v_mail; DECLARE CONTINUE HANDLER FOR NOT FOUND SET l_error = '00000'; DECLARE CONTINUE HANDLER FOR SQLEXCEPTION, SQLWARNING BEGIN SET l_error = SQLSTATE; IF SUBSTR(l_error, 1, 1) >= '5' AND SUBSTR(l_error, 1, 1) <= '9' THEN RESIGNAL; END IF; END; --* [200011]"C:\MTK\projects\Test3\SQLTranslator.input"(2:8)-(2:17)Reference to unknown object: M.Brugerid --* [200011]"C:\MTK\projects\Test3\SQLTranslator.input"(2:20)-(2:28)Reference to unknown object: M.Kodeord --* [200011]"C:\MTK\projects\Test3\SQLTranslator.input"(2:35)-(2:53)Reference to unknown object: TestM --* [200011]"C:\MTK\projects\Test3\SQLTranslator.input"(2:63)-(2:69)Reference to unknown object: M.Email OPEN temp_cursor; END!
--*[300108]Translation Ratio: 50% (1/2 statements were translated successfully)
Teknologi, AI og forretning er i centrum på Computerworlds Cloud og AI Festival i København d. 18. og 19. september. Se hele programmet for den store konference om strategisk brug af Cloud og AI på: www.cloud-festival.dk
Uden iøvrigt at skulle gøre mig speciel klog på DB2 så vil jeg antage at den ikke understøtter den SQLServer feature med at man bare laver en SELECT og så ryger et result set tilbage - og at det er derfor der bliver lavet en cursor og returneret.
Jeg har en Sybase->DB2 migration guide hvor det samme sker: en simpel SP med en enkelt SELECT bliver til en SP som returnerer en cursor.
du har ret, der er jo ingen alias i DB" statementet: SELECT M.Brugerid, M.Kodeord FROM TestM
jeg prøver lige....
men "den SQLServer feature med at man bare laver en SELECT og så ryger et result set tilbage..." - sådan virker Oracle da også ? ... måske skyldes mine problemer, at jeg 'bare' har antaget at DB2 ikke er væsensforskellig fra MS-SQL og Oracle....
det hjalp at sætte det ind manuelt.... men det var jo ikke meningen at jeg skulle håndrette over 50 stored procedures for at Migration Toolkit kunne finde ud af at migrere.....
Men til gengæld fandt jeg fejlen i Migration Toolkit.... Hvir en linie er meget lang (dvs ingen CR) så laver Migration Tool en CR efter 244 karakterer. Dermed bliver inputtet fuldt af opsplittede navne og beskyttede ord, der er brudt op på en måde, så parseren ikke kan genkende dem.(500+ fejl...) Da jeg gennemgik src filen med ddl og pl/sql omhyggeligt og opbrød lange linier på fornuftige steder, kom jeg ned på under 10 fejl..... og herfra giver det mening at håndrette de enkelte fejl..... smid lige et svar, så får du nogle af points'ene :-)
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.