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 ;
答案 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 ;