powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / PB9 + ASE12.5 cursor/open/do_while/fetch/insert/loop/close
23 сообщений из 23, страница 1 из 1
PB9 + ASE12.5 cursor/open/do_while/fetch/insert/loop/close
    #35356081
Imperous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем доброго времени суток!
Помогите пожалуйста новичку
Имею следующее: PB9 + ASE12.5 (подключение через odbc)
Делаю следующее:

Declare Cur_1 Cursor for
Select
taba_1.B_tab_1,
taba_2.B_tab_2
from taba_1
inner join taba_2
on taba_1.A_tab_1 = taba_2.A_tab_2;

String result1
String result2
Integer iid
iid=0

open Cur_1;
Do While SQLCA.sqlcode=0
iid++
Fetch Cur_1 Into :result1, :result2;
Insert Into taba_3 (id,aa,bb) values (:iid, :result1, :result2);
Loop

Close Cur_1;

Как бы все просто, но вот незадачки выходят:
В результирующей таблице taba_3 я вижу в одном случае не все значения, многие пропущены (из 11927 записей только 1974) зы- 1974 число постоянное.
В результирующей таблице taba_3 я вижу в другом случае наоборот, заносятся все нужные записи (118), а затем в бесконечном цикле дублируется последняя запись.

Где же косячки вылазят?
...
Рейтинг: 0 / 0
PB9 + ASE12.5 cursor/open/do_while/fetch/insert/loop/close
    #35356111
Imperous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
сори, там не то чтобы пропущенных много, а просто заносятся первые 1974 записи
...
Рейтинг: 0 / 0
PB9 + ASE12.5 cursor/open/do_while/fetch/insert/loop/close
    #35356143
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Imperous
Do While SQLCA.sqlcode=0
iid++
Fetch Cur_1 Into :result1, :result2;
Insert Into taba_3 (id,aa,bb) values (:iid, :result1, :result2);
Loop

Close Cur_1;

Как бы все просто, но вот незадачки выходят:
В результирующей таблице taba_3 я вижу в одном случае не все значения, многие пропущены (из 11927 записей только 1974) зы- 1974 число постоянное.
В результирующей таблице taba_3 я вижу в другом случае наоборот, заносятся все нужные записи (118), а затем в бесконечном цикле дублируется последняя запись.

Где же косячки вылазят?
insert во "другом" случае сбрасывает SQLCode в 0 поэтому происходит бесконечный цикл. Что есть первый случай?
...
Рейтинг: 0 / 0
PB9 + ASE12.5 cursor/open/do_while/fetch/insert/loop/close
    #35356169
Imperous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а как этот сброс в ноль избежать?
второй случай это такая же выборка только из других таблиц и инсерт.
т.е. делаю один курсор Кур_1 заношу значения, закрываю курсор, затем делаю Кур_2 и опять заношу значения и опять закрываю, все это в одном событии по нажатии кнопки
...
Рейтинг: 0 / 0
PB9 + ASE12.5 cursor/open/do_while/fetch/insert/loop/close
    #35356186
Dim2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Imperous wrote:

> Помогите пожалуйста новичку

Не думаю, что тебе что-то поможет.

> Имею следующее: PB9 + ASE12.5 (подключение через odbc)
> Делаю следующее:

А INSERT INTO taba_3 (SELECT ... ) уже отменили ;)?
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
PB9 + ASE12.5 cursor/open/do_while/fetch/insert/loop/close
    #35356205
Imperous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dim2000
Imperous wrote:

> Помогите пожалуйста новичку

Не думаю, что тебе что-то поможет.

> Имею следующее: PB9 + ASE12.5 (подключение через odbc)
> Делаю следующее:

