Ошибка исходит от ORDER BY IdVenta DESC
, который не ожидается в этот момент в выражении. Если вы используете подзапрос в предложении values, то он должен возвращать одно значение, и упорядочивание одного значения не имеет особого смысла. (Это более общее правило, чем это, хотя в некоторых местах это разрешено, но игнорируется).
Поскольку у вас, похоже, есть порядок для ROWNUM
, вам все равно нужен другой уровень подзапроса:
INSERT INTO DETALLEVENTA(Idventa, IdProducto, Cantidad, Precio_Uni, Descuento)
VALUES((
SELECT IdVenta
FROM (
SELECT IdVenta
FROM Venta
ORDER BY IdVenta DESC
)
WHERE ROWNUM = 1
), pIdProducto, pCantidad, pPrecio_Uni, pDescuento);
Не обращая внимания на то, что это пока что в предложении значений, если вы только что это сделали:
SELECT IdVenta
FROM Venta
WHERE ROWNUM = 1
ORDER BY IdVenta DESC
Затем сначала применяется фильтр rownum
, а затем вы заказываете эту единственную строку, которая не имеет смысла. Строка, которую вы фактически получаете, является неопределенной - она зависит от того, как оптимизатор выполняет запрос, и может варьироваться даже между вызовами одного и того же запроса.
То, что вы на самом деле хотите, это:
SELECT IdVenta
FROM (
SELECT IdVenta
FROM Venta
ORDER BY IdVenta DESC
)
WHERE ROWNUM = 1
, где сначала упорядочивается общий набор результатов, а затем во внешнем запросе применяется фильтр rownum
. Если вы сделаете это, значит, вы получите IdVenta
, который вы ожидаете, тот, который заказывается последним.
Итак, вам нужно встроить тот же подзапрос в предложение values, как и его собственный подзапрос.
Возможно, есть лучшие способы сделать это; кажется, вы выполняете это внутри блока PL / SQL, поэтому вы можете выполнить этот запрос один раз и, например, сохранить его в переменной. Из 12c есть и другие способы получить «верхний» ряд. Или вы можете пропустить подзапрос и предложение values, изменив значение insert .. select
, как показало @Barbaros.