powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / работа через ODBC c Oracle
25 сообщений из 31, страница 1 из 2
работа через ODBC c Oracle
    #34366203
|\/|AX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет всем.

Мне нужно записать в таблицу данные.На момент когда я их записываю никто не должен ни читать эту таблицу ни писать в нее, т.к. чтобы залить в нее данные нужно определить масимальное значение пакета в поле BT. В начале транзакции определяется максимальный номер по полю BT, все ячейки поля BT добавляемого набора записей приниают значение max(BT) + 1.

Проблема в том что с программой которую я пишу будут работать несколько человек.
И возникает вопрос: Как можно в Си++ через ODBC открыть таблицу с монопольным доступом? Такое вообще возможно?
Си я недавно начал учить.С Oracle вообще никогда не работал.
...
Рейтинг: 0 / 0
работа через ODBC c Oracle
    #34366307
pandrew
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
|\/|AXМне нужно записать в таблицу данные.На момент когда я их записываю никто не должен ни читать эту таблицу ни писать в нее, т.к. чтобы залить в нее данные нужно определить масимальное значение пакета в поле BT. В начале транзакции определяется максимальный номер по полю BT, все ячейки поля BT добавляемого набора записей приниают значение max(BT) + 1.

Проблема в том что с программой которую я пишу будут работать несколько человек.
И возникает вопрос: Как можно в Си++ через ODBC открыть таблицу с монопольным доступом? Такое вообще возможно?
Си я недавно начал учить.С Oracle вообще никогда не работал.
Для доступа к любой БД используют ADO (ODBC - это ниже уровень, кодировать придется больше), есть провайдеры для ORACLE (и есть драйвер ODBC).
То как ты описываешь поле BT - это автоинкрементное поле, встроенный тип данных.
По поводу блокировки БД при INSERT, UPDATE И т.д., это не забота клиента, это забота сервера (СУБД) и он же оповещает клиентов в случае необходимости, что-то у себя обновить.
Вообще логично почитать о клиент-серверной архитектуре.
...
Рейтинг: 0 / 0
работа через ODBC c Oracle
    #34366553
|\/|AX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
pandrew
Для доступа к любой БД используют ADO (ODBC - это ниже уровень, кодировать придется больше), есть провайдеры для ORACLE (и есть драйвер ODBC).
То как ты описываешь поле BT - это автоинкрементное поле, встроенный тип данных.
По поводу блокировки БД при INSERT, UPDATE И т.д., это не забота клиента, это забота сервера (СУБД) и он же оповещает клиентов в случае необходимости, что-то у себя обновить.
Вообще логично почитать о клиент-серверной архитектуре.
Условие стоит на использовании только ODBC.
Поле не AutoInc. У него вообще строковый тип. правда не знаю зачем так сделали. Поэтому то и приходится сначала максимальное значение брать, а потом уже все заносить. В их случае SELECT MAX(BT) уже не подходит. У меня практика. Была б моя воля я бы им все переделал. А данные я забиваю не INSERT'ом, а CRecordset::AddNew. С помощью DoFieldExchange.
Чтоб глюков мньше было, так контролировать проще.
Поэтому то я и спрашиваю как открыть табу монопольно? Чтоб не получилось что два человека занесут данные с одним номером пакета.
Да и читать сейчас безсмысленно. Есть ограничение на время. Один плюс в задаче - это мое первое знакомство с Си.
Вот пример:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
... | ... | BT
------------
... | ... |  1     //первый пакет
------------
... | ... |  1    //первый пакет
------------
... | ... |  2    //второй пакет
------------
...........
каждый пакет относится к одной транзакции.
...
Рейтинг: 0 / 0
работа через ODBC c Oracle
    #34366652
|\/|AXПривет всем.

