如何从 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 推荐的方法是:
- 在 table 上创建序列和触发器以在插入行后立即分配 order_id
- 或者,对于 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
我正在与 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 推荐的方法是:
- 在 table 上创建序列和触发器以在插入行后立即分配 order_id
- 或者,对于 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