我有以下代码:

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。但是也许我在想,我不需要在 dispatch 表中使用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行

最佳答案

您的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_idprod_name列的逗号,并且在错误的位置附加了多余的FROM dba_xy.product声明。

也就是说, dba_xy.despatch 表应仅包含prod_id。如果您需要提供人类可读的数据版本,建议您构造一个view。例子:
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

关于sql - ora-00933:SQL命令未正确结束,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1319992/

10-10 23:51