powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / java code --> sql procedure/function
25 сообщений из 45, страница 1 из 2
java code --> sql procedure/function
    #38836088
scofielcl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.

Структура таблицы:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
    -- Структура таблицы `product`
     
    CREATE TABLE IF NOT EXISTS `product` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `code` int(11) NOT NULL,
    `type_tool` tinyint(1) NOT NULL,
    `code_tool` int(11) NOT NULL,
    `size_tool` int(11) NOT NULL,
    PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=6 ;
     
    -- Структура таблицы `tool`
     
    CREATE TABLE IF NOT EXISTS `tool` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `name` text NOT NULL,
    `size` int(11) NOT NULL,
    PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=4 ;







Поле type_tool принимает 0 или 1 (запчасть из tool / продукт из product).
Поле code_tool код запчасти / продукта.
Поле size_tool количество.

Достаточно ли запчастей для сборки самолета ? т.е. необходимо обойти дерево.



Имею такой код на java, пытаюсь сделать то же самое на sql.

Код: java
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.
    public boolean has(int itemId) throws SQLException {
            final Queue<CompoundItemRequest> itemsToCheck = new LinkedList<>();
            itemsToCheck.add(new CompoundItemRequest(itemId, 1));

            Connection conn = DriverManager.getConnection(url, properties);
            PreparedStatement insufficientDetails = conn.prepareStatement(
                    "select 1 from product join tool "
                    + " on product.type_tool = 0 and product.code_tool = tool.id "
                    + " where product.code = ? and product.type_tool = 0 and product.size_tool * ? > tool.size");
            PreparedStatement compoundDetails = conn.prepareStatement(
                    "select code_tool, size_tool from product "
                    + " where code = ? and type_tool = 1");
   
                compoundDetails.setInt(1, itemId);  
                try (ResultSet rs = compoundDetails.executeQuery()) {
                        while (rs.next())
                            itemsToCheck.add(new CompoundItemRequest(rs.getInt("code_tool"), rs.getInt("size_tool") * 1));
                  }
                while(!itemsToCheck.isEmpty()){
                    final CompoundItemRequest item = itemsToCheck.remove();

                    insufficientDetails.setInt(1, item.itemId);
                    insufficientDetails.setInt(2, item.numberOfItems);
                    try (ResultSet rs = insufficientDetails.executeQuery()) {
                        if (rs.next())return false;
                        
                    }
                }     
                
            
            return true;
        }

Возможно ли сделать рекурсивно/нерекурсивно  ?
...
Рейтинг: 0 / 0
java code --> sql procedure/function
    #38836101
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В MySQL нет рекурсии. Посему придётся разворачивать дерево из таблицы product в рамках, например, хранимой процедуры, накапливая итоги во временной таблице. После завершения к ней привязываете к полученной таблице таблицу tool и получаете конечный результат.
...
Рейтинг: 0 / 0
java code --> sql procedure/function
    #38836131
scofielcl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Благодарю, результаты выложу.
...
Рейтинг: 0 / 0
java code --> sql procedure/function
    #38836367
scofielcl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Что то подобное, но необходимо переделать на с sql-е курсоры и циклы.

Код: plsql
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.
DROP TEMPORARY TABLE IF EXISTS `b`;
DROP TEMPORARY TABLE IF EXISTS `c`;
DROP TEMPORARY TABLE IF EXISTS `d`;
DROP TEMPORARY TABLE IF EXISTS `e`;

/*В b храним все узлы дерева , т.е. все записи где type_tool = 1 */
CREATE TEMPORARY TABLE `b` (`id` int(11) NOT NULL AUTO_INCREMENT,`code` int(11) NOT NULL,`size_tool` int(11) NOT NULL);
/*с всегда содержит единственную запись*/
CREATE TEMPORARY TABLE `c` (`code` int(11) NOT NULL,`size_tool` int(11) NOT NULL);
/*В d хранятся результаты запроса с использованием данных из с */
CREATE TEMPORARY TABLE `d` (`code` int(11) NOT NULL,`size_tool` int(11) NOT NULL);
/*В е хранятся подузлы каждого узла,чтоб добавить их в b */
CREATE TEMPORARY TABLE `e` (`id` int(11) NOT NULL AUTO_INCREMENT,`code` int(11) NOT NULL,`size_tool` int(11) NOT NULL);


