[英]PL/SQL Procedure error
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 ;
您的過程規范total varchar
。 默認情況下,參數為IN
,這意味着它們是只讀的,因此會出錯。 您需要將其設為OUT
:
total out number
您可能還希望它是varchar2
,而不是varchar
。 好吧,實際上,不,您可能希望它是一個數字而不是字符串。
如果要傳入一個值並進行更改,則它將被聲明為IN OUT
,這意味着它將被讀/寫,並且調用者將不得不提供一個初始值。 對於OUT
它是只寫的。 無論哪種方式,調用者都必須提供變量而不是文字值。
您可以閱讀有關子程序參數模式的更多信息。
對於這種事情,函數可能更合適:
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;
擁有默認的書名似乎也有些奇怪,特別是看起來不匹配的書。
您需要將total
參數設置為IN OUT
,以便您可以在過程中對其進行修改。 因此,嘗試在以下位置簡單地更改您的過程:
...
total IN OUT varchar2
...
在這種情況下,您認為將INT
用作輸入類型不是您的意思,更多的是中間層應用程序的領域,請堅持使用NUMBER
。 在初始化時將值分配給輸入參數使用DEFAULT
。 您使用VALUE_ERROR
! 這是一個真正的系統錯誤,應按原樣保留,出於您的目的,我建議使用EXCEPTION_INIT
編譯指示引發自定義錯誤,請參閱EXCEPTION_INIT編譯指示
除此之外,此代碼現在應該可以正常工作
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 ;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.