Мне нужно записать в таблицу данные.На момент когда я их записываю никто не должен ни читать эту таблицу ни писать в нее, т.к. чтобы залить в нее данные нужно определить масимальное значение пакета в поле BT. В начале транзакции определяется максимальный номер по полю BT, все ячейки поля BT добавляемого набора записей приниают значение max(BT) + 1.

Проблема в том что с программой которую я пишу будут работать несколько человек.
И возникает вопрос: Как можно в Си++ через ODBC открыть таблицу с монопольным доступом? Такое вообще возможно?
Си я недавно начал учить.С Oracle вообще никогда не работал.
Сначала надо изучить предмет, с которым работаешь... Хотя бы спросить у "стариков", поработавших с Oracle... А то можно такого натворить... :)
Насколько я понял, Вы раньше работали исключительно с файловыми структурами, поэтому и говорите о блокировании ввода.
В данном случае, я бы сделал:
вариант 1 (оптимальный):
1. сделать последовательность (sequence) и использовать значение при вводе записей.
Каждый юзер будет обращаться к единой sequence и получать необходимый "номер" при помощи <имя sequence>.nextval
2. уже это значение вводить требуемое поле
И не надо городить огород на пустом месте...
...
Рейтинг: 0 / 0
работа через ODBC c Oracle
    #34366855
|\/|AX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Станислав С
Сначала надо изучить предмет, с которым работаешь... Хотя бы спросить у "стариков", поработавших с Oracle... А то можно такого натворить... :)
Насколько я понял, Вы раньше работали исключительно с файловыми структурами, поэтому и говорите о блокировании ввода.
В данном случае, я бы сделал:
вариант 1 (оптимальный):
1. сделать последовательность (sequence) и использовать значение при вводе записей.
Каждый юзер будет обращаться к единой sequence и получать необходимый "номер" при помощи <имя sequence>.nextval
2. уже это значение вводить требуемое поле
И не надо городить огород на пустом месте...
Блин, блин, блин.
Есть возможность из Си открыть таблицу монопольно на пять секунд пока идет запись в нее или нет?
Я открываю Базу через ODBC и чтобы работать с ней есть CDatabase и CRecordset, в которых предусмотрена возможность записи, добавления и т.д. вы это лучше меня знаете и работа с ними не требует особого знания конкретной БД, со всеми она одинакова. Одни и те же функции, переменные. Я не ковыряюсь в Oracle. я лишь записываю данные в нее посредством моей проги.
Общее представление о базах и СУБД и все такое прочее у меня есть. Вы только ответьте мне на вопрос, потому что мне никто не даст делать секвенсы и т.д. Я на практике.
Я работал с СУБД, но вся моя работа ограничивалась рамками CREATE,ALTER,INSERT,SELECT и т.д., но я не такой дурачек чтобы дров наколоть. Осторожность прежде всего.

И если создание последовательности единственный наилучший путь, то где можно подчерпнуть знаний о ней?
...
Рейтинг: 0 / 0
работа через ODBC c Oracle
    #34366982
IMil
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Почитать про последовательности можно здесь .
Скорее всего, прав на создание последовательности у вас нет, придется просить об этом админов или разработчиков из штата. Уверен, что они отнесутся с пониманием к такой просьбе.
Пытаться получить уникальный ключ таким образом, как вы хотели изначально, не стоит.
...
Рейтинг: 0 / 0
работа через ODBC c Oracle
    #34367093
|\/|AXБлин, блин, блин.
Есть возможность из Си открыть таблицу монопольно на пять секунд пока идет запись в нее или нет?
Я открываю Базу через ODBC и чтобы работать с ней есть CDatabase и CRecordset, в которых предусмотрена возможность записи, добавления и т.д. вы это лучше меня знаете и работа с ними не требует особого знания конкретной БД, со всеми она одинакова. Одни и те же функции, переменные. Я не ковыряюсь в Oracle. я лишь записываю данные в нее посредством моей проги.
Общее представление о базах и СУБД и все такое прочее у меня есть. Вы только ответьте мне на вопрос, потому что мне никто не даст делать секвенсы и т.д. Я на практике.
Я работал с СУБД, но вся моя работа ограничивалась рамками CREATE,ALTER,INSERT,SELECT и т.д., но я не такой дурачек чтобы дров наколоть. Осторожность прежде всего.

