Как создать функцию PL sql Проверка, есть ли данные в базе данных или нет - PullRequest
0 голосов
/ 25 января 2020

Я пытаюсь создать функцию, которая сообщает, существуют ли данные в базе данных или нет. Если попытаться решить эту проблему с помощью курсора, если данные существуют, то данные будут извлечены из базы данных, а значение temp будет равно TRUE, в противном случае данные не будут извлечены из БД, и будет установлено значение temp равное false.

* 1004. * Но когда я компилирую эту функцию, она выдает предупреждение, что

Предупреждение: функция создана с ошибками компиляции.

CREATE OR REPLACE FUNCTION CHECK_DATA(Eid IN varchar2(5))
RETURN boolean 
IS 
    cursor cemp is select EMPNO from employee where EMPNO = Eid ;
    eno employee.EMPNO%TYPE ;
    temp number;
BEGIN 
    open cemp ;
    fetch cemp into eno ;
    if(cemp%notfound)then
        temp := FALSE ;
    else 
        temp := TRUE ;
    End if ;
    close cemp ;
    return temp ;
END; 
/

Ответы [ 3 ]

0 голосов
/ 25 января 2020

Я рекомендовал использовать неявный курсор и не беспокоиться об открытии / закрытии;

CREATE OR REPLACE FUNCTION CHECK_DATA(Eid IN varchar2(5)) RETURN boolean IS 
  n number;
BEGIN 
 select count(*) into n
 from employee where EMPNO = Eid ;
 if (n > 0) then
   return true;  
 else
    return false;
 end if;
END; 
/
0 голосов
/ 25 января 2020

Другой способ

CREATE OR REPLACE 
function CHECK_DATA(Eid IN varchar2(5)) return boolean is PRAGMA AUTONOMOUS_TRANSACTION;
Begin
Declare
n integer;
begin
    execute immediate 'select count(*) from employee where EMPNO ='||Eid||'' into n;
   if n > 0 then
     return true;  
   else
     return false;
   end if;
end;
End;
/
0 голосов
/ 25 января 2020

Вы можете использовать курсор как этот Ссылка

 DECLARE

       CURSOR cCheck (p_Param IN NUMBER) IS

          SELECT /*+ FIRST_ROWS */ 99

          FROM   my_table

          WHERE  some_column = p_Param

          FOR UPDATE; 

       v_dummy       NUMBER;

       v_row_exists  BOOLEAN;



       v_test    NUMBER := 1;  -- This would actually come from a parameter or somewhere

    BEGIN



       OPEN cCheck(v_test);

       FETCH cCheck INTO v_dummy;

       v_row_exists := cCheck%FOUND;

       CLOSE cCheck;



       IF v_row_Exists THEN

          ... Do something that can't be done with MERGE

       END IF;

       CLOSE cCheck;
...