创建表oracle00933,关于oracle: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;

结束;

/

并且出现以下有关唯一约束的错误消息:

开始

*

第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。 如果需要提供人类可读的数据版本,建议您构造一个视图。 例:

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

我尝试运行您的视图代码,但出现以下错误:join dba_xy.product p *第5行出现错误:ORA-00905:缺少关键字

我的错-我忘记了实际的JOIN标准。 立即尝试查看代码。

您是否因为插入两次相同的行而得到唯一约束违例? 是在插入语句的where子句中使用" i",还是您真的希望将行插入两次?

您的第一条语句有两个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;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值