我正在寻找特定请求的提示。
首先,我正在研究Oracle11gDB上的PL / SQL,我正在做一些功能和程序。
其中一个函数有一个SELECT语句。我想多次使用此函数,从同一个表中检索不同的值。基本上我需要根据我想要的数据更改SELECT语句中的列。
因为它是一个函数,我想知道是否有办法将变量传递给这个函数,以便在SELECT中使用它。
在我看来它就像一个“column_header_type”变量......但我怀疑它是否存在。
无论如何,这是我的功能的一个例子:
FUNCTION XXX
(
a IN VARCHAR2,
b IN VARCHAR2,
field IN VARCHAR2
)RETURN VARCHAR2 is
l_var VARCHAR2(200);
BEGIN
SELECT field
INTO l_var
FROM TABLE01
WHERE COD_A = a
AND COD_B = b;
RETURN l_var;
END XXX;
参数“field”不能是VARCHAR2,它不检索值,而只检索字符串本身。
我知道还有其他一些方法可以获得我的结果,但我想尝试一些比我通常的残酷石头年龄代码更“优雅”的东西。
感谢您的帮助。 马塞罗
答案 0 :(得分:0)
您可以使用动态SQL:
FUNCTION XXX
(
a IN VARCHAR2,
b IN VARCHAR2,
field IN VARCHAR2
) RETURN VARCHAR2 is
l_var VARCHAR2(200);
BEGIN
EXECUTE IMMEDIATE 'SELECT ' || field ||
' FROM TABLE01' ||
' WHERE COD_A = :a' ||
' AND COD_B = :b'
INTO l_var USING a, b;
RETURN l_var;
END XXX;
...这意味着在运行时,当列名称已知时,查询将不会被解析;通过对过滤器列值使用绑定变量,可以略微减轻开销。您应该真正清理field
值并处理传入的任何意外情况。
或者拥有不同版本的查询,并根据传递的字符串决定使用哪个版本:
FUNCTION XXX
(
a IN VARCHAR2,
b IN VARCHAR2,
field IN VARCHAR2
) RETURN VARCHAR2 is
l_var VARCHAR2(200);
BEGIN
CASE field
WHEN 'column1' THEN
SELECT column1
INTO l_var
FROM TABLE01
WHERE COD_A = a
AND COD_B = b;
WHEN 'column2' THEN
SELECT column2
INTO l_var
FROM TABLE01
WHERE COD_A = a
AND COD_B = b;
...
END CASE;
RETURN l_var;
END XXX;
...允许在编译时解析和验证代码,但是引入了重复并且可能更难维护,特别是对于field
的许多潜在值。并且你需要注意检查时传入的值的情况。