我不明白为什么服务抱怨 Fehler(36,11):PL / SQL:ORA-00904:“FOUND_VP”:无效标识符
变量在第一次开始时声明... 是否不能直接在查询中使用变量?
尝试存储以下程序时:
create or replace PROCEDURE fpwl_update_vp(
my_zn IN NUMBER, my_verwaltung IN VARCHAR2 , my_variante IN NUMBER, my_vp IN NUMBER
) IS
BEGIN
DECLARE
search_VP IFT_INFO_LAUF.VP%TYPE;
found_VP IFT_INFO_LAUF.VP%TYPE;
INFOversion number := 25;
BEGIN -- search SYFA_VP
SELECT SYFA_VP
INTO found_VP
FROM FPWL_VP_MAPPING
WHERE INFO_VP=search_VP ;
exception
when no_data_found then
dbms_output.put_line ('Kein SYFA VP : Importiere aus SYFA');
--found_VP:=:=cus_info25.pa_info_data.fn_insert_syfa_vp(my_vp,25);
WHEN OTHERS THEN
ROLLBACK;
RETURN;
END; -- SYFA VP
-- Update VP
UPDATE IFT_INFO_LAUF
SET vp = found_VP
WHERE id_kopf IN
(SELECT id_kopf
FROM ift_info_kopf
WHERE fahrtnummer= my_zn
AND verwaltung= my_verwaltung
AND variante = my_variante
)
;
--COMMIT;
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
END ;
答案 0 :(得分:5)
你的问题是found_VP超出了范围。
将“DECLARE”块的内容移到“IS”之后:
create or replace PROCEDURE fpwl_update_vp(
my_zn IN NUMBER, my_verwaltung IN VARCHAR2 , my_variante IN NUMBER, my_vp IN NUMBER
) IS
search_VP IFT_INFO_LAUF.VP%TYPE;
found_VP IFT_INFO_LAUF.VP%TYPE;
INFOversion number := 25;
BEGIN
BEGIN -- search SYFA_VP
etc
答案 1 :(得分:0)
确保
FPWL_VP_MAPPING.SYFA_VP
与
相同的类型IFT_INFO_LAUF.VP
并确保
SELECT SYFA_VP INTO found_VP FROM FPWL_VP_MAPPING WHERE INFO_VP=search_VP ;
不会返回多行。 但我怀疑你所犯的错误就是这种情况。
答案 2 :(得分:0)
由于错误消息引用了第36行,并且代码示例中对found_VP
的引用位于第18行,因此您省略了实际存在问题的代码部分。
看起来你有一个范围问题;您在内部块(found_VP
/ DECLARE
/ BEGIN
的一个级别)中声明END
并在该块之外引用它,无论是在父块还是另一个块中一个在同一水平。问题不在于您选择进入found_VP
,而是(我认为)您之后再次引用它,超出您发布的代码,因此在块之外变量被声明英寸
为了演示,我会在内部块中声明l_name
,就像你似乎已经做过的那样:
create or replace procedure p42 is
begin
declare
l_name all_tables.table_name%TYPE;
begin
select table_name
into l_name -- this reference is OK
from all_tables
where table_name = 'EMPLOYEES';
end;
select table_name
into l_name -- this reference errors
from all_tables
where table_name = 'JOBS';
end;
/
Warning: Procedure created with compilation errors.
show errors
Errors for PROCEDURE P42:
LINE/COL ERROR
-------- -----------------------------------------------------------------
12/2 PL/SQL: SQL Statement ignored
13/7 PLS-00201: identifier 'L_NAME' must be declared
14/2 PL/SQL: ORA-00904: : invalid identifier
请注意,错误是针对第13行报告的,该行位于外部块中;它不会在内部块中抱怨它,因为它在范围内。
因此,您需要在适当的级别声明变量。正如Colin't Hart所说,它可能位于IS
和第一BEGIN
之间的顶部,因为那是程序级DECLARE
部分(它不需要显式DECLARE
关键字)。