Jeg har skrevet et perl-program som prøver at hælde nogle data i en database. Det virker fint hvis jeg kører det lokalt på databaseserveren, men hvis jeg kører det i cygwin på min egen maskine får jeg dette her:
DBD::Oracle::st execute failed: ORA-06550: line 9, column 20: PLS-00553: character set name is not recognized
Databasen er sat op til AMERICAN_AMERICA.WE8MACROMAN8S, men jeg er ikke klar over hvad jeg skal gøre ved mit lokale miljø for at få perl til at bruge det rigtige charset.
Mine indata kommer fra en fil med ISO-8859-1 cahrs i.'
Så spørgsmålet er: hvad skal jeg gøre for at få Oracle til at acceptere de data, jeg ønsker at hælde i den?
Ja. Før jeg kører programmet i cygwin har jeg prøvet dette her:
export NLS_LANG=AMERICAN_AMERICA_WE8ISO8859P1
Men resultatet var det samme. Umiddelbart troede jeg at notationen var anderledes, så jeg prøvede også dette her:
export NLS_LANG=AMERICAN_AMERICA.WE8ISO8859P1
Det ser slet ikke ud til at Oracle-klienten læser denne værdi, så jeg spekulerer på om der er en anden måde at gøre opmærksom på tegnsættet på. En af de andre ting jeg har prøvet, er at sende csid med som attribut når man binder en parameter (se man-siden til DBD::Oracle), men det giver præcis samme resultat.
Jeg ved ikke om det er relevant, men når jeg kigger på Windows-lokale-indstillingerne (Internationale og sproglige indstillinger->Avanceret), ser det ud til at der er instalelret konverteringstabeller for ISO-8859-1 (og end del andre tabeller, herunder ISO8859-9, ISO8859-15). Til gengæld ser det ikke ud til at alle Danske EBDIC-tabelelr er installeret.
Jeg ved ikke præcist hvordan Cygwin bruger env. variabler. Med TOAD har jeg haft brugere, hvor vi var nødt til at sætte NLS_LANG i : "My Computer" -> "System Properties" -> "Advanced" -> "Environment Variables" -> "User Variables"
Notationen : AMERICAN_AMERICA.WE8ISO8859P1 er den korrekte, men har du prøvet med AMERICAN_AMERICA.WE8MACROMAN8S
Det avr et meget godt forslag. Desværre får jeg samme resultat. Hvis det har interesse, kan I se det her:
DBD::Oracle::st execute failed: ORA-06550: line 9, column 20: PLS-00553: character set name is not recognized ORA-06550: line 0, column 0: PL/SQL: Compilation unit analysis terminated (DBD ERROR: error possibly near <*> indicator at char 204 in 'DECLARE new_linenum VARCHAR(4); new_ltype_id NUMBER(8); new_linesort VARCHAR(4); BEGIN SELECT MAX(CAST(linenum AS NUMBER)) + 1 INTO new_linenum FROM adlines WHERE ad_id = <*>:p1; <klip>
Markøren <*> er indsat af perl for at indikere præcis hvor i forespørgslen at problemet er opstået.
Det oprindelige forespørgsel, jeg har kørt en prepare på hedder:
DECLARE new_linenum VARCHAR(4); new_ltype_id NUMBER(8); new_linesort VARCHAR(4); BEGIN SELECT MAX(CAST(linenum AS NUMBER)) + 1 INTO new_linenum FROM adlines WHERE ad_id = :p1;
<klip>
Hvor :p1 er en bunden parameter, som man kan binde sprog-lokale variable til. Det er almindelig praksis. Efter at have kaldt prepare er der ingen problemer. Ditto når jeg binder til de forskellige parametre (der er en del, men det er vist ikke relevant her). Når jeg så kalder execute på det handle, jeg fik fra prepare, får jeg den fejl, der står ovenfor.
Dette spørgsmål burde nok "cross-postes" til perl-kategorien.
Så får jeg DANISH_DENMARK.WE8MACROMAN8S. Det var da interessant. Det må betyde at den værdi som jeg skrev ovenfor muligvis er forkert, da den vist nok blev hentet på samme måde og derfor blot afspejler hvad *klienten* er sat op til.
Hvordan finder jeg ud af hvad databasen er interesseret i for tegnsæt?
se om select userenv('language') from dual; nu viser det rigtige sprog.
Synes godt om
Ny brugerNybegynder
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.