问题描述
SELECT
LMD0011M.CKEY1 AS CDNAME,LMD0011M.CKEY1 || '\:' || LMD0011M.CDTA1 AS NMNAME
FROM
LMD0011M LMD0011M
上述查询工作正常,但是当我将列名更改为参数时...我收到“ORA-00923:未在预期位置找到 FROM 关键字”错误消息。
SELECT
LMD0011M.CKEY1 AS :CDNAME,LMD0011M.CKEY1 || '\:' || LMD0011M.CDTA1 AS :NMNAME
FROM
LMD0011M LMD0011M
:CDNAME = CDNAME
:NMNAME = NMNAME
即使我在 Oracle sql Developer 中运行查询,我也会收到错误消息。我正在使用 Java 休眠。如何解决这个问题呢?请帮助
解决方法
如果您描述了为什么要动态更改列别名,这可能会有所帮助。就我个人而言,我认为没有任何正当理由可以这样做,但是嘿 - 如果你这样做了,没有反对意见。
在我看来,您需要的是 PL/SQL 和动态 SQL。将所需的别名传递给该过程并返回 反映 您刚刚传递的内容的 refcursor。举个例子:
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 /
测试:
SQL> var rc refcursor
SQL> exec p_test('liTTle','f00t',:rc);
PL/SQL procedure successfully completed.
SQL> print :rc
liTTle f00t
---------- ---------
SMITH CLERK
JONES MANAGER
SCOTT ANALYST
ADAMS CLERK
FORD ANALYST
SQL>
SQL> exec p_test('brian','antiquena',:rc);
PL/SQL procedure successfully completed.
SQL> print :rc
BRIAN ANTIQUENA
---------- ---------
SMITH CLERK
JONES MANAGER
SCOTT ANALYST
ADAMS CLERK
FORD ANALYST
SQL>