А INSERT INTO taba_3 (SELECT ... ) уже отменили ;)?
Posted via ActualForum NNTP Server 1.4
не то чтобы отменили, но мне надо вставить в первое поле свои значения, а в остальные два занести результаты селекта
...
Рейтинг: 0 / 0
PB9 + ASE12.5 cursor/open/do_while/fetch/insert/loop/close
    #35356210
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Imperousа как этот сброс в ноль избежать?
Сохранить результат SQLCode после FETCH в переменной и проверять ее в цикле.
Imperousвторой случай это такая же выборка только из других таблиц и инсерт.
т.е. делаю один курсор Кур_1 заношу значения, закрываю курсор, затем делаю Кур_2 и опять заношу значения и опять закрываю, все это в одном событии по нажатии кнопки
Ниасилил.
...
Рейтинг: 0 / 0
PB9 + ASE12.5 cursor/open/do_while/fetch/insert/loop/close
    #35356296
Imperous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
конечно можно и насильно если знать количество строк в результирующем наборе, но мне кажется что это не лучший выход... хотя спасибо и на том
...
Рейтинг: 0 / 0
PB9 + ASE12.5 cursor/open/do_while/fetch/insert/loop/close
    #35356467
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Imperousконечно можно и насильно если знать количество строк в результирующем наборе, но мне кажется что это не лучший выход... хотя спасибо и на том
Гы. Я говорю что из Вашего объяснения по второму случаю (который в первом посте Вы называете "в одном случае") нихрена не понятно. Наверное в кур_2 тоже какая-то ошибка.
...
Рейтинг: 0 / 0
PB9 + ASE12.5 cursor/open/do_while/fetch/insert/loop/close
    #35356490
ИМХО
вот наиболее стандартный цикл для работы с курсором

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
open cur
fetch cur
do while sqlca.sqlcode= 0 
    /*processing */
    ...

    fetch cur
loop

if sqlca.sqlcode=- 1  then messagebox('error', sqlca.sqlerrtext)
...
Рейтинг: 0 / 0
PB9 + ASE12.5 cursor/open/do_while/fetch/insert/loop/close
    #35356522
Imperous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот такой текст, думаю так будет понятней:
Declare Cur_1 Cursor for
Select
taba_1.B_tab_1,
taba_2.B_tab_2
from taba_1
inner join taba_2
on taba_1.A_tab_1 = taba_2.A_tab_2;

String result1
String result2
Integer iid
iid=0

open Cur_1;
Do While SQLCA.sqlcode=0
iid++
Fetch Cur_1 Into :result1, :result2;
Insert Into taba_3 (id,aa,bb) values (:iid, :result1, :result2);
Loop
Close Cur_1;

Declare Cur_2 Cursor for
Select
taba_4.B_tab_4,
taba_5.B_tab_5
from taba_4
inner join taba_5
on taba_4.A_tab_1 = taba_5.A_tab_2;

open Cur_2;
Do While SQLCA.sqlcode=0
iid++
Fetch Cur_2 Into :result1, :result2;
Insert Into taba_3 (id,aa,bb) values (:iid, :result1, :result2);
Loop
Close Cur_2;
...
Рейтинг: 0 / 0
PB9 + ASE12.5 cursor/open/do_while/fetch/insert/loop/close
    #35356529
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
с новым годомИМХО
вот наиболее стандартный цикл для работы с курсором

Ну и что с этого куска кода-то?
...
Рейтинг: 0 / 0
PB9 + ASE12.5 cursor/open/do_while/fetch/insert/loop/close
    #35356627
craftyman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автору:
как начинающему, сразу посоветую отказаться от embedded курсоров.
порочная практика, ИМХО.
...
Рейтинг: 0 / 0
PB9 + ASE12.5 cursor/open/do_while/fetch/insert/loop/close
    #35356661
Imperous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а как же тогда быть, куда смотреть?
...
Рейтинг: 0 / 0
PB9 + ASE12.5 cursor/open/do_while/fetch/insert/loop/close
    #35356679
craftyman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Imperousа как же тогда быть, куда смотреть?
либо в сторону хранимых процедур, либо в сторону datawindow (datastore).
...
Рейтинг: 0 / 0
PB9 + ASE12.5 cursor/open/do_while/fetch/insert/loop/close
    #35356680