b =  INSERT INTO `b` (id,code,size_tool) VALUE (0,id_search,1);


   while(b != null){

    c = select min(`code`),`size_tool` from b group by `id`;
    "delet from `b` where `code` = min(`code`) group by `id`;"

    d = select 1 from product join tool on product.type_tool = 0 and product.code_tool = tool.id where product.code = c.code and product.type_tool = 0 and product.size_tool * c.size_tool > too.size;
    if(d != 0)return 0;

e = select `id`, `code_tool`,`size_tool` from product where `code` = c.code and type_tool = 1;

 while(e != null)b+=e.next();

}
...
Рейтинг: 0 / 0
java code --> sql procedure/function
    #38836378
scofielcl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Изменения.

Код: plsql
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.
DROP TEMPORARY TABLE IF EXISTS `b`;
DROP TEMPORARY TABLE IF EXISTS `c`;
DROP TEMPORARY TABLE IF EXISTS `d`;


/*В b храним все узлы дерева , т.е. все записи где type_tool = 1 */
CREATE TEMPORARY TABLE `b` (`id` int(11) NOT NULL AUTO_INCREMENT,`code` int(11) NOT NULL,`size_tool` int(11) NOT NULL);
/*в с всегда будет только одна запись*/
CREATE TEMPORARY TABLE `c` (`code` int(11) NOT NULL,`size_tool` int(11) NOT NULL);
/*В d хранятся результаты запроса с использованием данных из с */
CREATE TEMPORARY TABLE `d` (`code` int(11) NOT NULL);

 INSERT INTO `b` (id,code,size_tool) VALUE (0,id_search,1);

   while(b != null){

    "insert into c (`code`, `size_tool`) select min(`code`),`size_tool` from b group by `id`;"
    "delet from `b` where `code` = min(`code`) group by `id`;"

    "insert into d (`code`) select 1 from product join tool on product.type_tool = 0 and product.code_tool = tool.id where product.code = c.code and product.type_tool = 0 and product.size_tool * c.size_tool > too.size;"
    if(d != 0)return 0;

    "insert into b (`id`,`code_tool`,`size_tool`)select `id`, `code_tool`,`size_tool` from product where `code` = c.code and type_tool = 1;"

}
...
Рейтинг: 0 / 0
java code --> sql procedure/function
    #38836629
scofielcl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Изменения:

Код: plsql
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.
DROP TEMPORARY TABLE IF EXISTS `b`;
DROP TEMPORARY TABLE IF EXISTS `c`;
DROP TEMPORARY TABLE IF EXISTS `d`;


/*В b храним все узлы дерева , т.е. все записи где type_tool = 1 */
CREATE TEMPORARY TABLE `b` (`id` int(11) NOT NULL AUTO_INCREMENT,`code` int(11) NOT NULL,`size_tool` int(11) NOT NULL);
/*в с всегда будет только одна запись*/
CREATE TEMPORARY TABLE `c` (`code` int(11) NOT NULL,`size_tool` int(11) NOT NULL);
/*В d хранятся результаты запроса с использованием данных из с */
CREATE TEMPORARY TABLE `d` (`code` int(11) NOT NULL);

 INSERT INTO `b` (id,code,size_tool) VALUE (0,id_search,1);

   while(b != null){

    "insert into c (`code`, `size_tool`) select min(`code`),`size_tool` from b group by `code`;"

    "delet from `b` order by `code` limit 1;

    "insert into d (`code`) select 1 from product join tool on product.type_tool = 0 and product.code_tool = tool.id where product.code = c.code and product.type_tool = 0 and product.size_tool * c.size_tool > too.size;"
    if(d != 0)return 0;

    "insert into b (`id`,`code_tool`,`size_tool`)select `id`, `code_tool`,`size_tool` from product where `code` = c.code and type_tool = 1;"

}
...
Рейтинг: 0 / 0
java code --> sql procedure/function
    #38836639
scofielcl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Изменения:

Код: plsql
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.
DROP TEMPORARY TABLE IF EXISTS `b`;
DROP TEMPORARY TABLE IF EXISTS `c`;
DROP TEMPORARY TABLE IF EXISTS `d`;

DECLARE @tmpb,@tmpd INT DEFAULT 1;

