Oracle ORA-00923:未在预期位置找到FROM关键字,AS子句中的参数

Oracle ORA-00923:未在预期位置找到FROM关键字,AS子句中的参数,oracle,column-alias,Oracle,Column Alias,上面的查询工作正常,但当我将列名更改为参数时。。。我收到一条“ORA-00923:FROM关键字未找到预期位置”错误消息 SELECT LMD0011M.CKEY1 AS CDNAME ,LMD0011M.CKEY1 || '\:' || LMD0011M.CDTA1 AS NMNAME FROM LMD0011M LMD0011M 即使我在OracleSQLDeveloper中运行查询,也

上面的查询工作正常,但当我将列名更改为参数时。。。我收到一条“ORA-00923:FROM关键字未找到预期位置”错误消息

SELECT
     LMD0011M.CKEY1                             AS CDNAME 
    ,LMD0011M.CKEY1 || '\:' || LMD0011M.CDTA1    AS NMNAME 
    FROM 
     LMD0011M LMD0011M

即使我在OracleSQLDeveloper中运行查询,也会出现错误。我正在使用Java Hibernate。如何解决这个问题?请提供帮助如果您描述了为什么要动态更改列别名,可能会有所帮助。就我个人而言,我不认为有任何正当的理由这样做,但是,嘿,如果你这样做,没有反对意见

在我看来,您需要的是PL/SQL和动态SQL。将所需的别名传递给过程,并返回refcursor,它反映了刚刚传递的内容。下面是一个例子:

SELECT
     LMD0011M.CKEY1                             AS :CDNAME 
    ,LMD0011M.CKEY1 || '\:' || LMD0011M.CDTA1    AS :NMNAME 
    FROM 
     LMD0011M LMD0011M

:CDNAME = CDNAME
:NMNAME = NMNAME
测试:

SQL> create or replace procedure p_test
  2    (alias_1 in varchar2, alias_2 in varchar2, par_rc out sys_refcursor)
  3  is
  4    l_str varchar2(1000);
  5  begin
  6    l_str := 'select ename as "' || dbms_assert.simple_sql_name(alias_1) ||'"'||
  7             ', job as "'        || dbms_assert.simple_sql_name(alias_2) ||'"'||
  8             ' from emp where deptno = 20';
  9    open par_rc for l_str;
 10  end;
 11  /

如果您描述了为什么要动态更改列别名,可能会有所帮助。就我个人而言,我不认为有任何正当的理由这样做,但是,嘿,如果你这样做,没有反对意见

在我看来,您需要的是PL/SQL和动态SQL。将所需的别名传递给过程,并返回refcursor,它反映了刚刚传递的内容。下面是一个例子:

SELECT
     LMD0011M.CKEY1                             AS :CDNAME 
    ,LMD0011M.CKEY1 || '\:' || LMD0011M.CDTA1    AS :NMNAME 
    FROM 
     LMD0011M LMD0011M

:CDNAME = CDNAME
:NMNAME = NMNAME
测试:

SQL> create or replace procedure p_test
  2    (alias_1 in varchar2, alias_2 in varchar2, par_rc out sys_refcursor)
  3  is
  4    l_str varchar2(1000);
  5  begin
  6    l_str := 'select ename as "' || dbms_assert.simple_sql_name(alias_1) ||'"'||
  7             ', job as "'        || dbms_assert.simple_sql_name(alias_2) ||'"'||
  8             ' from emp where deptno = 20';
  9    open par_rc for l_str;
 10  end;
 11  /

“AS”定义列标签,而不是变量。这应该是PL/SQL块吗?请包含更完整的代码示例。列名在查询中是固定的,不是可变的。如果这是关于在应用程序中显示列标题(例如,使用用户选择的语言),请让应用程序注意这一点。(当然,您也可以将这些文本存储在数据库中,并让应用程序检索它们,但这将是一个单独的查询。)“AS”定义列标签,而不是变量。这应该是PL/SQL块吗?请包含更完整的代码示例。列名在查询中是固定的,不是可变的。如果这是关于在应用程序中显示列标题(例如,使用用户选择的语言),请让应用程序注意这一点。(当然,你也可以将这些文本存储在数据库中,并让你的应用程序检索它们,但这将是一个单独的查询。)我会为别名添加双引号。否则,像
2021
My Column Name
这样的名称将导致语法错误。好主意,@Thorsten,谢谢。尽管如此,我仍然看不出有任何理由让任何人首先想要这样做,谁知道真正的要求是什么。哦,是的-DBMS_ASSERT无论如何都不允许使用您建议的别名,@Thorsten。我会为别名添加双引号。否则,像
2021
My Column Name
这样的名称将导致语法错误。好主意,@Thorsten,谢谢。尽管如此,我仍然看不出有任何理由一开始就想这么做,谁知道真正的要求是什么。哦,是的,DBMS_ASSERT无论如何都不允许使用你建议的别名,@Thorsten。