簡體   English   中英

PL / SQL過程錯誤

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM