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

时间:2015-03-11 09:38:55

标签: oracle variables varchar

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

我该怎么做?

我试图用动态sql做一些简单的事情,如下面的代码,解决varchar2转换的这个问题,但我不能得到预期的结果。它说" 00900。 00000 - "无效的SQL语句"关于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 ;
 /

1 个答案:

答案 0 :(得分:1)

  

query_string:='从MY_TABLE中选择' || var ||'其中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>