过程中 UPDATE oracle 中的变量:标识符无效
Posted
技术标签:
【中文标题】过程中 UPDATE oracle 中的变量:标识符无效【英文标题】:Variable in UPDATE oracle in procedure : invalid identifier 【发布时间】:2012-10-22 08:58:04 【问题描述】:我不明白为什么服务会抱怨 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 ;
【问题讨论】:
【参考方案1】:您的问题是 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
【讨论】:
【参考方案2】:确保
FPWL_VP_MAPPING.SYFA_VP
与
的类型相同IFT_INFO_LAUF.VP
并确保
SELECT SYFA_VP INTO found_VP FROM FPWL_VP_MAPPING WHERE INFO_VP=search_VP ;
不返回多行。 但我怀疑您给出的错误是否属于这种情况。
【讨论】:
【参考方案3】:由于错误消息指的是第 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
关键字) .
【讨论】:
以上是关于过程中 UPDATE oracle 中的变量:标识符无效的主要内容,如果未能解决你的问题,请参考以下文章
c# 调用Oracle存储过程 PLS-00201:必须声明标识符