И если создание последовательности единственный наилучший путь, то где можно подчерпнуть знаний о ней?
Ну почему же... Можно открыть таблицу в монопольном режиме:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
create or replace procedure <procname> is
begin
lock table <tablename> in exclusive mode; -- Lock access for writing (and stop all other transaction
                                                          -- until current transaction end). But table is not locked 
                                                          -- for read (!!!)
....
commit; --unlock locked table;
end;
Но в контексте решения конкретной задачи - это не поможет... Так что sequence - единственное верное решение, позволяющее получить уникальное значение в требуемое поле...
...
Рейтинг: 0 / 0
работа через ODBC c Oracle
    #34367127
|\/|AX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Станислав СНо в контексте решения конкретной задачи - это не поможет... Так что sequence - единственное верное решение, позволяющее получить уникальное значение в требуемое поле...

Хе-хе. ТАк зачем же тянешь? Кинь мне уже ссылку на инфу как это все реализовать(если есть конечно), чтобы я отстал.
...
Рейтинг: 0 / 0
работа через ODBC c Oracle
    #34367200
|\/|AX Станислав СНо в контексте решения конкретной задачи - это не поможет... Так что sequence - единственное верное решение, позволяющее получить уникальное значение в требуемое поле...

Хе-хе. ТАк зачем же тянешь? Кинь мне уже ссылку на инфу как это все реализовать(если есть конечно), чтобы я отстал.
Уже сказали:
IMil
Почитать про последовательности можно здесь .

Там же можно почитать по "ручным" блокировкам таблицы...

Кроме того, обратите внимание на это:
IMil
Скорее всего, прав на создание последовательности у вас нет, придется просить об этом админов или разработчиков из штата. Уверен, что они отнесутся с пониманием к такой просьбе.
Пытаться получить уникальный ключ таким образом, как вы хотели изначально, не стоит.


От себя замечу, что поскольку блокировать чтение данных из таблицы Вы все-равно не сможете (а значит не обеспечите уникальность значения в поле; и дело тут не в С++, а в идеологии работы промышленной СУБД (Oracle)), то остается только один 99,9999% надежный путь - использовать последовательности (sequences)...
...
Рейтинг: 0 / 0
работа через ODBC c Oracle
    #34367242
