Oracle 如何从select语句为变量赋值(PL/SQL开发人员)
我正在与PL/SQL开发人员合作 我正在尝试更新现有表中的值。 用于填充行的值应自动递增。起始值是该字段中已存在的最大值 例如,我有下表Oracle 如何从select语句为变量赋值(PL/SQL开发人员),oracle,plsqldeveloper,Oracle,Plsqldeveloper,我正在与PL/SQL开发人员合作 我正在尝试更新现有表中的值。 用于填充行的值应自动递增。起始值是该字段中已存在的最大值 例如,我有下表 ORDER_ID T_NAME T_PRICE 20 CAR 50 NULL VAN 100 NULL BIKE 10 NULL BOAT 300 运行查询后,我希望表如下所示: ORDER_ID T_NAME T_PRICE 20
ORDER_ID T_NAME T_PRICE
20 CAR 50
NULL VAN 100
NULL BIKE 10
NULL BOAT 300
运行查询后,我希望表如下所示:
ORDER_ID T_NAME T_PRICE
20 CAR 50
21 VAN 100
22 BIKE 10
23 BOAT 300
到目前为止,我创建的查询是:
DECLARE
temp_order_id number;
BEGIN
:temp_order_id = SELECT ISNULL(MAX((ORDER_ID)),0) + 1 FROM SALES_ACC;
update SALES_ACC
set (ORDER_ID) = :temp_order_id , :temp_order_id = :temp_order_id + 1
where (ORDER_ID) is null;
END;
Oracle不喜欢将select语句中的值赋给temp\u order\u id变量
有人知道如何修复它吗?您不需要pl/sql来解决这个问题-您可以在一个更新语句中完成它-例如:
create table test1 as
select 20 order_id, 'CAR' t_name, 50 t_price from dual union all
select null order_id, 'VAN' t_name, 100 t_price from dual union all
select null order_id, 'BIKE' t_name, 10 t_price from dual union all
select null order_id, 'BOAT' t_name, 300 t_price from dual;
update test1
set order_id = (select max(order_id) from test1) + rownum
where order_id is null;
commit;
select * from test1
order by 1;
ORDER_ID T_NAME T_PRICE
---------- ------ ----------
20 CAR 50
21 VAN 100
22 BIKE 10
23 BOAT 300
drop table test1;
作为旁注,order_id听起来应该是表的主键——如果您有主键,那么就不允许添加没有值的行。此外,还需要一个序列,以便在将数据插入表时使用-例如:
insert into test1 (order_id, t_name, t_price)
values (test1_seq.nextval, 'TRIKE', 30);
ORACLE推荐的方法是: 在表上创建一个序列和一个触发器,以便在插入行时立即分配order_id 或者,对于Oracle 12c,您可以有一个标识列 请参阅,这两种方法都在此处进行了描述。在DECLARE。。。开始终止部分,您使用的是PL/SQL语法。这与SQL语法不同。在PL/SQL语法中,应该使用所谓的SELECTINTO语句
SELECT ISNULL(MAX((ORDER_ID)),0) + 1
into :temp_order_id
FROM SALES_ACC
序列工作得很好,请参见此处序列仅在向表中添加新记录时工作,对吗?但是我需要一种更新现有记录的方法。您也可以使用序列更新记录。您能否提供一个示例,说明在这种情况下如何执行1或2?是的,但是如何在没有序列和触发器的情况下更新表?