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设置为product表中的唯一键,将prod_id设置为主键,并在despatch表中将两者都设置为外键约束.我需要将prod_name包含在despatch表中,以允许表的读者更多地了解需要找到的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行

最佳答案
您的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.如果您需要提供人类可读的数据版本,我建议您构建一个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

转载注明原文:ora-00933:SQL命令未正确结束 - 代码日志