Avatar billede amoelle Nybegynder
30. marts 2005 - 10:48 Der 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)
Avatar billede arne_v Ekspert
30. marts 2005 - 10:54 #1
Jeg kan ikke se noget alias i:

DECLARE temp_cursor CURSOR WITH HOLD WITH RETURN TO CLIENT
        FOR SELECT M.Brugerid,
                    M.Kodeord
            FROM TestM
            WHERE M.Email = v_mail;
Avatar billede arne_v Ekspert
30. marts 2005 - 11:00 #2
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.
Avatar billede amoelle Nybegynder
30. marts 2005 - 11:00 #3
næ, jeg tænkte på alias'et i MS-SQL'en
Avatar billede amoelle Nybegynder
30. marts 2005 - 11:00 #4
ups...
select M.Brugerid, M.Kodeord from TestM M
Avatar billede arne_v Ekspert
30. marts 2005 - 11:03 #5
ja - men det alias er slet ikke kommet over i DB2 koden - hvad sker der hvsi du
tilføjer det manuelt ?
Avatar billede amoelle Nybegynder
30. marts 2005 - 11:17 #6
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....
Avatar billede arne_v Ekspert
30. marts 2005 - 11:24 #7
Jeg troede faktisk også at Oracle SP'ere returnerede data via en cursor
Avatar billede arne_v Ekspert
30. marts 2005 - 11:25 #8
Avatar billede arne_v Ekspert
30. marts 2005 - 11:26 #9
Men SQLServer (både Microsoft og Sybase) er yderst bekvemme på det område
Avatar billede amoelle Nybegynder
31. marts 2005 - 20:25 #10
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.....
Avatar billede arne_v Ekspert
31. marts 2005 - 20:27 #11
næh

men værktøjernes fejlbarlighed er godt for beskæftigelsen

:-)
Avatar billede amoelle Nybegynder
31. marts 2005 - 20:29 #12
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 :-)
Avatar billede arne_v Ekspert
31. marts 2005 - 20:30 #13
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester