ORA-01002: извличане извън последователност C++

Така че не мога да разбера какво не е наред защо продължава да хвърля този ORA-01002:

/**

//  compile: oracleCC fileName
//  Execute  a hardCoded sql query


/**  Program run snapshot

Connected to ORACLE as user: sp201511@cs11g

Query is  select supplierName from Supplier  where supplierNumber = 1

supplier name = Ray

*/


#include <iostream.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>

// Parse=partial by default when code=cpp so, preprocessor directives are
// recognized and parsed fully.
#define     UNAME_LEN      20
#define     PWD_LEN        40

// Declare section is required when CODE=CPP and/or PARSE={PARTIAL|NONE}
exec sql begin declare section;
  VARCHAR username[UNAME_LEN];  // VARCHAR is an ORACLE supplied struct
                                // Has actual data & length
  varchar password[PWD_LEN];    // varchar can be in lower case also
  varchar sql_statement[1000];  //holds the sql stat being constructed..
  int supplierNo;
  char    inputSupplierName[50];        //entered using cin
  varchar outputSupplierName[50];       //retrieved output from database

exec sql end declare section;

// Declare error handling function
void sql_error(char *msg);
void connectToDatabase();
void commitAndExit() ;
void buildAhardCodedSQL();
void prepareAndExecuteIt ();
exec sql include sqlca;

main()
{

//  Call sql_error() function on any error in an embedded SQL statement
    exec sql WHENEVER SQLERROR DO sql_error("Oracle error");


    exec sql
        WHENEVER SQLERROR
        DO sql_error("ORACLE error:");
    connectToDatabase();

    buildAhardCodedSQL();
    prepareAndExecuteIt ();
    commitAndExit();

}

void connectToDatabase() {

/*  Hardcoded username and password  */
    strcpy((char *)username.arr,"myusername");
    strcpy((char *)password.arr,"password.");
    username.len = strlen((char *) username.arr);
    password.len = strlen((char *) password.arr);

//  CONNECTS TO DATABASE
    exec sql CONNECT :username IDENTIFIED BY :password;

    cout << "\nConnected to ORACLE as user: "
                << (char *)username.arr << endl << endl;

}


void commitAndExit() {

    exec sql commit work release;
    exit(0);
}
void sql_error(char *msg)
{
    exec sql WHENEVER SQLERROR CONTINUE;
    cout << endl << msg << endl;
    cout << sqlca.sqlerrm.sqlerrmc << endl;
    exec sql rollback release;
    exit(1);
}

void buildAhardCodedSQL() {
    strcpy((char *)sql_statement.arr,"select supplierNumber, supplierName ");
    strcat((char *)sql_statement.arr,"from supplier ");
    strcat((char *)sql_statement.arr,"where supplierNumber < > 1;");
    // Display the SQL statement and its current input host variable.
    cout << "Query is  " << (char *) sql_statement.arr << endl;
}
void  prepareAndExecuteIt() {

//  Prepare the query; define a cursor, execute it...

    sql_statement.len = strlen((char *) sql_statement.arr);
    exec sql PREPARE S1 FROM :sql_statement;

/* The declare statement associates a cursor with a
 * PREPAREd statement.  The cursor name, like the statement
 * name, does not appear in the Declare Section.
 * A single cursor name can not be declared more than once.
*/

    exec sql declare C1 cursor FOR S1;

    exec sql open C1;

    exec sql FETCH C1 INTO :supplierNo, :outputSupplierName;

     if ( sqlca.sqlcode !=  0) {
        cout << "past fetch..." <<endl;

        cout << sqlca.sqlerrm.sqlerrmc << endl;
        exec sql rollback release;
        exit(1);
     }
     cout << "supplier name = " << (char *)outputSupplierName.arr << endl;
     cout << "supplier number = " << supplierNo << endl;
   exec sql close C1;
}

Съобразява се и всичко, но изходът е

минало извличане....

ORA-01002: извличане извън последователност

Опитах толкова много неща, че го губя, момчета.


person IDemonix    schedule 27.02.2015    source източник


Отговори (1)


Вашето извличане е неуспешно, защото отварянето, декларирането и подготовката са неуспешни преди тази точка, но не сте проверили за грешки от тях. Ако го направихте, ще получите грешка ORA-00911: invalid character поради това:

    strcpy((char *)sql_statement.arr,"select supplierNumber, supplierName ");
    strcat((char *)sql_statement.arr,"from supplier ");
    strcat((char *)sql_statement.arr,"where supplierNumber < > 1;");

Твърдението, което изгражда е

select supplierNumber, supplierName from supplier where supplierNumber < > 1;

Но след това правите:

exec sql PREPARE S1 FROM :sql_statement;

Както при динамичните SQL и JDBC извиквания, тази подготовка може да приеме само един оператор. Точката и запетая в края на вашия конструиран низ е разделител на изрази, който няма никакво значение в този контекст и е невалиден, що се отнася до анализатора.

Така че просто премахнете тази точка и запетая:

    strcpy((char *)sql_statement.arr,"select supplierNumber, supplierName ");
    strcat((char *)sql_statement.arr,"from supplier ");
    strcat((char *)sql_statement.arr,"where supplierNumber < > 1");

и добавете проверка за грешка след всяко exec sql.

person Alex Poole    schedule 27.02.2015