【问题标题】:PL/SQL expression cannot be used不能使用 PL/SQL 表达式
【发布时间】:2018-07-24 19:19:30
【问题描述】:

在尝试运行以下 sql 时出现以下错误:

错误:PLS-00363:表达式“PNUM”不能用作分配目标 线路:622

Procedure insertRec(pNum In VARCHAR2
                    ,pName in VARCHAR2)
Is
Begin

    IF  pNum ='0' Then
      pNum = '100';
   End;

  Insert into insertNum(Num,Name) values(pNum,pName);    

End;

【问题讨论】:

  • 您确定要使用字符串吗?名称 NumpNum 表明您期待数字。一个可能的问题:' 0''0 ' 不等于 '0'

标签: sql oracle plsql


【解决方案1】:

pnum 是一个IN 参数;为什么要将它设置为其他值?如果您坚持这样做,请将其设置为 IN OUT 参数,这会使事情变得复杂,因为您不能只是 call 该过程,而是声明一个将传递给该过程的变量(就像你有将OUT 值放在某处)。

另外,您不使用= 分配值,而是使用:=(即pnum := '100';)。

这是一个例子:

SQL> create table insertnum (num varchar2(10), name varchar2(20));

Table created.

SQL> create or replace procedure insertrec (pnum in out varchar2, pname in varchar2) is
  2  begin
  3    if pnum = '0' then
  4       pnum := '100';
  5    end if;
  6    insert into insertnum (num, name) values (pnum, pname);
  7  end ;
  8  /

Procedure created.

SQL>
SQL> declare
  2    l_n varchar2(10) := '0';
  3  begin
  4    insertrec(l_n, 'x');
  5  end;
  6  /

PL/SQL procedure successfully completed.

SQL>
SQL> select * from insertnum;

NUM        NAME
---------- --------------------
100        x

SQL>

但是,应该用DECODE(或CASE)重写为

SQL> create or replace procedure insertrec (pnum in varchar2, pname in varchar2) is
  2  begin
  3    insert into insertnum (num, name) values (decode(pnum, '0', '100', pnum), pname);
  4  end ;
  5  /

Procedure created.

SQL> begin
  2    insertrec('20', 'y');
  3  end;
  4  /

PL/SQL procedure successfully completed.

SQL> select * From insertnum;

NUM        NAME
---------- --------------------
100        x
20         y

SQL>

【讨论】:

    【解决方案2】:

    您不能更改 IN 参数的值。改为声明一个变量。

    PROCEDURE insertRec(pNum IN VARCHAR2, pName IN VARCHAR2)
    IS
        num pNum%Type;
    BEGIN
        num := pNum;
        IF pNum ='0' THEN
            num := '100';
        END;
    
        INSERT INTO insertNum(Num,Name) VALUES(num,pName);    
    END;
    

    【讨论】:

    • 这并不完全正确。如果参数的类型是IN OUTOUT,您可以为其分配一个新值 - 事实上,如果您不能分配给OUT 参数,它们将毫无用处。
    猜你喜欢
    • 1970-01-01
    • 2014-07-27
    • 2016-01-24
    • 2019-06-10
    • 1970-01-01
    • 2015-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多