/*В b храним все узлы дерева , т.е. все записи где type_tool = 1 */
CREATE TEMPORARY TABLE `b` (`id` int(11) NOT NULL AUTO_INCREMENT,`code` int(11) NOT NULL,`size_tool` int(11) NOT NULL);
/*в с всегда будет только одна запись*/
CREATE TEMPORARY TABLE `c` (`code` int(11) NOT NULL,`size_tool` int(11) NOT NULL);
/*В d хранятся результаты запроса с использованием данных из с */
CREATE TEMPORARY TABLE `d` (`code` int(11) NOT NULL);

 INSERT INTO `b` (id,code,size_tool) VALUE (0,id_search,1);

   while(tmpb != 0){
     
     SET @tmpb := (SELECT COUNT(*) FROM `b`);
     SELECT @tmpb;

    "insert into c (`code`, `size_tool`) select min(`code`),`size_tool` from b group by `code`;"

    "delet from `b` order by `code` limit 1;

    "insert into d (`code`) select 1 from product join tool on product.type_tool = 0 and product.code_tool = tool.id where product.code = c.code and product.type_tool = 0 and product.size_tool * c.size_tool > too.size;"
     
     SET @tmpd := (SELECT COUNT(*) FROM `d`);
     SELECT @tmpd;

    if(tmpd != 0)return false;

    "insert into b (`id`,`code_tool`,`size_tool`)select `id`, `code_tool`,`size_tool` from product where `code` = c.code and type_tool = 1;"

}

return true;
...
Рейтинг: 0 / 0
java code --> sql procedure/function
    #38836650
scofielcl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Но данный код не рабочий.
...
Рейтинг: 0 / 0
java code --> sql procedure/function
    #38836827
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну надо как минимум приводить копию кода, а не вольные раасуждения на тему. Что там за кавычки лишние?
Что вообще за логика реализуется кодом - я, например, в этой каше разобраться не могу...
...
Рейтинг: 0 / 0
java code --> sql procedure/function
    #38836833
scofielcl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Копию кода я приложил. это и есть внутренность процедуры которую я хочу написать.
...
Рейтинг: 0 / 0
java code --> sql procedure/function
    #38836834
scofielcl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
т.е. я попробовал реализовать тот же алгоритм что и на ява в 1-ом посте.
...
Рейтинг: 0 / 0
java code --> sql procedure/function
    #38836858
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
scofielcl
Код: plsql
1.
select min(`code`),`size_tool` from b group by `code`

шта?
...
Рейтинг: 0 / 0
java code --> sql procedure/function
    #38836865
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaЧто вообще за логика реализуется кодомятакду, получить состав изделия, т.е. найти всех потомков определённой записи (потомков записи с заданным кодом и type_tool=1)
scofielcl, сюда загляните 13675569
...
Рейтинг: 0 / 0
java code --> sql procedure/function
    #38836874
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tanglir , я тожтакду... но реализация...
...
Рейтинг: 0 / 0
java code --> sql procedure/function
    #38836879
scofielcl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tanglirscofielcl
Код: plsql
1.
select min(`code`),`size_tool` from b group by `code`

шта?

грубый набросок, не имеющий ничего общего с действительностью.
...
Рейтинг: 0 / 0
java code --> sql procedure/function
    #38836892
scofielcl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
почему вы считаете данный кусок кода логически неверным.

Код: plsql
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.
DROP TEMPORARY TABLE IF EXISTS `b`;
DROP TEMPORARY TABLE IF EXISTS `c`;

DECLARE @tmpb,@tmpd INT DEFAULT 1;

/*В b храним все узлы дерева , т.е. все записи где type_tool = 1 */
CREATE TEMPORARY TABLE `b` (`id` int(11) NOT NULL AUTO_INCREMENT,`code` int(11) NOT NULL,`size_tool` int(11) NOT NULL);
/*в с всегда будет только одна запись*/
CREATE TEMPORARY TABLE `c` (`code` int(11) NOT NULL,`size_tool` int(11) NOT NULL);

 INSERT INTO `b` (id,code,size_tool) VALUE (0,id_search,1);

   while(tmpb != 0){
     
     SET @tmpb := (SELECT COUNT(*) FROM `b`);
     SELECT @tmpb;

    "insert into c (`code`, `size_tool`) select min(`code`),`size_tool` from b order by `code`;"

    "delet from `b` order by `code` limit 1;

    SET @tmpd := select 1 from product join tool on product.type_tool = 0 and product.code_tool = tool.id where product.code = c.code and product.type_tool = 0 and product.size_tool * c.size_tool > too.size;
     
    if(tmpd != 0)return false;

    "insert into b (`id`,`code_tool`,`size_tool`)select `id`, `code_tool`,`size_tool` from product where `code` = c.code and type_tool = 1;"

}

return true;
...
Рейтинг: 0 / 0
java code --> sql procedure/function
    #38836915
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Забаная подсветка - ажно шесть строк красным - не наталкивает ни на какие мысли, да?
...
Рейтинг: 0 / 0
java code --> sql procedure/function
    #38836920
