Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / OCI - StmtPrepare/Execute и Unicode / 5 сообщений из 5, страница 1 из 1
05.04.2017, 09:57
    #39433325
sandyp
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
OCI - StmtPrepare/Execute и Unicode
Всем привет, помогите разобраться где ошибка.
Есть wchar_t-строка с SQL, которую надо выполнить.
Делаю StmtPrepare, затем StmtExecute:


Код: plaintext
1.
2.
3.
	wchar_t* stat = L"CREATE TABLE testTable (V1 int)";
	if (OciStmtPrepare (stmtp, PERRHP(iD),
		(BYTE *)stat, wcslen(stat), OCI_NTV_SYNTAX, OCI_DEFAULT)) . . . 


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
if(OciStmtExecute(PSVCHP(iD),
			    stmtp,
                            PERRHP(iD),
                            (ub4) 1, 
                            (ub4) 0,
                            (OCISnapshot *) NULL,
                            (OCISnapshot *) NULL,
			    (ub4)OCI_DEFAULT)) . . .




На методе Execute - получаю ошибку: L"ORA-00906: missing left parenthesis\n".

Далее меняю Prepare - в качестве аргумента Len - передаю на число символов, а число байт:

Код: plaintext
1.
2.
OciStmtPrepare (stmtp, PERRHP(iD),
		(BYTE *)stat, wcslen(stat) * sizeof(wchar_t), OCI_NTV_SYNTAX, OCI_DEFAULT)




И здесь все проходит без ошибки.

Смущает что документация говорит следующее:

Length of the statement in characters or in number of bytes, depending on the encoding. Must not be zero.

А у меня encoding - UTF16:

Код: plaintext
1.
OciEnvNlsCreate( ......, (ub2)OCI_UTF16ID, (ub2)OCI_UTF16ID))



Т.е. по идее надо передавать количество символов?


Здесь, на SQL.RU нашел один пример, где тоже передаются байты -
http://www.sql.ru/forum/1086322/oci-insert-blob-a-kak-parametra-funkcii?hl=ocistmtprepare wcslen

Я накосячил или правда число байтов надо передавать? Спасибо.
...
Рейтинг: 0 / 0
05.04.2017, 10:31
    #39433342
sandyp
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
OCI - StmtPrepare/Execute и Unicode
да, а вот пример от оракла - здесь передается число символов:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
const wchar_t sqlstr[] = L"SELECT * FROM ENAME=:ename";
...
OCIStmt* stmthp;
sts = OCIHandleAlloc(envh, (void **)&stmthp, OCI_HTYPE_STMT, 0,
NULL);
status = OCIStmtPrepare(stmthp, errhp,(const text*)sqlstr,
wcslen(sqlstr), OCI_NTV_SYNTAX, OCI_DEFAULT);





Источник - https://docs.oracle.com/cd/B14117_01/server.101/b10749/ch7progrunicode.htm
...
Рейтинг: 0 / 0
05.04.2017, 10:40
    #39433346
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
OCI - StmtPrepare/Execute и Unicode
A OCI точно умеет wchar_t принимать в качестве параметра?

Я всегда использовал MBCS и выставлял NLS_LANG в UTF_8.
...
Рейтинг: 0 / 0
05.04.2017, 11:04
    #39433366
sandyp
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
OCI - StmtPrepare/Execute и Unicode
Leonid Kudryavtsev, как раз по ссылке выше - официальный пример с wchar_t.. У меня только еще сомнения, не надо ли трогать как раз NLS_LANG, но мне казалось что правильное задание опций в OciEnvNlsCreate - это все, что нужно.

Интересно, что в отличие от StmtPrepare, функция OciBindByName принимает байты и это явно указано в документации, хотя ситуация очень похожа - есть аргумент text*, а затем следующий аргумент - его длина, но в байтах:


sword OCIBindByName ( OCIStmt *stmtp,
OCIBind **bindpp,
OCIError *errhp,
CONST text *placeholder,
sb4 placeh_len, . . . .


placeh_len (IN)
The length of the name specified in placeholder, in number of bytes regardless of the encoding.
...
Рейтинг: 0 / 0
05.04.2017, 20:24
    #39433766
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
OCI - StmtPrepare/Execute и Unicode
Не знаю, слишком давно с OCI работал. К тому же опасаюсь, что не факт, что проблема именно с Unicode

Я бы еще посмотрел
cdemouni.c Program for OCI UTF16 API.
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / OCI - StmtPrepare/Execute и Unicode / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]