【问题标题】:how to create pl sql function to Checking if data exists in database or not如何创建pl sql函数来检查数据库中是否存在数据
【发布时间】:2020-05-11 09:51:39
【问题描述】:

我正在尝试创建一个函数来判断数据库中是否存在数据。如果数据存在,则尝试使用游标解决此问题,然后将从数据库中获取数据,并且 temp 的值将为 TRUE 否则将不会从 DB 中获取数据并将 temp 的值设置为 false。

但是当我编译这个函数时它会发出警告

警告:函数创建时出现编译错误。

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; 
/

【问题讨论】:

  • 这是一个复杂的返回cemp%found的方式。
  • 您是在问一般如何显示 PL/SQL 编译错误?这将取决于您的开发工具。
  • 您的返回值,temp 需要为boolean,但定义为数字。

标签: sql database function plsql compiler-errors


【解决方案1】:

你可以像这样使用光标Reference

 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;

【讨论】:

    【解决方案2】:

    我建议使用implicit 光标,不要费心打开/关闭;

    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; 
    /
    

    【讨论】:

    • 这很好,但可以缩短。没有必要测试计数本身并对其采取措施。条件 (n>0) 产生一个布尔结果,可以直接返回。所以不是“如果......结束如果;”只需使用“return n>0;”
    【解决方案3】:

    另一种方式

    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;
    /
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-03
      • 1970-01-01
      • 2011-01-14
      • 1970-01-01
      • 2010-10-15
      • 2020-08-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多