scofielcl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ну синтаксис и логика довольно разные понятие, на верность синтаксиса я и не расчитываю.
...
Рейтинг: 0 / 0
java code --> sql procedure/function
    #38836923
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пока синтаксис неверен - логику проверить невозможно. Да и бессмысленно - всё равно код будет изменён.
...
Рейтинг: 0 / 0
java code --> sql procedure/function
    #38836932
scofielcl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
я конечно уберу красное, но суть останеться прежней
Код: plsql
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.
DROP TEMPORARY TABLE IF EXISTS `b`;
DROP TEMPORARY TABLE IF EXISTS `c`;

DECLARE @tmpb,@tmpd INT DEFAULT 1;

/*В b храним все узлы дерева , т.е. все записи где type_tool = 1 */
CREATE TEMPORARY TABLE `b` (`id` int(11) NOT NULL AUTO_INCREMENT,`code` int(11) NOT NULL,`size_tool` int(11) NOT NULL);
/*в с всегда будет только одна запись*/
CREATE TEMPORARY TABLE `c` (`code` int(11) NOT NULL,`size_tool` int(11) NOT NULL);

 INSERT INTO `b` (id,code,size_tool) VALUE (0,id_search,1);

   while(tmpb != 0){
     
     SET @tmpb := (SELECT COUNT(*) FROM `b`);
     SELECT @tmpb;

    insert into c (`code`, `size_tool`) select min(`code`),`size_tool` from b order by `code`;

    delet from `b` order by `code` limit 1;

    SET @tmpd := select 1 from product join tool on product.type_tool = 0 and product.code_tool = tool.id where product.code = c.code and product.type_tool = 0 and product.size_tool * c.size_tool > too.size;
     
    if(tmpd != 0)return false;

    insert into b (`id`,`code_tool`,`size_tool`)select `id`, `code_tool`,`size_tool` from product where `code` = c.code and type_tool = 1;

}

return true;
...
Рейтинг: 0 / 0
java code --> sql procedure/function
    #38836942
scofielcl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот так:

Код: plsql
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.
DROP TEMPORARY TABLE IF EXISTS `b`;

DECLARE @tmpb,@tmpd INT DEFAULT 1;
DECLARE @code,@size_tool INT DEFAULT 1;

/*В b храним все узлы дерева , т.е. все записи где type_tool = 1 */
CREATE TEMPORARY TABLE `b` (`id` int(11) NOT NULL AUTO_INCREMENT,`code` int(11) NOT NULL,`size_tool` int(11) NOT NULL);

 INSERT INTO `b` (id,code,size_tool) VALUE (0,id_search,1);

   while(tmpb != 0){
     
    SET @tmpb := (SELECT COUNT(*) FROM `b`);

    SET @code := select `code` from b order by `code` limit 1;
    SET @size_tool := select `size_tool` from b order by `code` limit 1;

    Delet from `b` order by `code` limit 1;

    SET @tmpd := select 1 from product join tool on product.type_tool = 0 and product.code_tool = tool.id where product.code = @code and product.type_tool = 0 and product.size_tool * @size_tool > tool.size;
     
    if(tmpd != 0)return false;

    Insert into b (`id`,`code_tool`,`size_tool`)select `id`, `code_tool`,`size_tool` from product where `code` = @code and type_tool = 1;

}

return true;
...
Рейтинг: 0 / 0
java code --> sql procedure/function
    #38836970
скукотища
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
scofielcl,
максимальная глубина дерева ограничена ?
...
Рейтинг: 0 / 0
java code --> sql procedure/function
    #38837032
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это вообще на каком языке написано? фигурные скобки и прочие неизвестные серверу MySQL конструкции...
...
Рейтинг: 0 / 0
java code --> sql procedure/function
    #38837042
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А алгоритм можно сделать таким.

Создаём таблицу для накопления запчастей. Поле ID объявляем уникальным (можно первичным ключом).
Кладём с неё начальную запись.
Организуем цикл.
Получаем и сохраняем в переменной количество записей таблицы.
Вставляем в таблицу записи из исходных данных, связав их соотв. образом с временной и игнорируя дубликаты.
Снова сохраняем в переменной количество записей таблицы.
Продолжаем цикл, пока количества не совпадают. Количество циклюв получится на 1 больше макс. уровня вложенности.
Теперь осталось связать таблицу со второй исходной и вывести результат.
...
Рейтинг: 0 / 0
java code --> sql procedure/function
    #38837067
scofielcl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сейчас буду пробовать. Глубина ограничена.
...
Рейтинг: 0 / 0
25 сообщений из 45, страница 1 из 2
Форумы / MySQL [игнор отключен] [закрыт для гостей] / java code --> sql procedure/function
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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