Avatar billede strato Nybegynder
05. november 2000 - 23:58 Der er 7 kommentarer og
2 løsninger

EXEC SQL PREPARE

Jeg forsøger at genere en dynamisk query som følger (i C):

char sql_string[] = \"SELECT * FROM Pubs P WHERE P.title LIKE \'%databaser%\'\";

(faktisk en string der skrives dynamisk)

Herefter
               
1 EXEC SQL PREPARE sql_stmt FROM :sql_string;
2 EXEC SQL EXECUTE sql_stmt;
3 EXEC SQL DECLARE cs CURSOR FOR sql_stmt;
4 EXEC SQL WHENEVER NOT FOUND DO break;

for loop m. fetch, close, commit o.s.v...

... og får derefter en fejl 01002 fetch out of sequence .... ???? Så vidt jeg kan se udføres linje 2 aldrig :(

Erfaring og hjælp søges ...
Avatar billede powell Nybegynder
06. november 2000 - 15:37 #1
\"Fetch out of sequence\" betyder normalt at du læser noget fra en cursor som ikke har flere data tilbage, ligesom EOF.

Fejlen ligner normalt dette:
    Warning : OCIFetchInto: ORA-01002: fetch out of sequence in
                                      type1.inc on line 36

Sådan her kan du lave en læse løkke:

    $stmt = ociparse($conn,\"Select ...\");

    while (ocifetch($stmt))
    { // Arbejd med data
    }

    // Alle data er læst!

    ocifetch($stmt); // Dette vil give fejlen ORA-01002
Avatar billede strato Nybegynder
06. november 2000 - 16:08 #2
Jeps, men det besynderlige er, at jeg får fejlen som følge af at den foreberedet streng aldrig udføres i databasen! Der er m.a.o. slet ingen data, SQL kaldet (som er en select stmt) udføres ikke ... hvis jeg sætter et print ind som følger:

1  EXEC SQL PREPARE sql_stmt FROM :sql_string;
1a printf(\"Got here 1\");
2  EXEC SQL EXECUTE sql_stmt;
2a printf(\"Got here 2\");
3  EXEC SQL DECLARE cs CURSOR FOR sql_stmt;
3a printf(\"Got here 3\");
4  EXEC SQL WHENEVER NOT FOUND DO break;

Når den simpelthen slet ikke til 2a !! :(
Jeg har på fornemmelsen at det er prekompileren der bitcher ... jeg har forsøgt forskellige DMBM indstillinger 8,7,6,6_CHAR o.s.v. uden held.
Avatar billede powell Nybegynder
07. november 2000 - 07:52 #3
Hvad for du hvis du blot forsøger at hente en enkel post fra databasen?, kan dette lade sig gøre?
Avatar billede strato Nybegynder
08. november 2000 - 21:54 #4
Ikke så længe query strengen opbygges og leveres på omtalte facon. Direkte forespørgsler via f.eks. SQL+ fungerer naturligvis. Det er selve den dynamiske forespørgsel der er botnakket....
Avatar billede powell Nybegynder
09. november 2000 - 08:32 #5
Hvis den ikke for overført de data korrekt, så vil basen vel være tom i det du forsøger at køre den, og derfor kommer fejlen.
Avatar billede strato Nybegynder
09. november 2000 - 16:42 #6
Heller ikke :(
Jeg kan sagtens søge i data via SQL+
Det er noget med brugen af den dynamiske streng,
PREPARE, EXECUTE evt. precompileren ...
Altså: hvad mangler der i ovenstående prepare eks., og hvis der ikke mangler noget, hvad kan så forårsage at den dynamiske forespørgsel aldrig bliver udført....
Avatar billede powell Nybegynder
10. november 2000 - 08:15 #7
Jeg er ikke stærk i dette programmeringssprog, men jeg fandt dette:

EXEC SQL PREPARE statement_name
    FROM { :host_string | string_literal };

Det kommer fra dette link: http://oradoc.photo.net/ora81/DOC/server.815/a42525/ch10.htm

Se under modul 2.
Avatar billede kibeha Nybegynder
10. november 2000 - 10:30 #8
Du skal IKKE benytte EXECUTE når det er en query, du forsøger at afvikle.

Umiddelbart vil jeg tro, at din kode sikkert vil virke, hvis du blot fjerner den ene sætning.
Ved en query skal du udføre PREPARE, DECLARE, OPEN, FETCH (evt. flere gange), CLOSE i den rækkefølge.

Powell\'s link i foregående kommentar har et udmærket eksempel under \'Method 3\', som er den du skal bruge. Klik på hans link, klik på \'Using Method 3\' og bladr lidt ned til \'An Example\'. Det skulle du næsten kunne klippe/klistre.
Avatar billede strato Nybegynder
10. november 2000 - 11:28 #9
Tak for rådene, skidtet virker stadig ikke, det må være en option jeg ikke har adgang til fra precompiler eller i inst. af databasen...
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