Avatar billede _darkstar_ Nybegynder
09. marts 2007 - 15:41 Der er 11 kommentarer

Problemer med charset (PLS-00553)

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?
Avatar billede arne_v Ekspert
12. marts 2007 - 01:13 #1
hvad står der i linie 9 ?
Avatar billede _darkstar_ Nybegynder
12. marts 2007 - 07:54 #2
Der står en placeholder. F. eks. INSERT INTO dimser (beskrivelse) VALUES (?)

Fejlmeddelelsen henviser til der hvor spørgsmålstegnet står.
Avatar billede jgammelg Nybegynder
13. marts 2007 - 10:09 #3
Normalt skal du sætte environment variablen NLS_LANG til the charactersæt du vil bruge.
Avatar billede _darkstar_ Nybegynder
13. marts 2007 - 10:50 #4
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.
Avatar billede jgammelg Nybegynder
13. marts 2007 - 11:04 #5
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

Jimmy
Avatar billede _darkstar_ Nybegynder
13. marts 2007 - 12:49 #6
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>
Avatar billede jgammelg Nybegynder
13. marts 2007 - 13:23 #7
where ad_id = <*> :p1

den forstår jeg ikke... hvad er <*> brugt til - er det en Perl relateret ?
Avatar billede _darkstar_ Nybegynder
13. marts 2007 - 14:54 #8
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.
Avatar billede jgammelg Nybegynder
13. marts 2007 - 16:52 #9
select userenv('language') from dual;

Hvad er output fra denne query ? skal køres igennem cygwin - gennem Perl vil give den bedste hjælp.
Avatar billede _darkstar_ Nybegynder
13. marts 2007 - 17:45 #10
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?
Avatar billede jgammelg Nybegynder
15. marts 2007 - 10:57 #11
Prøv at tilføje dette til dit Perl script.

$ENV{NLS_LANG}="AMERICAN_AMERICA.WE8MACROMAN8S"

se om select userenv('language') from dual; nu viser det rigtige sprog.
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