Oracle 如何识别空参数并处理它SQL Developer存储函数
基本上,我在DB上有一个存储函数,我在这里快速地重新创建了它,我所做的和需要做的是: p_METHOD参数是一个新参数,我之所以添加它,是因为我只希望显示特定于调用参数的数据行。例如,测试T1就是方法,我只想显示与T1相关联的结果,目前我们将所有结果放入一个字符串中,并输出所有方法,显然这是不正确的,我真的想按方法对其进行排序 我认为通过设置这个方法参数和执行where子句语句可以很容易地做到这一点,但显然我们也有null方法,其中结果与任何方法都没有关联,出于我的需要,我需要将它们作为一个完全独立的结果字符串输出。所以null是一个有效的方法 我想我需要使用case语句来实现这一点,但我也不太清楚,我根本无法向数据库中添加任何数据,只能添加一个存储的函数,因为它正在通过ireports运行,并根据结果输出报告 任何帮助都将不胜感激,请在下面查找一些示例代码: 新代码Oracle 如何识别空参数并处理它SQL Developer存储函数,oracle,stored-procedures,plsql,case,Oracle,Stored Procedures,Plsql,Case,基本上,我在DB上有一个存储函数,我在这里快速地重新创建了它,我所做的和需要做的是: p_METHOD参数是一个新参数,我之所以添加它,是因为我只希望显示特定于调用参数的数据行。例如,测试T1就是方法,我只想显示与T1相关联的结果,目前我们将所有结果放入一个字符串中,并输出所有方法,显然这是不正确的,我真的想按方法对其进行排序 我认为通过设置这个方法参数和执行where子句语句可以很容易地做到这一点,但显然我们也有null方法,其中结果与任何方法都没有关联,出于我的需要,我需要将它们作为一个完全
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,你可以考虑接受这个答案,如果它对你有帮助的话。