覆盖/更改Oracle存储过程中的参数

时间:2016-05-19 13:56:41

标签: oracle stored-procedures

我有一个这样的程序:

PROCEDURE UPDATE_STAT(p_STAT STATS.STATID%TYPE)
IS
 ...   
BEGIN
 ... 
        if (X = 5)
    THEN
        p_Stat := 17;
    END IF;
...
    UPDATE TBL_A SET STATUS = p_Stat WHERE ...
...
END

问题是,当我尝试编译时,我收到错误:

PLS-00363: Expression 'p_Stat' cannot be used as assignment target.

任何人都有解决方法或解决方案吗?局部变量是唯一可以这种方式使用的东西吗?这个参数在函数体中使用了很多,所以用case语句替换每个实例都会很痛苦。提前谢谢。

2 个答案:

答案 0 :(得分:2)

您将参数作为IN参数传递 - 这意味着您无法更改它,如果您考虑它,则有意义。这是一个常数,实际上。

根据您的目的,您可以改为:

PROCEDURE UPDATE_STAT(p_STAT STATS.STATID%TYPE)
IS
    v_stat stats.statid%type;
 ...   
BEGIN
    v_stat := p_stat;
 ... 
    if (X = 5) THEN
        v_Stat := 17;
    END IF;
...
    UPDATE TBL_A SET STATUS = v_Stat WHERE ...
...
END

答案 1 :(得分:2)

有两种方法可以解决这个问题:

将参数用作IN OUT参数

将您的程序重新声明为:PROCEDURE UPDATE_STAT(p_STAT IN OUT STATS.STATID%TYPE)。请注意,这也会在调用PL / SQL块中更改p_stat的值,因此这可能会产生不必要的副作用!

首先声明局部变量并为其分配过程参数

PROCEDURE UPDATE_STAT(p_STAT STATS.STATID%TYPE)
IS
 l_stat STATS.STATID%TYPE := p_stat;
BEGIN
 ... 
        if (X = 5)
    THEN
        l_Stat := 17;
    END IF;
...
    UPDATE TBL_A SET STATUS = l_Stat WHERE ...
...
END;
/