2014-10-24 2 views
0

Я знаю, что мне не нужно использовать SQL, но у меня есть другой код между объявлением begin и end. Я просто извлек эту часть, и все работает, кроме этого. Я получаю следующее сообщение об ошибке:SQL не правильно закончился?

Error report: 
ORA-06550: line 5, column 5: 
PL/SQL: ORA-00933: SQL command not properly ended 
ORA-06550: line 3, column 5: 
PL/SQL: SQL Statement ignored 
06550. 00000 - "line %s, column %s:\n%s" 
*Cause: Usually a PL/SQL compilation error. 
*Action: 

Это код:

DECLARE 
BEGIN 
    UPDATE octombrie 
    SET nr_imprumut = I.nr 
    from (select book_date bd,count(book_date) nr 
       from rental 
      where to_char(book_date,'mm') like '10' 
      group by book_date) I 
    where data = I.bd; 
END; 
/

Я не понимаю, что я сделал не так?

EDIT: book_date даст мне день с октября. В этот день сдаются несколько книг, поэтому я узнаю, сколько книг, которые я снимал, подсчитывая количество раз в то же время (арендованные книги находятся в арендной таблице). Затем я беру эти данные и обновляю таблицу в октябре (я ставлю количество книг aka 'nr', где дата в октябрьской таблице соответствует дате, в которой книги, которые были арендованы);

+0

потому что дни уже существуют в octombrie, но количество арендованных книг равно 0, поэтому я обновляю те столбцы, которые мне плохо говорят о вставке вместо обновления. –

+1

'from' не является законным в инструкции' update'. Пожалуйста, ознакомьтесь с руководством по эксплуатации: http://docs.oracle.com/cd/E11882_01/server.112/e41084/statements_10008.htm#SQLRF01708 –

+0

О, подумал, но потом я увидел парня, у которого был, и я был похож, ничего себе! –

ответ

3
DECLARE 
BEGIN 
    UPDATE octombrie o 
     SET o.nr_imprumut = 
      (select count(r.book_date) 
      from rental r 
      where to_char(r.book_date,'mm') like '10' and o.data = r.book_date) 
    WHERE exists (select 1 from rental r 
        where to_char(r.book_date,'mm') like '10' and o.data = r.book_date); 
END; 

Использование

where exists (select 1 from rental r 
       where to_char(r.book_date,'mm') like '10' and o.data = r.book_date) 

если вы хотите обновить только те строки, для которых вы нашли что-то в аренду (в противном случае все строки будут обновлены в octombrie)

Другой вариант (обновляет все Октябрь 2014 в octombrie, для каждого из этих данных рассчитывается количество аренды по этим данным)

UPDATE octombrie o 
SET o.nr_imprumut = 
    (select count(r.book_date) 
     from rental r 
    where r.book_date between trunc(o.data) and trunc(o.data) + 1 - 1/24/60/60) 
WHERE o.data between to_date('2014-10-01','yyyy-mm-dd') and to_date('2014-10-31 23:59:59','yyyy-mm-dd hh24:mi:ss'); 
+0

ваш ответ хорош, я имею в виду, что он компилируется, но у него есть некоторые проблемы. Сначала мне нужен счетчик для каждого дня, а не общий счет, поэтому мне нужна эта группа по book_date и. Второй (ну это не проблема) Мне не нужно, Где существует, потому что из аренды я получаю только даты, когда что-то снималось –

+0

после того, как я поставил то, что мне нужно на месте (выберите count (r.book_date), r.book_date от аренда r, octombrie o , где to_char (r.book_date, 'mm'), вроде '10' и to_char (o.data, 'dd-mm'), как to_char (r.book_date, 'dd-mm') GROUP BY r.book_date ) ОЖИДАЕТСЯ ОШИБКА ..... –

+0

@LucianTarna Вы ошибаетесь, я думаю, вы не знаете, как работают подзапросы (не было никакого преступления). Вам не нужна 'group by', потому что подзапрос выполняется отдельно для каждой строки, на которую влияет инструкция' update'. Без 'where exists' оператор' update' обновит все остальные строки (не в октябре) до 0, я не думаю, что вы этого хотите. –

1

Я думаю, что вы действительно хотели что-то вроде этого:

DECLARE 
BEGIN 
    UPDATE octombrie o 
     SET o.nr_imprumut = 
     (SELECT count(1) 
      FROM rental r 
      WHERE r.book_date between o.data and o.data+1-1/86400) 
     WHERE data between to_date('2014-10-01','yyyy-mm-dd') and to_date('2014-10-31','yyyy-mm-dd'); 
END; 

Обратите внимание, что ГДЕ-клаузула UPDATE-заявление указывает год, я не думаю, что вы хотите обновляемых ваши записи на все дни в любом октябре , Ограничение такой даты (с помощью оператора BETWEEN, но без TO_CHAR) позволяет использовать индекс на octombrie.data, что-то, на что я надеюсь, что у вас есть.

+0

он работает, но он дает мне результат «8», который является общим количеством арендованных книг в октябре месяце, мне нужно общее количество в каждый день октября месяца (так на 1-м я арендовал 2 книги, на втором я арендовал 3 книги и т. Д.) –

+0

Спасибо, ваш ответ прекрасен! : D Я беру все, что я сказал назад. Я отставлен. –

+0

Нет, вы этого не сделали ;-) Но вам нужно учиться, как мы все должны были. –

Смежные вопросы