Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle 如何从select语句为变量赋值(PL/SQL开发人员)_Oracle_Plsqldeveloper - Fatal编程技术网

Oracle 如何从select语句为变量赋值(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

我正在与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         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?是的,但是如何在没有序列和触发器的情况下更新表?