Простой пример выполнения оператора ODPI- C дает ORA-00922 - PullRequest
0 голосов
/ 27 марта 2020

Я пытаюсь выполнить простой sql запрос с использованием ODPI- C

dpiStmt* stmt;
const char* query = "CREATE TABLE schema_name.Z_TEST(\n"
                    "    person_id NUMBER NOT NULL,\n"
                    "    first_name VARCHAR2(50) NOT NULL,\n"
                    "    last_name VARCHAR2(50) NOT NULL,\n"
                    "    PRIMARY KEY(person_id)\n"
                    ");";
dpiConn_prepareStmt(conn.connection_, 0, query, strlen(query), nullptr,0, &stmt);

if(dpiStmt_execute(stmt, DPI_MODE_EXEC_DEFAULT, nullptr) == DPI_FAILURE)
{

    throw std::runtime_error(get_context_error_string(conn.db_context_));
}

Но возникает ошибка

ERROR: ORA-00922: missing or invalid option (dpiStmt_execute : execute)

Где

  • conn - это структура, которая имеет соединение dpiConn * _. (Протестировано с dpiConn_ping)
  • get_context_error_string (dpiContext *); возвращает последнюю ошибку контекста, используя dpiErrorInfo.

Надеюсь, вы мне поможете.

PS сайт не позволил мне создать новый тег ODPI- C

РЕДАКТИРОВАТЬ : Я проверил все, что касается имени схемы и существования контекста / соединения

1 Ответ

1 голос
/ 27 марта 2020

В конце оператора DDL не должно быть точки с запятой. Это разделитель оператора клиента, а не часть оператора. Измените его на:

const char* query = "CREATE TABLE schema_name.Z_TEST(\n"
                    "    person_id NUMBER NOT NULL,\n"
                    "    first_name VARCHAR2(50) NOT NULL,\n"
                    "    last_name VARCHAR2(50) NOT NULL,\n"
                    "    PRIMARY KEY(person_id)\n"
                    ")";

В некоторых случаях случайная точка с запятой может вызвать ошибку ORA-00911, а не ошибку ORA-00922.

...