Oracle 如何识别空参数并处理它SQL Developer存储函数

Oracle 如何识别空参数并处理它SQL Developer存储函数,oracle,stored-procedures,plsql,case,Oracle,Stored Procedures,Plsql,Case,基本上,我在DB上有一个存储函数,我在这里快速地重新创建了它,我所做的和需要做的是: p_METHOD参数是一个新参数,我之所以添加它,是因为我只希望显示特定于调用参数的数据行。例如,测试T1就是方法,我只想显示与T1相关联的结果,目前我们将所有结果放入一个字符串中,并输出所有方法,显然这是不正确的,我真的想按方法对其进行排序 我认为通过设置这个方法参数和执行where子句语句可以很容易地做到这一点,但显然我们也有null方法,其中结果与任何方法都没有关联,出于我的需要,我需要将它们作为一个完全

基本上,我在DB上有一个存储函数,我在这里快速地重新创建了它,我所做的和需要做的是:

p_METHOD参数是一个新参数,我之所以添加它,是因为我只希望显示特定于调用参数的数据行。例如,测试T1就是方法,我只想显示与T1相关联的结果,目前我们将所有结果放入一个字符串中,并输出所有方法,显然这是不正确的,我真的想按方法对其进行排序

我认为通过设置这个方法参数和执行where子句语句可以很容易地做到这一点,但显然我们也有null方法,其中结果与任何方法都没有关联,出于我的需要,我需要将它们作为一个完全独立的结果字符串输出。所以null是一个有效的方法

我想我需要使用case语句来实现这一点,但我也不太清楚,我根本无法向数据库中添加任何数据,只能添加一个存储的函数,因为它正在通过ireports运行,并根据结果输出报告

任何帮助都将不胜感激,请在下面查找一些示例代码:

新代码

CREATE OR REPLACE FUNCTION GETRESULTS(p_sampleid VARCHAR2, p_fam NUMBER, p_method VARCHAR2) RETURN VARCHAR2
IS
  CURSOR res_cursor IS
    SELECT
      res.result,
      tests.libelle
    FROM results res
      INNER JOIN tests
        ON res.code = tests.code
           AND tests.fam = p_fam
    WHERE res.sampleid = p_sampleid
          AND res.result NOT LIKE '%#%'
          AND CASE p_method
              WHEN IS NULL THEN (res.methodid IS NULL)
              WHEN IS NOT NULL THEN (res.methodid = (SELECT methodid FROM TEST_METHOD WHERE lib_method = P_METHOD))
    ORDER BY tests.code;

  singleres VARCHAR2(100);
  rescode   VARCHAR2(100);
  resultstr VARCHAR2(2000);
  sep       VARCHAR(3);
  BEGIN
    sep := '';

    OPEN res_cursor;
    FETCH res_cursor INTO singleres, rescode;

    WHILE res_cursor%FOUND
    LOOP
      resultstr := resultstr || sep || singleres;
      sep := '; ';
      FETCH res_cursor INTO singleres, rescode;
    END LOOP;

    CLOSE res_cursor;

    RETURN (resultstr);
  END getresults;
当前代码:

CREATE OR REPLACE FUNCTION getresults(p_sampleid VARCHAR2, p_fam NUMBER) RETURN VARCHAR2
IS
  CURSOR res_cursor
  IS
    SELECT
      res.result,
      tests.libelle
    FROM results res
      INNER JOIN tests ON res.code = tests.code
                          AND tests.fam = p_fam
    WHERE res.sampleid = p_sampleid
          AND res.result NOT LIKE '%#%'
    ORDER BY tests.code;
  singleres VARCHAR2(100);
  rescode   VARCHAR2(100);
  resultstr VARCHAR2(2000);
  sep       VARCHAR(3);

  BEGIN
    sep := '';

    OPEN res_cursor;
    FETCH res_cursor INTO singleres, rescode;

    WHILE res_cursor%FOUND
    LOOP
      resultstr := resultstr || sep || singleres;
      sep := '; ';
      FETCH res_cursor INTO singleres, rescode;
    END LOOP;

    CLOSE res_cursor;

    RETURN (resultstr);
  END getresults;

你可以用这个,记住它会毁了你的执行计划

  WHERE res.sampleid = P_SAMPLEID AND res.result NOT LIKE '%#%'
    AND ((P_METHOD IS NULL AND res.methodid is null)   
        OR (P_METHOD IS NOT NULL AND res.methodid = (SELECT methodid FROM TEST_METHOD WHERE lib_method = P_METHOD)))

谢谢Sathya不确定是哪个标签!非常感谢您的回复,我将尝试一下,但从逻辑上看,它看起来很合理,而且看在上帝的份上,它简单多了,(为什么我会如此愚蠢以至于错过了这个?)非常感谢,我知道它会很好地工作@你好,Brad,你可以考虑接受这个答案,如果它对你有帮助的话。