Oracle ORA-00923:未在预期位置找到FROM关键字,AS子句中的参数
上面的查询工作正常,但当我将列名更改为参数时。。。我收到一条“ORA-00923:FROM关键字未找到预期位置”错误消息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中运行查询,也
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。