ora-00933: команда SQL не завершена должным образом

У меня такой код:

begin
for i in 1..2 loop
insert into dba_xy.despatch
select desp_id_seq.nextval,
      dbms_random.string('U',5),
      trunc(dbms_random.value(0000,9999)),
      prod_id from dba_xy.product 
              prod_name from dba_xy.product;        
end loop;

конец;

Когда я запускаю его, oracle выдает следующее сообщение об ошибке:

prod_name from dba_xy.product;
                        *

ОШИБКА в строке 8: ORA-06550: строка 8, столбец 29: PL / SQL: ORA-00933: команда SQL не завершена должным образом ORA-06550: строка 3, столбец 2: PL / SQL: инструкция SQL игнорируется

Я пытаюсь связать существующие prod_id и prod_name с новыми данными, вставленными в таблицу отправки. Я установил prod_name в качестве уникального ключа в таблице продуктов и prod_id в качестве первичного ключа и установил оба ограничения в качестве ограничений внешнего ключа в таблице отправки. Мне нужно включить prod_name в таблицу отправки, чтобы читатели таблицы могли лучше понимать, какое prod_name нужно найти и т. Д., Вместо того, чтобы просто указывать prod_id, который не будет иметь для них никакого смысла. Но, возможно, я подумал, что мне не нужен prod_id в таблице отправки. Пожалуйста помоги.

После удаления столбца prod_id из таблицы отправки я изменил свой код:

begin
for i in 1..2 loop
insert into dba_xy.despatch
select desp_id_seq.nextval,
      dbms_random.string('U',5),
      trunc(dbms_random.value(0000,9999)),
              prod_name from dba_xy.product;        
end loop;

конец; /

и появилось следующее сообщение об ошибке об ограничении уникальности: begin * ERROR в строке 1: ORA-00001: ограничение уникальности (DBA_XY.PROD_NAME_UC) нарушено ORA-06512: в строке 3


person taksIV    schedule 24.08.2009    source источник


Ответы (2)


Ошибка ORA-00933 связана с неверно отформатированным оператором SELECT:

SELECT desp_id_seq.nextval,
       dbms_random.string('U',5),
       TRUNC(dbms_random.value(0000,9999)),
       prod_id from dba_xy.product 
       prod_name from dba_xy.product; 

... когда это должно быть:

SELECT DESP_ID_SEQ.nextval,
       DBMS_RANDOM.string('U',5),
       TRUNC(DBMS_RANDOM.value(0000,9999)),
       t.prod_id,
       t.prod_name 
  FROM dba_xy.product t; 

Вам не хватало запятой для разделения столбцов prod_id и prod_name, и, кроме того, в неправильном месте было избыточное объявление FROM dba_xy.product.

При этом таблица dba_xy.despatch должна содержать только prod_id. Если вам нужно предоставить удобочитаемую версию данных, я рекомендую вам создать представление. Пример:

CREATE VIEW despatch_vw AS
SELECT t.prod_id,
       p.prod_name
  FROM dba_xy.despatch t
  JOIN dba_xy.product p ON p.prod_id = t.prod_id
person OMG Ponies    schedule 24.08.2009
comment
Я попытался запустить ваш код представления, и возникла следующая ошибка: присоединиться к dba_xy.product p * ОШИБКА в строке 5: ORA-00905: отсутствует ключевое слово - person taksIV; 24.08.2009
comment
Моя беда - я забыл фактические критерии JOIN. Попробуйте код просмотра сейчас. - person OMG Ponies; 24.08.2009

Могли ли вы получить нарушение ограничения уникальности из-за того, что дважды вставляете одни и те же строки? Предполагается ли, что «i» будет использоваться в предложении where оператора insert, или вы действительно хотите, чтобы строки вставлялись дважды?

Ваш первый оператор содержит два предложения FROM, поэтому вы получаете синтаксическую ошибку.

select desp_id_seq.nextval,
          dbms_random.string('U',5),
          trunc(dbms_random.value(0000,9999)),
          prod_id, --from dba_xy.product
              prod_name from dba_xy.product;    
person Plasmer    schedule 24.08.2009