ora-00933: команда SQL неправильно завершена - PullRequest
5 голосов
/ 24 августа 2009

У меня есть следующий код:

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;

конец; /

и появилось следующее сообщение об ошибке об уникальном ограничении: начать * ОШИБКА в строке 1: ORA-00001: уникальное ограничение (DBA_XY.PROD_NAME_UC) нарушено ORA-06512: в строке 3

Ответы [ 2 ]

3 голосов
/ 24 августа 2009

Ошибка 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
0 голосов
/ 24 августа 2009

Не могли бы вы получить уникальное нарушение ограничения, потому что вы вставляете одни и те же строки дважды? «I» должен использоваться в предложении where оператора вставки или вы действительно хотите, чтобы строки вставлялись дважды?

Ваш первый оператор имеет два предложения 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;    
...