【问题标题】:Check if a column has a certain entry in a PL/SQL function检查列是否在 PL/SQL 函数中具有特定条目
【发布时间】:2011-02-09 11:48:00
【问题描述】:

我有一张有两列的表格。第二列是外键列。我想检查此列中是否有外键X 的记录。我在 Oracle 11g 上使用(相当学习)PL/SQL。

编辑:我可以将SQL SELECT* 一起使用,但是如何在PL/SQL 中使用它在函数中返回布尔值?

【问题讨论】:

    标签: sql plsql foreign-keys oracle11g


    【解决方案1】:
    FUNCTION my_func ()
    RETURN BOOLEAN
    IS
      l_contains_x NUMBER;
      l_contains_x_bool BOOLEAN := false;
    BEGIN
      SELECT 1
      INTO l_contains_x
      FROM dual
      WHERE EXISTS (
        SELECT 1
        FROM table
        WHERE col = X
      );
    
      IF l_contains_x = 1 THEN 
        l_contains_x_bool := TRUE;
      END IF;
    
      RETURN l_contains_x_bool;
    
    END;
    

    请注意,这里的关键是 INTO 关键字,它将值返回到变量中。这些是位置匹配的,因此您可以将 4 列选择为 4 个变量(或 * 选择为行类型)。 这需要 ONE 值,这就是我将检查移至存在的原因,因此您的外部 SELECT 仅选择一个值。

    请注意,SQL 没有 BOOLEAN 类型的概念,因此您的函数只能在 PL/SQL 上下文中使用。如果你想在 SQL 上下文中返回 true / false,你应该使用 VARCHAR2 'true' 和 'false'。

    【讨论】:

    • 谢谢!我一直在使用 Oracle 11g 的完整参考书,我觉得这不是学习 PL/SQL 的最佳方式。你能推荐一下如何去学习它吗?
    • 不客气。我记得我刚开始学习的时候没有太多好的材料。你应该看看 Steven Feuerstein 写的书,我觉得他的东西非常有用:stevenfeuerstein.com/books/…
    • 再次感谢!特别是。对于底部的解释。还有书推荐。
    • 这种处理布尔值是 11G 的新功能吗?我无法在我的 10G 数据库中选择 true(在 plsql 块内)。
    • @Rene:你是对的,如前所述,布尔值 TRUE 在 SQL 上下文中不可用。更新示例以显示替代方案。
    【解决方案2】:
    create or replace function hasFK(i_key in someTable.fk%type) return number as
      v_cnt pls_integer := 0;
    begin
      select count(1) 
      into v_cnt
      from someTable
      where fk = i_key
      and rownum = 1;
    
      return v_cnt;
    end;
    

    这将给出 1=true 和 0=false。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多