在PL / SQL中引用列标题

时间:2016-08-24 13:48:21

标签: oracle plsql

我正在寻找特定请求的提示。

首先,我正在研究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,它不检索值,而只检索字符串本身。

我知道还有其他一些方法可以获得我的结果,但我想尝试一些比我通常的残酷石头年龄代码更“优雅”的东西。

感谢您的帮助。 马塞罗

1 个答案:

答案 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的许多潜在值。并且你需要注意检查时传入的值的情况。