|\/|AX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо большое. Я-то конечно заниматься ими(sequence'ами) и не собирался. Есть админы, но мне надо иметь о них представление чтобы четко и ясно им объяснить что я хочу.
Кстати, я уже писал, поле текстовое. С этим проблем не будет?
...
Рейтинг: 0 / 0
работа через ODBC c Oracle
    #34367314
|\/|AXСпасибо большое. Я-то конечно заниматься ими(sequence'ами) и не собирался. Есть админы, но мне надо иметь о них представление чтобы четко и ясно им объяснить что я хочу.
Кстати, я уже писал, поле текстовое. С этим проблем не будет?
Оракл САМ осуществляет перевод "строка"<-->"число" исходя из контекста (тип поля, тип передаваемых данных, тип операции (+ для числовых данных или || для символьных)).
Только в преобразуемом представлении должно быть именно число (набор цифр).

Но если Вы хотите быть на 100% уверены в результате, то можно использовать функции явного преобразования: to_char() и to_number().

Например:
Код: plaintext
1.
2.
3.
4.
5.
create sequence test .... ;
...

insert into <tablename> (key,....) values (to_char(test.nextval),.....);
.....
...
Рейтинг: 0 / 0
работа через ODBC c Oracle
    #34367413
|\/|AX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Эврика! Мне яблоко на голову упало. Почитал малость. Оказывается ничего сложного. Надо попросить пойти. Пусть сделают.
Еще вопрос назрел. А как мне ее получить в мою программу. Такой запрос допустим:
Код: plaintext
SELECT seq.nextval FROM table.BT
чтоб потом все записи с одним значением сохранить. Или надо так:
Код: plaintext
1.
2.
3.
INSERT INTO <table> (...,BT,...) VALUES (...,seq.NextVal,...);
INSERT INTO <table> (...,BT,...) VALUES (...,seq.CurrVal,...);
INSERT INTO <table> (...,BT,...) VALUES (...,seq.CurrVal,...);
INSERT INTO <table> (...,BT,...) VALUES (...,seq.CurrVal,...);
Это допустимый вариант? Мне надо чтобы загружаемый список записей имел одно и то же значение в BT.
...
Рейтинг: 0 / 0
работа через ODBC c Oracle
    #34367450
Фотография Gluk (Kazan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
|\/|AXСпасибо большое. Я-то конечно заниматься ими(sequence'ами) и не собирался. Есть админы, но мне надо иметь о них представление чтобы четко и ясно им объяснить что я хочу.
Кстати, я уже писал, поле текстовое. С этим проблем не будет?

Будут, но не тривиальные. С оценкой кардинальности на выборках по диапазонам.
читать здесь если интересно
...
Рейтинг: 0 / 0
работа через ODBC c Oracle
    #34367463
|\/|AXЭврика! Мне яблоко на голову упало. Почитал малость. Оказывается ничего сложного. Надо попросить пойти. Пусть сделают.
Еще вопрос назрел. А как мне ее получить в мою программу. Такой запрос допустим:
Код: plaintext
SELECT seq.nextval FROM table.BT
чтоб потом все записи с одним значением сохранить. Или надо так:
Код: plaintext
1.
2.
3.
INSERT INTO <table> (...,BT,...) VALUES (...,seq.NextVal,...);
INSERT INTO <table> (...,BT,...) VALUES (...,seq.CurrVal,...);
INSERT INTO <table> (...,BT,...) VALUES (...,seq.CurrVal,...);
INSERT INTO <table> (...,BT,...) VALUES (...,seq.CurrVal,...);
Это допустимый вариант? Мне надо чтобы загружаемый список записей имел одно и то же значение в BT.
Нет, так нельзя. Последовательность не привязывается к таблице - она привязывается к схеме пользователя.
Но в Oracle есть псевдо-таблица dual . Тогда получение очередного значения из последовательности будет иметь вид:
Код: plaintext
SELECT <схема>.seq.nextval FROM dual
, где <схема> - пользователь, создавший последовательность. Это значение надо будет получить в переменную, которую затем использовать во всех INSERT'ах.

Хотя это все-таки получше будет:
автор
Или надо так:
Код: plaintext
1.
2.
3.
INSERT INTO <table> (...,BT,...) VALUES (...,seq.NextVal,...);
INSERT INTO <table> (...,BT,...) VALUES (...,seq.CurrVal,...);
INSERT INTO <table> (...,BT,...) VALUES (...,seq.CurrVal,...);
INSERT INTO <table> (...,BT,...) VALUES (...,seq.CurrVal,...);
...
Рейтинг: 0 / 0
работа через ODBC c Oracle
    #34367472
Фотография Gluk (Kazan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
|\/|AX
Код: plaintext
SELECT seq.nextval FROM table.BT


из dual можно дергать, там ГАРАНТИРОВАННО одна запись.
еще currval, после nextval имеется
...
Рейтинг: 0 / 0
работа через ODBC c Oracle
    #34367497
Lexogen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
|\/|AX
Код: plaintext
1.
2.
3.
INSERT INTO <table> (...,BT,...) VALUES (...,seq.NextVal,...);
INSERT INTO <table> (...,BT,...) VALUES (...,seq.CurrVal,...);
INSERT INTO <table> (...,BT,...) VALUES (...,seq.CurrVal,...);
INSERT INTO <table> (...,BT,...) VALUES (...,seq.CurrVal,...);


Если ли в даном случае уверенность в том, что значение sequence никто не изменит во время выполения 2-4 строчек вставки?
...
Рейтинг: 0 / 0
работа через ODBC c Oracle
    #34367521
|\/|AX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Станислав С
<схема> - пользователь, создавший последовательность.
Я обращаюсь к таблицам так: DTA . table. Надо понимать что DTA есть схема,т.е. оунер?
...
Рейтинг: 0 / 0
работа через ODBC c Oracle
    #34367539
|\/|AX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Lexogen
Если ли в даном случае уверенность в том, что значение sequence никто не изменит во время выполения 2-4 строчек вставки?Это как раз и есть тема дня. Только обратил внимание. А потом бы думал в чем может быть проблема. Спасибо. Значит лучше в переменную брать.
...
Рейтинг: 0 / 0
работа через ODBC c Oracle
    #34367548
Lexogen |\/|AX
Код: plaintext
1.
2.
3.
INSERT INTO <table> (...,BT,...) VALUES (...,seq.NextVal,...);
INSERT INTO <table> (...,BT,...) VALUES (...,seq.CurrVal,...);
INSERT INTO <table> (...,BT,...) VALUES (...,seq.CurrVal,...);
INSERT INTO <table> (...,BT,...) VALUES (...,seq.CurrVal,...);


Если ли в даном случае уверенность в том, что значение sequence никто не изменит во время выполения 2-4 строчек вставки?

Документация Oracle
When you create a sequence, you can define its initial value and the increment between its values. The first reference to NEXTVAL returns the sequence's initial value. Subsequent references to NEXTVAL increment the sequence value by the defined increment and return the new value. Any reference to CURRVAL always returns the sequence's current value, which is the value returned by the last reference to NEXTVAL. Note that before you use CURRVAL for a sequence in your session, you must first initialize the sequence with NEXTVAL.
...
Рейтинг: 0 / 0
работа через ODBC c Oracle
    #34367562
|\/|AX Станислав С
<схема> - пользователь, создавший последовательность.
Я обращаюсь к таблицам так: DTA . table. Надо понимать что DTA есть схема,т.е. оунер?
да.

А вообще-то это форум по С++, а не ораклу. Для Оракла есть другая ветка...
...
Рейтинг: 0 / 0
работа через ODBC c Oracle
    #34367576
|\/|AX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Документация Oracle
When you create a sequence, you can define its initial value and the increment between its values. The first reference to NEXTVAL returns the sequence's initial value. Subsequent references to NEXTVAL increment the sequence value by the defined increment and return the new value. Any reference to CURRVAL always returns the sequence's current value, which is the value returned by the last reference to NEXTVAL. Note that before you use CURRVAL for a sequence in your session, you must first initialize the sequence with NEXTVAL.

И это независимо от того что еще кто-то может послать запрос nextval?
Может же быть и такой вариант:

Код: plaintext
1.
2.
3.
4.
5.
6.
INSERT INTO <table> (...,BT,...) VALUES (...,seq.NextVal,...);
INSERT INTO <table> (...,BT,...) VALUES (...,seq.CurrVal,...);
// и тут какой-нибудь дятька
INSERT INTO <table> (...,BT,...) VALUES (...,seq.NextVal,...);
// и выйдет здесь уже +1.
INSERT INTO <table> (...,BT,...) VALUES (...,seq.CurrVal,...);
INSERT INTO <table> (...,BT,...) VALUES (...,seq.CurrVal,...);
или не может?
...
Рейтинг: 0 / 0
работа через ODBC c Oracle
    #34367591
|\/|AX Документация Oracle
When you create a sequence, you can define its initial value and the increment between its values. The first reference to NEXTVAL returns the sequence's initial value. Subsequent references to NEXTVAL increment the sequence value by the defined increment and return the new value. Any reference to CURRVAL always returns the sequence's current value, which is the value returned by the last reference to NEXTVAL. Note that before you use CURRVAL for a sequence in your session, you must first initialize the sequence with NEXTVAL.

И это независимо от того что еще кто-то может послать запрос nextval?
Может же быть и такой вариант:

Код: plaintext
1.
2.
3.
4.
5.
6.
INSERT INTO <table> (...,BT,...) VALUES (...,seq.NextVal,...);
INSERT INTO <table> (...,BT,...) VALUES (...,seq.CurrVal,...);
// и тут какой-нибудь дятька
INSERT INTO <table> (...,BT,...) VALUES (...,seq.NextVal,...);
// и выйдет здесь уже +1.
INSERT INTO <table> (...,BT,...) VALUES (...,seq.CurrVal,...);
INSERT INTO <table> (...,BT,...) VALUES (...,seq.CurrVal,...);
или не может?
Как Вы читали?
Вот же фрагмент:
Объяснение с рекомендованного сайта
После того как очередной номер последовательности сгенерирован, этот номер доступен лишь сессии, сгенерировавшей его. Независимо от подтверждения или отката транзакций, все пользователи, обращающиеся к ORDER_SEQ.NEXTVAL, получают уникальные значения. Поэтому, если несколько пользователей одновременно обращаются к одной и той же последовательности, каждый из них может получать номера этой последовательности с промежутками, потому что номера генерируются также другими пользователями.

То есть, пока в той же транзакции снова не обратишься к nextval - будешь получать одни и те же значения через currval!
...
Рейтинг: 0 / 0
работа через ODBC c Oracle
    #34367593
|\/|AX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да я сам и не заметил как увлекся. Вообще-то это не я начал. Я-то всего лишь хотел узнать можно ли в Си табличку открыть по особому, но разговор перешел в другое русло. Ну ладно. Ничего плохого в этом нет. Спасибо за помощь. Буду эксперементировать с вариантами.
...
Рейтинг: 0 / 0
работа через ODBC c Oracle
    #34367606
|\/|AX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Станислав СКак Вы читали?
Объяснение с рекомендованного сайта
После того как очередной номер последовательности сгенерирован, этот номер доступен лишь сессии, сгенерировавшей его. Независимо от подтверждения или отката транзакций, все пользователи, обращающиеся к ORDER_SEQ.NEXTVAL, получают уникальные значения. Поэтому, если несколько пользователей одновременно обращаются к одной и той же последовательности, каждый из них может получать номера этой последовательности с промежутками, потому что номера генерируются также другими пользователями.

То есть, пока в той же транзакции снова не обратишься к nextval - будешь получать одни и те же значения через currval!Извиняюсь за вопрос. Конец рабочего дня. Уже голова совсем не работает. Читал по диагонали.
...
Рейтинг: 0 / 0
работа через ODBC c Oracle
    #34367871
|\/|AX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
3.14сец! Начальница боится сиквенсов. Придется блокировать таблицу на время записи. Сейчас был длинный диалог. И что мне не говорите, а лучший вариант блокировка. Я по себе знаю.

Это допустимый вариант?

Код: plaintext
1.
2.
3.
4.
5.
6.
cdb.BeginTrans();
cdb.ExecuteSQL("lock table <name> in exclusive mode;");
cdb.ExecuteSQL("....");
cdb.ExecuteSQL("....");
cdb.ExecuteSQL("....");
cdb.CommitTrans();
Короче говоря что написать чтобы таблица заблокировалась?
...
Рейтинг: 0 / 0
25 сообщений из 31, страница 1 из 2
Форумы / C++ [игнор отключен] [закрыт для гостей] / работа через ODBC c Oracle
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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