PL / SQL过程错误

时间:2016-02-25 11:19:34

标签: oracle plsql

IMAGE [错误(19,3):PL / SQL:忽略SQL语句] [错误(20,8):PLS-00403:表达式'TOTAL'不能用作SELECT / FETCH语句的INTO目标], [错误(21,3):PL / SQL:ORA-00904 ::标识符无效]。

我正在尝试编写一个检索特定图书副本数量的程序,但如果有人可以帮我解决这个问题,我会遇到以下错误。希望图像会有所帮助!

create or replace PROCEDURE copies_of_books (
l_ISBN IN INT,
l_title IN VARCHAR2, 
l_summary IN VARCHAR2,
l_author IN VARCHAR2,
l_date_published IN DATE,
l_pagecount IN INT,
n_name in VARCHAR2 := 'Orcale PL/SQLProgramming',
total varchar
)
AS

BEGIN
IF n_name IS NULL
THEN
  RAISE VALUE_ERROR;
END IF;

SELECT count(*)
into total
from BOOKS
WHERE title = n_name;
DBMS_OUTPUT.PUT_LINE(total);
end copies_of_books ;

3 个答案:

答案 0 :(得分:2)

您的程序规范有total varchar。默认情况下,参数为IN,表示它们是只读的,因此是错误。你需要把它OUT

total out number

您可能还希望它是varchar2,而不是varchar。嗯,实际上,不,你可能希望它是一个不是字符串的数字。

如果您传入一个值并更改它,那么它将被声明为IN OUT,这意味着它将是读/写,并且调用者必须提供初始值。使用OUT时,它是只写的。无论哪种方式,调用者都必须提供变量而不是文字值。

您可以阅读有关subprogram parameter modes的更多信息。

对于这种事情,函数可能更合适:

create or replace FUNCTION copies_of_books (
l_ISBN IN INT,
...
n_name in VARCHAR2 := 'Orcale PL/SQLProgramming'
)
return number
AS
  total number;
BEGIN
...
  return total;
END;

有一个默认的书名似乎有点奇怪,特别是看起来不像它可能匹配任何东西。

答案 1 :(得分:1)

您需要将total参数设置为IN OUT,以便您可以在程序中修改它;所以,试着简单地改变你的程序:

...
total IN OUT varchar2
...

答案 2 :(得分:0)

您使用INT作为输入类型我认为不是您在这种情况下的意思,更多是中间层应用的域名,坚持使用NUMBER。 在启动时为输入参数分配值使用DEFAULT。 你使用VALUE_ERROR是一个很大的NO!这是一个真正的系统错误,应保留原样,出于您的目的,我建议使用EXCEPTION_INIT pragma事件来引发自定义错误,请参阅EXCEPTION_INIT Pragma

除此之外,此代码现在可以正常工作

create or replace PROCEDURE copies_of_books (
l_ISBN IN NUMBER,
l_title IN VARCHAR2, 
l_summary IN VARCHAR2,
l_author IN VARCHAR2,
l_date_published IN DATE,
l_pagecount IN NUMBER,
n_name IN VARCHAR2 DEFAULT 'Oracle PL/SQLProgramming'
)
AS
total number(6) := 0;
BEGIN
IF n_name IS NULL
THEN
  RAISE VALUE_ERROR;
END IF;

SELECT count(*)
into total
from BOOKS
WHERE title = n_name;

DBMS_OUTPUT.PUT_LINE(total);
end copies_of_books ;