Próbuję wykonać funkcję, ale:

5/5 PLS-00103: początek funkcji pragma procedura podtyp typu bieżący kursor usuń.

Jak mogę to naprawić?

 create or replace function is_valid_value(resourceToCheck in varchar2,columnToCheck in varchar2,valueToCheck in varchar2)
       return varchar2 is 
    v_value valid_values.resourceName%type;

    declare 
     v_resource  resourceToCheck;
     v_name      columnToCheck;
     v_value     valueToCheck  ;

    begin
    begin   
        Select resourceName,columnName,validValue into v_resource,v_name,v_value
        from valid_values
        where
        resourceName =resourceToCheck
        AND columnName = columnToCheck
        AND validvalue = valueToCheck
        AND
        upper(resourceName) =  upper (valuetoCheck);        

    exception 
        when no_data_found then
            return 0;
           end;
        return 1;
end is_valid_value ;
0
Grafik Krystian 19 grudzień 2019, 17:34
4
Literówka? begin begin
 – 
Dmitry Bychenko
19 grudzień 2019, 17:36

2 odpowiedzi

Wygląda na to, że masz kilka błędów składni w procedurze:

-- function with 3 parameters
create or replace function is_valid_value(resourceToCheck in varchar2,
                                          columnToCheck in varchar2,
                                          valueToCheck in varchar2)
    -- returns varchar2 
    return varchar2 
is 
    -- uses 3 local variables; please, note their types
    v_resource  valid_values.resourceName%type;
    v_name      valid_values.columnName%type;
    v_value     valid_values.validValue%type; 
begin   
    -- if we have a single record
    select resourceName,
           columnName,
           validValue 
      into v_resource,
           v_name,
           v_value
      from valid_values
     where resourceName = resourceToCheck
       and columnName = columnToCheck
       and validvalue = valueToCheck
       and upper(resourceName) = upper(valuetoCheck);        

     -- we return '1' (please, remember the declaration "return varchar2")
     return '1';
exception 
     -- When we have no records
     when no_data_found then
          -- we return '0' (again, we return VarChar2) 
          return '0';
end is_valid_value;
1
Dmitry Bychenko 19 grudzień 2019, 18:03
1
Wierzę, że omówiłeś to wszystko i dałem ci głos. Jeśli się zgadzasz, popraw to: 1. v_value valid_valuesvalidValue%type; na v_value valid_values.validValue%type; (brakuje jednej kropki) 2. zwróć '0'; kończyć się; -- wierzę, że koniec nie jest potrzebny;
 – 
VBoka
19 grudzień 2019, 17:58
1
@VBoka: Dziękuję! Masz rację: sam popełniłem dwa błędy składniowe
 – 
Dmitry Bychenko
19 grudzień 2019, 18:04

W rzeczywistości nie potrzebujesz zapytania do pobierania wartości tylko po to, aby wskazać, czy istnieje rekord, czy nie. Następujące zapytanie wydaje się spełniać wymagania i jest znacznie prostsze. W ten sposób unikniesz obsługi EXCEPTION; żadna ze zwracanych wartości nie jest w rzeczywistości wyjątkiem, więc wydaje się to bardziej „poprawne”. Sugerowałbym również użycie Y / N jako zwrotu, jeśli chcesz VARCHAR2. Użyj 1/0, jeśli chcesz użyć NUMBER. Mieszanie ich może później być mylące ze względu na konserwację.

CREATE OR REPLACE FUNCTION is_valid_value(resourcetocheck   IN VARCHAR2
                                        , columntocheck     IN VARCHAR2
                                        , valuetocheck      IN VARCHAR2)
   RETURN VARCHAR2
IS
   func_result  VARCHAR2(1);

BEGIN
   -- Indicate if it is a valid result
   SELECT rec_exist
     INTO func_result
     FROM (SELECT '1' as rec_exist
             FROM valid_values
            WHERE  resourcename = resourcetocheck
              AND  columnname = columntocheck
              AND  validvalue = valuetocheck
              AND  UPPER(resourcename) = UPPER(valuetocheck)
            UNION ALL
            SELECT '0' FROM dual)
    WHERE rec_exist = 'Y' OR rownum = 1;

   -- we return '1' (please, remember - VarChar2)
   RETURN func_result;

END is_valid_value;
0
BriteSponge 20 grudzień 2019, 12:49
3
Nie musisz wybierać INTO func_result? Nie ma go w zapytaniu, więc nie możesz go wybrać samodzielnie.
 – 
AndyDan
19 grudzień 2019, 21:19
- masz oczywiście całkowitą rację i powinienem poświęcić więcej czasu na ponowne przeczytanie przed wysłaniem. Mam nadzieję, że to naprawiłem.
 – 
BriteSponge
20 grudzień 2019, 12:51