动态 ORACLE SQL - 如何将 varchar2 变量转换为用作 select 语句中的列名?

Dynamic ORACLE SQL - How to convert a varchar2 variable to use as a column name in a select statement?

我需要将 varchar2(30) 变量转换为在 select 语句中或在应该接收列名的 sql 函数中用作列名。

我该怎么做?

我正在尝试用动态 sql 做一些简单的事情,比如下面的代码,来解决这个 varchar2 转换的问题,但我无法得到预期的结果。它说“00900.00000 - "invalid SQL statement" 关于 query_string 中的 select 语句。

有人知道这里的错误在哪里吗?

 SET serveroutput ON;
 declare
 TYPE pointer IS REF CURSOR;
 yo pointer;
 var varchar2(20);
 query_string varchar2(200);
 num number;

 begin
 var := 'WORKERS'; --should be the column name!
 query_string := 'select'||var||'from MY_TABLE where MY_TABLE.ID = 2';
 OPEN yo FOR query_string;
 LOOP
 FETCH yo into num;
 EXIT WHEN yo%NOTFOUND;
 dbms_output.put_line(num);
 END LOOP;
 END ;
 /

query_string := 'select'||var||'from MY_TABLE where MY_TABLE.ID = 2';

您在 SQL 语句中的单词之间缺少所需的空格。您的 SQL 语句被解析为:

selectWORKERSfrom MY_TABLE where MY_TABLE.ID = 2

自测:

SQL> SET serveroutput ON
SQL>
SQL> DECLARE
  2    var varchar2(20);
  3    query_string VARCHAR2(200);
  4  BEGIN
  5    var          := 'WORKERS'; --should be the column name!
  6    query_string := 'select'||var||'from MY_TABLE where MY_TABLE.ID = 2';
  7    dbms_output.put_line(query_string);
  8  END ;
  9  /
selectWORKERSfrom MY_TABLE where MY_TABLE.ID = 2

PL/SQL procedure successfully completed.

SQL>

SELECT <--> WORKERS <--> FROM.

之间需要有空格

记住,在执行之前总是使用DBMS_OUTPUT来测试动态sql。

不管怎样,看下面的例子,

SQL> variable yo REFCURSOR
SQL> DECLARE
  2      TYPE pointer IS REF CURSOR;
  3      yo pointer;
  4      var          VARCHAR2(20);
  5      query_string VARCHAR2(200);
  6      num          NUMBER;
  7    BEGIN
  8      var          := 'ENAME'; --should be the column name!
  9      query_string := 'select '||var||' from EMP where EMPNO = 7369';
 10      OPEN :yo FOR query_string;
 11  END ;
 12  /

PL/SQL procedure successfully completed.

SQL> print yo

ENAME
----------
SMITH

SQL>