如何从 select 语句为变量赋值(PL/SQL 开发人员)

How to assign a value to variable from select statement (PL/SQL Developer)

我正在与 PL/SQL 开发人员合作。

我正在尝试更新列(现有 table)中的值。 用于填充行的值应该自动递增。起始值为该字段中已存在的最大值。

举个例子,我有下面的table

ORDER_ID   T_NAME   T_PRICE
 20         CAR      50       
 NULL       VAN      100
 NULL       BIKE     10
 NULL       BOAT     300

在 运行 查询之后,我希望 table 看起来像:

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_order_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 确实应该是 table 的主键 - 如果你有它,那么你将不会被允许添加没有值的行。另外,您还需要一个序列,然后在将数据插入 table 时使用该序列 - 例如:

insert into test1 (order_id, t_name, t_price)
values (test1_seq.nextval, 'TRIKE', 30);

ORACLE 推荐的方法是:

  1. 在 table 上创建序列和触发器以在插入行后立即分配 order_id
  2. 或者,对于 Oracle 12c,您可以有一个 IDENTITY 列

请参阅 How to create id with AUTO_INCREMENT on Oracle?,那里描述了两种方法。

DECLARE ... BEGIN ... END; 部分中,您使用的是 PL/SQL 语法。这不等于 SQL 语法。在 PL/SQL 语法中,您应该使用所谓的 select into 语句。

SELECT ISNULL(MAX((ORDER_ID)),0) + 1 
into :temp_order_id
FROM SALES_ACC