Δοκίμασα τον παρακάτω κώδικα με διάφορους τρόπους, όπως αφαιρώντας το while ή το if, αλλά όταν βάζω και τα δύο μαζί (if και while), πάντα λαμβάνω το σφάλμα στο τέλος...
undefine numero
set serveroutput on
accept numero prompt 'Type # between 100 and 999: '
declare
i number:=1;
a char(25);
b char(1);
c varchar2(10);
d number;
begin
c := №
d := length(c);
b := substr(c, i, 1);
while i <= d loop
if b = '1' then
a:= a||'one ';
end if;
i := i+1;
end loop;
dbms_output.put_line('The number is '||a);
end;
/
ERROR:
ORA-06502: PL/SQL: numeric or value error: character string buffer too small
ORA-06512: at line 13
06502. 00000 - "PL/SQL: numeric or value error%s"
ΦΙΞΕΤΑΙ αλλάζοντας τον τρόπο με τον οποίο δήλωσα τη μεταβλητή "a" σε:
a varchar2(2000);
*Παρατηρήστε ότι εδώ, η σημαντική αλλαγή είναι η χρήση VARCHAR2 αντί CHAR (όχι το μεγαλύτερο μήκος). Σύμφωνα με την απάντηση του @user272735 'αυτό'είναι το κλειδί.
PL/SQL: σφάλμα αριθμητικής ή τιμής: ο απομονωτής συμβολοσειράς χαρακτήρων είναι πολύ μικρός
οφείλεται στο γεγονός ότι δηλώνετε μια συμβολοσειρά ως σταθερού μήκους (π.χ. 20) και σε κάποιο σημείο του κώδικά σας της αναθέτετε μια τιμή της οποίας το μήκος υπερβαίνει αυτό που δηλώσατε.
για παράδειγμα:
myString VARCHAR2(20);
myString :='abcdefghijklmnopqrstuvwxyz'; --length 26
θα πυροδοτήσει ένα τέτοιο σφάλμα
Ο τύπος CHAR
είναι ένας τύπος δεδομένων σταθερού μήκους που χρησιμοποιεί όσο το δυνατόν περισσότερο χώρο. Έτσι, το a:= a||'one ';
θα απαιτήσει περισσότερο χώρο από τον διαθέσιμο. Το πρόβλημά σας μπορεί να μειωθεί στο ακόλουθο παράδειγμα:
declare
v_foo char(50);
begin
v_foo := 'A';
dbms_output.put_line('length of v_foo(A) = ' || length(v_foo));
-- next line will raise:
-- ORA-06502: PL/SQL: numeric or value error: character string buffer too small
v_foo := v_foo || 'B';
dbms_output.put_line('length of v_foo(AB) = ' || length(v_foo));
end;
/
Ποτέ μην χρησιμοποιείτε το char
. Για το σκεπτικό ελέγξτε την ακόλουθη ερώτηση (διαβάστε επίσης τους συνδέσμους):