请检查我的程序。当我尝试将字符串传递给过程时出错。如果我通过号码,它工作正常。
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;
/
答案 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的变量,所以它引发了你看到的异常。编译器没有正确猜出实际错误是什么(缺少引号)。