【问题标题】:Dynamic ORACLE SQL - How to convert a varchar2 variable to use as a column name in a select statement?动态 ORACLE SQL - 如何将 varchar2 变量转换为 select 语句中的列名?
【发布时间】:2015-03-11 09:38:55
【问题描述】:

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

我该怎么做?

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

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

 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 ;
 /

【问题讨论】:

  • 停止做你正在做的事情,选择一本关于关系数据库的书,学习如何做关系数据库,然后重新设计你的数据库,这样你就不需要做任何事情了。
  • 什么语言? PL/SQL?检查这个:docs.oracle.com/cd/B10500_01/appdev.920/a96590/adg09dyn.htm
  • SQL 语句中的单词之间需要有空格。看我的回答。

标签: oracle variables varchar


【解决方案1】:

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 之间需要有空格。

请记住,在执行动态 sql 之前,请始终使用 DBMS_OUTPUT 对其进行测试。

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

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>

【讨论】:

  • 我以为问题已经解决,但出现了一个新的相关问题。上面的代码仅适用于代表“数字”类型列的列名。对于代表 Varchar 类型的列的列名,它给了我一个错误,例如:错误报告:ORA-01722: número inválido ORA-06512: na linha 12 01722. 00000 - "invalid number" *Cause: *Action:
猜你喜欢
  • 2016-09-10
  • 2021-02-28
  • 1970-01-01
  • 1970-01-01
  • 2012-10-03
  • 1970-01-01
  • 1970-01-01
  • 2017-09-26
  • 2017-03-29
相关资源
最近更新 更多