VanoR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Imperousа как же тогда быть, куда смотреть?
datastore
...
Рейтинг: 0 / 0
PB9 + ASE12.5 cursor/open/do_while/fetch/insert/loop/close
    #35356734
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ImperousВот такой текст, думаю так будет понятней:
И что, прямо вот в первом случае вставляет 1974 записи, а во втором - зацикливается. Что-то как-то не верится.
...
Рейтинг: 0 / 0
PB9 + ASE12.5 cursor/open/do_while/fetch/insert/loop/close
    #35356825
Локшин Марк с новым годомИМХО
вот наиболее стандартный цикл для работы с курсором

Ну и что с этого куска кода-то?

а то что:

INSERT может породить ошибку и курсор тут-же вывалится. (это по поводу 1974)

и как уже было сказано INSERT очищает значение SQLCA.SQLCODE полученное после FETCH - имеем бесконечный цикл.

что написали - так и работает.
для начала перепиши цикл и сделай обработку ошибки после ИНСЕРТа.
...
Рейтинг: 0 / 0
PB9 + ASE12.5 cursor/open/do_while/fetch/insert/loop/close
    #35356913
Фотография spas2001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Транзакцию для инсерта надо другую использовать
Вообще embedded sql в программе (особенно курсоры) не есть гуд
-----------------------------------------------------------------------------
Главная деталь любой машины - голова ее владельца
...
Рейтинг: 0 / 0
PB9 + ASE12.5 cursor/open/do_while/fetch/insert/loop/close
    #35356954
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
с новым годом Локшин Марк с новым годомИМХО
вот наиболее стандартный цикл для работы с курсором

Ну и что с этого куска кода-то?

а то что:

INSERT может породить ошибку и курсор тут-же вывалится. (это по поводу 1974)

и как уже было сказано INSERT очищает значение SQLCA.SQLCODE полученное после FETCH - имеем бесконечный цикл.

что написали - так и работает.
для начала перепиши цикл и сделай обработку ошибки после ИНСЕРТа.
А зачем это делать МНЕ?
...
Рейтинг: 0 / 0
PB9 + ASE12.5 cursor/open/do_while/fetch/insert/loop/close
    #35357136
:) эт я с горяча

2 Imperous
для начала перепиши цикл и сделай обработку ошибки после ИНСЕРТа.
...
Рейтинг: 0 / 0
PB9 + ASE12.5 cursor/open/do_while/fetch/insert/loop/close
    #35357327
Фотография spas2001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код конечно не фонтан
Но если очень хочеться через курсор тогда так
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
transaction tran1
tran1 = create transaction
tran1.DBMS = sqlca.DBMS
 tran1.database = sqlca.database
 tran1.LogId =  sqlca.database
 tran1.LogPass = sqlca.LogPass
 tran1.ServerName = sqlca.ServerName
//параметры tran1 могут отличаться
connect using tran1;
if tran1.sqlcode<> 0  then
   MessageBox('Внимание','Не соединилось ~n'+tran1.sqlerrtext)
end if
Declare Cur_1 Cursor for
Select 
taba_1.B_tab_1,
taba_2.B_tab_2 
from taba_1
inner join taba_2
on taba_1.A_tab_1 = taba_2.A_tab_2;

String result1 
String result2
Integer iid
iid= 0 

open Cur_1;
Do While true
if SQLCA.sqlcode<> 0  then exit
iid++
Fetch Cur_1 Into :result1, :result2;
Insert Into taba_3 (id,aa,bb) values (:iid, :result1, :result2) using tran1;
if tran1.sqlcode<> 0  then
  MessageBox('Внимание','Лоханулись ~n'+tran1.sqlerrtext)
  exit
end if
Loop

Close Cur_1;
disconnect using tran1;
destroy tran1
Только не считайте такую запись образцом программирования на билдере
Я бы за использование курсоров не в процедурах - "пристреливал"
Использовать их имея datawindow - просто изврат
-----------------------------------------------------------------------------
Главная деталь любой машины - голова ее владельца
...
Рейтинг: 0 / 0
PB9 + ASE12.5 cursor/open/do_while/fetch/insert/loop/close
    #35357497
Imperous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
всем пасиба :)
...
Рейтинг: 0 / 0
23 сообщений из 23, страница 1 из 1
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / PB9 + ASE12.5 cursor/open/do_while/fetch/insert/loop/close
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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