PLS-00201:标识符' D'必须申报

时间:2016-03-25 14:55:39

标签: oracle plsql

请检查我的程序。当我尝试将字符串传递给过程时出错。如果我通过号码,它工作正常。

DECLARE 
    x   number(2);
    name    varchar2(333);
    PROCEDURE hello(id IN OUT Number, name in varchar2)
    IS
        i number(2):= 1;
        mName   varchar2(3000):='jjjj';
    BEGIN
        dbms_output.put_line('This line is in procedure'); 
        while i < id
        loop
            mName:= '' || ' ohlla';         
            dbms_output.put_line('Id is ' || i ||  ' name ' || mName );
            i:=i+1;
        end loop;
    END;
BEGIN
    x := &id;
    name:= &somename;   
    hello(x, name);
    dbms_output.put_line('Last line is id= ' || x || ' Finished ' );

END;
/

2 个答案:

答案 0 :(得分:2)

您在分配给字符串变量时缺少引号;尝试:

name:= '&somename';

这样它就可以使用数字ID和文字名称;如果您需要文字ID,则需要更改变量x的类型,并在分配中添加引号x

答案 1 :(得分:0)

首选解决方案是在代码中进行Aleksej建议的更改(在作业中添加引号和&amp; somename)。

一种解决方法,如果您无法更改程序,则可能需要这种方法(例如,如果您不拥有该程序,或者其他程序可能依赖于此程序,并且如果您进行更改,它们可能会中断 - 即使改变是为了使这个程序更好)是将字符串传递给WITH QUOTES过程,如下所示:

  

SQL&GT;为&amp; somename输入值:&#39; mary&#39;

替换变量是逐字替换的,因此您需要varchar2的引号(在一个且只有一个地方,在代码中或在替换变量&amp; somename的赋值中,在过程之外)。

这是您编写的实际程序还是您正在使用它作为示例?我问,因为我没有看到你在哪里使用输入变量&#34; name&#34;在内部程序中。

并且,澄清错误消息:如果传递mary(没有引号),当编译到达违规赋值时,编译器假定mary是另一个变量的名称(因为它不是字符文字);但它知道没有名为mary的变量,所以它引发了你看到的异常。编译器没有正确猜出实际错误是什么(缺少引号)。