动态 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>
我需要将 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>