列名作为 PL/SQL ORACLE 中的变量

Posted

技术标签:

【中文标题】列名作为 PL/SQL ORACLE 中的变量【英文标题】:Column name as variable in PL/SQL ORACLE 【发布时间】:2014-08-07 12:42:25 【问题描述】:

我想要一个代码,我将在其中将列名声明为变量,然后使用此变量从某个表中检索所需的列。

DECLARE
col_n VARCHAR (100) := 'X' ;
BEGIN
select col_n from my_table;
END;

Oracle 中最简单、最明确的方法是什么?

【问题讨论】:

这种方式是不可能的。您将不得不使用动态查询。 您可以尝试立即执行,如下所示:***.com/questions/4714163/… 【参考方案1】:

您可以使用dynamic sql 来执行您构造为字符串的查询。 它会沿着这些方向发展:

DECLARE
col_n VARCHAR (100) := 'X' ;
plsql_block VARCHAR2(500);
BEGIN
    plsql_block := 'select ' || col_n  || ' from my_table';
    EXECUTE IMMEDIATE plsql_block;
END;

【讨论】:

@zaratustra 因为没有“选择进入”,这是不正确的。 对不起,我没看到,但是没有into,怎么可能select @zaratustra - SELECT 已执行,但没有返回任何值。另一种方法是执行EXECUTE IMMEDIATE 'select ' || col_n || ' from my_table' INTO SOME_VARIABLEEXECUTE IMMEDIATE 'select ' || col_n || ' from my_table' BULK COLLECT INTO SOME_COLLECTION 之类的操作。分享和享受。 有趣的事实,我虽然没有into 子句就无法查询【参考方案2】:

可以使用动态sql:

DECLARE
  col_n VARCHAR (100) := 'X' ;
  l_cursor sys_refcursor;
  l_temp number(10); -- won't work if the col_n column has different type
BEGIN
  open l_cursor for 'select '|| col_n ||' from my_table';
  loop
    fetch l_cursor into l_temp;
    exit when l_cursor%NOTFOUND;
    ...
  end loop;
END;

问题是你必须确定你的专栏的类型。

其实还有一种方法可以做到,如果你使用 SQL*Plus 环境的话:

SQL> select &&col_n from employees where &&col_n = 199;
Enter value for col_n: employee_id
old   1: select &&col_n from employees where &&col_n = 199
new   1: select employee_id from employees where employee_id = 199

EMPLOYEE_ID
-----------
        199

【讨论】:

我很确定你的意思是在 'select from my_table' 之前有一个单引号。 您可以使用包 DBMS_SQL 检索列类型,但是您必须多写几行代码。【参考方案3】:

您将不得不使用动态 sql/query 来实现您想要做的事情。使用EXECUTE IMMEDIATE 如下所示。概念取自Here。

DECLARE col_n VARCHAR(100) := 'X';
DECLARE sql VARCHAR(100);
BEGIN
sql := 'select :p1 from my_table;'
EXECUTE IMMEDIATE sql USING col_n;
END;

SQL *Plus 如下所示

DECLARE col_n VARCHAR(100) := 'X';
DECLARE sql VARCHAR(100);
BEGIN
sql := 'select ' || col_n || ' from my_table;'
EXECUTE IMMEDIATE sql;
END;

【讨论】:

这将导致SELECT 'X' FROM MY_TABLE,但不会选择列“X” 另外,如上所示参数的使用仅在SQL*Plus中有效,而问题标记为PL/SQL。

以上是关于列名作为 PL/SQL ORACLE 中的变量的主要内容,如果未能解决你的问题,请参考以下文章

Oracle PL/SQL - 循环值作为没有动态 SQL 的动态列名

PL/SQL oracle 中的标量变量和复合变量

PL_sql如何执行oracle存储过程

Oracle PL/SQL 中的 for 循环后变量丢失值

从 oracle PL/SQL 查看变量的值

将表中的单个值分配给 ORACLE PL/SQL 中声明的变量时出错