Однострочный подзапрос возвращает более одной строки для запроса на обновление | PLSQL |

Я немного застрял с этим, не понимая, как мне написать код.

У меня есть таблица под названием STUDENT с этими данными:

STUDID | NAME | SURNAME | STUDENT_FILE       | CLASS 
-------+------+---------+--------------------+-------
154    | Vil  | Docs    | \\demo\\F\\A.csv   | A  
132    | Nil  | Fics    | \\do\\F\\X.csv     | A
123    | Sag  | Ter     | \\de\\F\\Y.csv     | A
178    | Mia  | Jac     | \\mo\\F\\Z.csv     | A
167    | Dic  | Pol     | D.csv              | A
134    | Mic  | Kil     | (null)             | A

Мой ожидаемый результат в следующем формате, где мне нужно удалить все имена путей и сохранить только имя файла в столбце STUDENT_FILE

STUDID | NAME | SURNAME | STUDENT_FILE       | CLASS 
-------+------+---------+--------------------+-------
154    | Vil  | Docs    | A.csv              | A  
132    | Nil  | Fics    | X.csv              | A
123    | Sag  | Ter     | Y.csv              | A
178    | Mia  | Jac     | Z.csv              | A
167    | Dic  | Pol     | D.csv              | A
134    | Mic  | Kil     | (null)             | A

Мой код:

DECLARE 
   CNT NUMBER 
BEGIN
     SELECT COUNT(STUD_ID) INTO CNT FROM STUDENT;
     
     FOR i...CNT LOOP
     UPDATE STUDENT SET STUDENT_FILE=(SELECT SUBSTR(STUDENT_FILE,(INSTR(STUDENT_FILE,'\',-1,1)+1),LENGTH(STUDENT_FILE)) AS FL FROM STUDENT) where CLASS='A' and ROWNUM :=i;    
     END LOOP;
END;
/   

я получаю сообщение об ошибке

Single-row subquery returns more than one row

Любое решение высоко ценится или как его можно создать как общую хранимую процедуру?

Вам нужно выбрать 1 запись, вам нечего ее уменьшать, как и отношение к основному запросу. Вы обновляете просто часть подстроки, нет необходимости в подзапросе, например update tbl set a=x where class=a and rownum=i

Nathan_Sav 17.05.2022 11:51
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
0
1
28
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вам не нужен PL/SQL, только обычное ОБНОВЛЕНИЕ:

UPDATE student
   SET student_file =
          SUBSTR (student_file,
                  (  INSTR (student_file,
                            '\',
                            -1,
                            1)
                   + 1),
                  LENGTH (student_file))
 WHERE class = 'A'

Кстати, rownum = i — это просто неправильный способ доступа к любой строке, он никогда не бывает верным (если только i = 1).


Кроме того, более простой вариант - использовать

UPDATE student
   SET student_file =
          SUBSTR (student_file, INSTR (student_file, '\', -1) + 1)
 WHERE class = 'A';

Другие вопросы по теме