0

助けが必要です。ここで助けを求めるのは初めてなので、下手な英語ですみません。このエラーを修正する方法がわからないので、私はとても怒っています。私はで働いていOracle 10gます。出力は次のとおりです。

Function created.
No errors.
Function created.
Enter value for v_numes: 'SECTIA1'  --SECTIA1 is the name of section(department) from sectii table
Sectia exista in baza de date SECTIA1
Numele sectiei este: SECTIA1 --the name of the department(v_numes)
DECLARE
*
ERROR at line 1:
ORA-06502: PL/SQL: numeric or value error: character to number conversion error
ORA-06512: at "SYSTEM.FUNCTION0", line18
ORA-01403: no data found
ORA-06512: at line 17

ここに私のコードがあります:

set serveroutput on 
set verify off
CREATE OR REPLACE FUNCTION function0(p_section_name VARCHAR) RETURN NUMBER IS
    v_procent1  CONSTANT REAL:=0.01;
    v_cods      sectii.cods%TYPE;--the table is named sectii, which means sections
    v_ok1       NUMBER:=1;
BEGIN
    DBMS_OUTPUT.PUT_LINE('Numele sectiei este: '||p_section_name);
    SELECT cods
    INTO v_cods
    FROM sectii
    WHERE den=UPPER(p_section_name);
    DBMS_OUTPUT.PUT_LINE('Codul sectiei pentru '||p_section_name||' este '||v_cods);

    RETURN (v_ok1);
EXCEPTION
    WHEN TOO_MANY_ROWS THEN
        RETURN 'Prea multe sectii cu acest nume.';
    WHEN NO_DATA_FOUND THEN
        RETURN 'Nici o sectie cu acest nume.';
    WHEN OTHERS THEN
        RAISE_APPLICATION_ERROR(-20011,'Unknown Exception in function0');
END function0;
/
show errors;
/
DECLARE
    v_numes             VARCHAR2(255);
    v_numesu            VARCHAR2(255);
    v_numesl            VARCHAR2(255);
    v_boool             NUMBER:=1;
    e_invalid_section   EXCEPTION;
BEGIN
    v_numes:=&v_numes;
    IF SQL%NOTFOUND THEN
        RAISE e_invalid_section;
    ELSE
        DBMS_OUTPUT.PUT_LINE('Sectia exista in baza de date '|| v_numes);
    END IF;
    v_numesu:=UPPER(v_numes);
    v_numesl:=LOWER(v_numes);
    IF v_numes=v_numesl OR v_numes=v_numesu THEN
        DBMS_OUTPUT.PUT_LINE('FUNCTION0 '||function0(v_numes));
    END IF; 
    --v_numes:=TO_CHAR(v_numes);
    --DBMS_OUTPUT.PUT_LINE('RETURN FUNCTIE0: '||v_boool);
EXCEPTION
    WHEN e_invalid_section THEN --exceptie definita de utilizator
        DBMS_OUTPUT.PUT_LINE('Nu exista aceasta sectie in tabelul sectii.');    
END;
/
4

1 に答える 1

4

の宣言はFUNCTION0、関数が数値を返すことを示しています。

CREATE OR REPLACE FUNCTION function0(p_section_name VARCHAR) RETURN NUMBER IS

例外ブロックの return ステートメントは文字を返します...

EXCEPTION
    WHEN TOO_MANY_ROWS THEN
        RETURN 'Prea multe sectii cu acest nume.';
    WHEN NO_DATA_FOUND THEN
        RETURN 'Nici o sectie cu acest nume.';

注意すべきことの1つは、あなたのエラーは非常に具体的でした:

ERROR at line 1:
ORA-06502: PL/SQL: numeric or value error: character to number conversion error
ORA-06512: at "SYSTEM.FUNCTION0", line18
ORA-01403: no data found
ORA-06512: at line 17

これは、18 行目で文字を数値に変換していて、17 行目で NO_DATA_FOUND 例外が発生したことを意味します...

すべてのコメントに 1 か所で回答するには、既に述べたように、WHERE 句が原因で NO_DATA_FOUND 例外が発生します。

WHERE den = UPPER(p_section_name)

次の SELECT ステートメントを実行します。

select * from cods where den = upper(den)

true ではないため、行は返されません。パラメータp_section_nameを大文字にする場合は、列も大文字にする必要がありますden。大文字と小文字を区別せずに検索する必要があります。詳細については、Oracleでの大文字と小文字を区別しない検索を参照してください。

于 2013-06-22T09:49:48.980 に答える