我需要将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 ;
/
答案 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>