用戶輸入負數后,我無法顯示最終輸出。
我嘗試創建一個程式,它會不斷地向用戶詢問數字。如果用戶輸入負數,程式將停止運行并顯示總數、平均值、輸入的零數、最高和最低數。下面是我寫的代碼:
SET SERVEROUTPUT ON;
DECLARE
n NUMBER(3);
total NUMBER(3) := 0;
numZeros NUMBER(3) := 0;
average NUMBER(3);
highest NUMBER(3) := 0;
lowest NUMBER(3) := 0;
BEGIN
LOOP
n := &n;
total := total n;
IF n = 0 THEN
numZeros := numZeros 1;
ELSIF n > highest THEN
high := n;
ELSIF n < lowest THEN
low := n;
END IF;
EXIT WHEN n < 0;
END LOOP;
average := total / n;
DBMS_OUTPUT.PUT_LINE('Total: ' || total);
DBMS_OUTPUT.PUT_LINE('Average: ' || average);
DBMS_OUTPUT.PUT_LINE('Number of zeros: ' || numZeros);
DBMS_OUTPUT.PUT_LINE('Highest number: ' || highest);
DBMS_OUTPUT.PUT_LINE('Lowest number: ' || lowest);
END;
輸出拋出一個錯誤,說明“N”不是一個程序。我將不勝感激在解決此問題方面的幫助。
uj5u.com熱心網友回復:
您的代碼存在一個基本問題,&它是一個替換變數,由客戶端應用程式(即 SQL*Plus、SQL Developer 或其他支持替換變數的客戶端,并非所有 Oracle 客戶端都這樣做)進行評估,并且有效地實作了查找替換是在源代碼上完成的。
一旦客戶端替換了替換變數,陳述句就會被發送到 PL/SQL 引擎將決議它的資料庫。PL/SQL 引擎永遠不會看到替換變數(因為它是由客戶端應用程式處理的),即使看到了它也不知道如何處理它。
這意味著系統將提示您替換ONCE(并且僅一次),然后該值將在每次回圈迭代中使用,因此如果您先輸入一個正數,則回圈將永遠不會退出,或者如果您輸入,則立即退出首先是負數。
如果要輸入值串列,則需要一次輸入所有值:
SET SERVEROUTPUT ON;
DECLARE
items SYS.ODCINUMBERLIST := SYS.ODCINUMBERLIST(0,1,2,3,4,5);
total NUMBER(3,0) := 0;
numZeros NUMBER(3,0) := 0;
average NUMBER(5,2) := NULL;
highest NUMBER(3,0) := NULL;
lowest NUMBER(3,0) := NULL;
BEGIN
FOR i IN 1 .. items.COUNT LOOP
total := total items(i);
IF items(i) = 0 THEN
numZeros := numZeros 1;
END IF;
IF highest IS NULL OR items(i) > highest THEN
highest := items(i);
END IF;
IF lowest IS NULL OR items(i) < lowest THEN
lowest := items(i);
END IF;
END LOOP;
IF items.COUNT > 0 THEN
average := total / items.COUNT;
END IF;
DBMS_OUTPUT.PUT_LINE('Total: ' || total);
DBMS_OUTPUT.PUT_LINE('Average: ' || average);
DBMS_OUTPUT.PUT_LINE('Number of zeros: ' || numZeros);
DBMS_OUTPUT.PUT_LINE('Highest number: ' || highest);
DBMS_OUTPUT.PUT_LINE('Lowest number: ' || lowest);
END;
/
或者,使用 SQL:
DECLARE
items SYS.ODCINUMBERLIST := SYS.ODCINUMBERLIST(0,1,2,3,4,5);
total NUMBER(3,0) := 0;
numZeros NUMBER(3,0) := 0;
average NUMBER(5,2) := NULL;
highest NUMBER(3,0) := NULL;
lowest NUMBER(3,0) := NULL;
BEGIN
SELECT COALESCE(SUM(column_value),0),
COUNT(CASE column_value WHEN 0 THEN 1 END),
AVG(column_value),
MAX(column_value),
MIN(column_value)
INTO total,
numZeros,
average,
highest,
lowest
FROM TABLE(items);
DBMS_OUTPUT.PUT_LINE('Total: ' || total);
DBMS_OUTPUT.PUT_LINE('Average: ' || average);
DBMS_OUTPUT.PUT_LINE('Number of zeros: ' || numZeros);
DBMS_OUTPUT.PUT_LINE('Highest number: ' || highest);
DBMS_OUTPUT.PUT_LINE('Lowest number: ' || lowest);
END;
/
小提琴
如果您想接受用戶輸入,則可以將初始行替換為:
SET SERVEROUTPUT ON;
ACCEPT number_list CHAR PROMPT 'Enter a comma-delimited list of numbers:'
DECLARE
items SYS.ODCINUMBERLIST := SYS.ODCINUMBERLIST(&&number_list);
uj5u.com熱心網友回復:
更改此行:
n := &n;
洗掉n;. 它應該是:
n := &
我不知道您是否在此行中犯了錯誤:
high := n;
它應該是:
highest := n;
與此行相同:
low := n;
應該是:
lowest := n;
之后,當我運行代碼時,出現以下編譯錯誤:
ORA-06502: PL/SQL: numeric or value error: number precision too large
這是因為 PL/SQL 在執行 PL/SQL 代碼期間沒有從用戶那里獲取輸入的能力。事實上,這&是 SQL*Plus 的一個特性,而不是 PL/SQL 的特性。回圈只是不斷重復輸入的第一個值 (for &) 直到total大于 999。請參閱將用戶輸入 'n' 次 PL/SQL
和PL/SQL:如何在程序中提示用戶輸入?
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/522704.html
標籤:甲骨文plsql
