【问题标题】:Check a record IS NOT NULL in plsql检查 plsql 中的记录 IS NOT NULL
【发布时间】:2011-11-04 16:37:47
【问题描述】:

我有一个函数会返回一个类型为 my_table%ROWTYPE 的记录,在调用者中,我可以检查返回的记录是否为空,但是 PL/SQL 会抱怨 if 语句

PLS-00306:调用“IS NOT NULL”时参数的数量或类型错误

这是我的代码:

v_record my_table%ROWTYPE;
v_row_id my_table.row_id%TYPE := 123456;
begin
    v_record := myfunction(v_row_id)
    if (v_record is not null) then
        -- do something
    end if;
end;

function myfunction(p_row_id in my_table.row_id%TYPE) return my_table%ROWTYPE is
    v_record_out my_table%ROWTYPE := null;
begin
    select * into v_record_out from my_table
    where row_id = p_row_id;
    return v_record_out;
end myfunction;

谢谢。

【问题讨论】:

    标签: plsql notnull


    【解决方案1】:

    据我所知,这是不可能的。不过,检查 PRIMARY KEYNOT NULL 列就足够了。


    您可以查看v_record.row_id IS NULL

    但是,当找不到记录时,您的函数会抛出 NO_DATA_FOUND 异常。

    【讨论】:

    • 感谢您的回答。这是检查记录是否为空的唯一方法吗?对我来说很奇怪,我们可以将 null 分配给记录,但不能检查记录是否为 null。
    • 据我所知,这是不可能的。不过,检查 PRIMARY KEYNOT NULL 列就足够了。
    • 很好的解决方法!我使用NULL的赋值来记录,这是检查的方式! +1
    • 在很多情况下是一个不错的解决方法,但就其价值而言,这样做会摆脱使用 %ROWTYPE 属性的一些便利性和安全性。如果你这样做,你还不如手动定义RECORDSELECT INTO
    【解决方案2】:

    您无法测试此变量是否不存在,因此有两种方法可以解决。检查是否存在单个元素。我不喜欢这样,因为这意味着如果有任何更改您的代码将不再有效。相反,为什么不在那里没有数据时引发异常:

    我意识到异常中的others 非常顽皮,但它只会真正抓住我的桌子在它不应该消失的时候消失,而没有别的。

    v_record my_table%ROWTYPE;
    v_row_id my_table.row_id%TYPE := 123456;
    
    begin
        v_record := myfunction(v_row_id)
    exception when others then
            -- do something
    end;
    
    function myfunction(p_row_id in my_table.row_id%TYPE) return my_table%ROWTYPE is
        v_record_out my_table%ROWTYPE := null;
    
    cursor c_record_out(c_row_id char) is
     select * 
       from my_table
      where row_id = p_row_id;
    
    begin
       open c_record_out(p_row_id);
       fetch c_record_out into v_record_out;
    
       if c_record_out%NOTFOUND then
          raise_application_error(-20001,'no data);
       end if;
       close c_record_out;
    return v_record_out;
    end myfunction;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多