PL SQL问题:PLS-00382:表达式的类型错误,并且参数的类型相同



我有一个过程,它将循环逗号分隔的字符串,并根据每个值更新语句这是表格:

ID                        NUMBER
MOVEMENT_NUMBER           VARCHAR(150)
STATUS                    VARCHAR(500)

这是pl sql代码

PROCEDURE updateAutomotiveDeliveryStatus(P_MOVEMENT_NUMBERS IN varchar)
is
temp varchar2(500);
BEGIN
FOR temp IN
(SELECT trim(regexp_substr(P_MOVEMENT_NUMBERS, '[^,]+', 1, LEVEL)) l
FROM dual
CONNECT BY LEVEL <= regexp_count(P_MOVEMENT_NUMBERS, ',')+1
)
LOOP
update hr.test1 te set te.status = 'completed'
where status = temp ;
--dbms_output.put_line(MOVEMENT_NUM.*);
END LOOP;
END;

但我一直在哪里条件得到这个错误

[错误]PLS-00382(28:22(:PLS-00382:表达式的类型错误

temp光标。您需要引用它的属性,在本例中是别名表达式l

变量部分中声明的temp被忽略,因为它超出了作用域。也就是说,FOR。。。LOOP构造定义一个游标,循环中的代码引用游标,而不是在游标之外定义的任何变量。

PROCEDURE updateAutomotiveDeliveryStatus(P_MOVEMENT_NUMBERS IN varchar)
is
BEGIN
FOR temp IN
(SELECT trim(regexp_substr(P_MOVEMENT_NUMBERS, '[^,]+', 1, LEVEL)) l
FROM dual
CONNECT BY LEVEL <= regexp_count(P_MOVEMENT_NUMBERS, ',')+1
)
LOOP
update hr.test1 te 
set te.status = 'completed'
where status = temp.l ;
--dbms_output.put_line(MOVEMENT_NUM.*);
END LOOP;
END;

但我的意思是

l是列别名。我们不能引用像trim(regexp_substr(P_MOVEMENT_NUMBERS, '[^,]+', 1, LEVEL))这样的表达式,所以我们给它一个别名,可以在SQL或PL/SQL中使用。通常,最好使用一个有意义的名称,例如movement_number,以使代码更可读。

你发布了太多代码,所以我删除了它。

截至您收到的错误:您不能将值设置为游标,但在您的情况下,光标变量-temp.l

样本数据:

SQL> create table test1 (status varchar2(20));
Table created.
SQL> insert into test1
2    select 'A' from dual union all
3    select 'C' from dual union all
4    select 'D' from dual;
3 rows created.
SQL> select * From test1;
STATUS
--------------------
A
C
D
SQL>

过程:请注意,您声明的变量(第4行(根本没有使用,所以删除它。这个temp与游标for循环中使用的temp不同。

SQL> create or replace
2  PROCEDURE updateAutomotiveDeliveryStatus(P_MOVEMENT_NUMBERS IN varchar)
3    is
4    -- temp varchar2(500); unnecessary; you don't do anything with it
5  BEGIN
6    FOR temp IN
7     (SELECT trim(regexp_substr(P_MOVEMENT_NUMBERS, '[^,]+', 1, LEVEL)) l
8       FROM dual
9          CONNECT BY LEVEL <= regexp_count(P_MOVEMENT_NUMBERS, ',')+1
10     )
11     LOOP
12       update test1 te set te.status = 'completed'
13         where status = temp.l ;
14     END LOOP;
15  END;
16  /
Procedure created.

测试:

SQL> exec updateAutomotiveDeliveryStatus('A,B,C');
PL/SQL procedure successfully completed.
SQL> select * from test1;
STATUS
--------------------
completed
completed
D
SQL>

最新更新