Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PL/SQL ORACLE中作为变量的列名_Oracle_Plsql - Fatal编程技术网

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

PL/SQL ORACLE中作为变量的列名,oracle,plsql,Oracle,Plsql,我希望有一个代码,其中我将声明一个列名为变量,然后使用此变量从某个表中检索所需的列 DECLARE col_n VARCHAR (100) := 'X' ; BEGIN select col_n from my_table; END; 在Oracle中,最简单和明确的方法是什么?您可以使用它来执行构造为字符串的查询。 它将沿着以下思路发展: DECLARE col_n VARCHAR (100) := 'X' ; plsql_block VARCHAR2(500); BEGIN pls

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

DECLARE
col_n VARCHAR (100) := 'X' ;
BEGIN
select col_n from my_table;
END;
在Oracle中,最简单和明确的方法是什么?

您可以使用它来执行构造为字符串的查询。 它将沿着以下思路发展:

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

您可以使用动态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

您必须使用动态sql/query来实现您要做的事情。使用
立即执行
,如下所示。概念取自

下面是SQL*Plus的示例

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

这样做是不可能的。您必须使用动态查询。您可以尝试执行如下所示的立即命令:@Zaratutra,因为没有“选择进入”,这是不正确的。抱歉,我没有看到这一点,但是如何才能在没有
进入
的情况下
选择
?@Zaratutra-执行选择,但不返回任何值。另一种方法是执行类似于
执行立即“选择”| col|n |“从my|u表”到某个_变量的操作
,或者
执行立即“选择”| col|n |“从my|u表”批量收集到某个_集合
。分享和享受。有趣的事实是,我认为如果没有
进入
条款,就不可能进行查询。我很确定您的意思是在我的表中选择
后和
前有一个单引号。
。您可以使用包DBMS\U SQL检索列类型,但是,您必须再编写几行代码。这将导致
从MY_TABLE
中选择“X”,但不选择列“X”。此外,如上所示的参数仅在SQL*Plus中有效,而问题标记为PL/SQL。
DECLARE col_n VARCHAR(100) := 'X';
DECLARE sql VARCHAR(100);
BEGIN
sql := 'select ' || col_n || ' from my_table;'
EXECUTE IMMEDIATE sql;
END;