请问这个查询如何写?
我有二个表
create table sm_user
(
 name varchar2(100)
)
insert into sm_user(name) values('张三')
create table chinesename
(
tablename varchar2(50),
tablefield varchar2(50),
fieldchinese varchar2(50)
)
insert into chinesename (tablename,tablefield,fieldchinese) values('sm_user','name','名称')要求查sm_user数据出来的效果是
标题  name(名称)
值    张三
也就是让sm_user的英文字段名附加上在chinesename中定义的中文字段名

解决方案 »

  1.   

    用过程做先查chinesename表找出 名称
    然后拼成下面的sqlselect name as "name(名称)" from sm_user;
      

  2.   

    涉及到字段名和表名的动态变化,需要通过存储过程来实现
    我写个存储过程为例,自动生成视图,根据查询这个视图来得到想要的结果
    create or replace procedure proc(tabname in varchar2)
    as
    sqlstr varchar2(2000):='create or replace view v_test as select ';
    v_chname varchar2(20);
    v_enname varchar2(20);
    begin
      for cur1 in (select column_name from user_tab_cols where table_name=upper(tabname))
      loop
        select fieldchinese,tablefield into v_chname,v_enname from chinesename 
          where upper(tablename)=upper(tabname) and upper(tablefield)=cur1.column_name;
        sqlstr:=sqlstr||cur1.column_name||' "'||v_enname||'('||v_chname||')",';
      end loop;
    sqlstr:=rtrim(sqlstr,',')||' from '||tabname;
    execute immediate sqlstr;
    end proc;
    调用
    begin
    proc('sm_user');
    end;
    查询视图
    select * from v_test;name(名称)
    张三
    通过传入表名来生成视图,新生成的视图会覆盖掉原先的旧视图
    查询视图即可
    需要用户(不是角色)有create any view的权限
      

  3.   

    或者不用user_tab_cols也行
    create or replace procedure proc(tabname in varchar2)
    as
    sqlstr varchar2(2000):='create or replace view v_test as select ';
    begin
      for cur1 in (select fieldchinese,tablefield from chinesename where upper(tablename)=upper(tabname))
      loop
        sqlstr:=sqlstr||cur1.tablefield||' "'||cur1.tablefield||'('||cur1.fieldchinese||')",';
      end loop;
    sqlstr:=rtrim(sqlstr,',')||' from '||tabname;
    execute immediate sqlstr;
    end proc;
      

  4.   

    begin
    proc('sm_user');
    end;
    是报 insufficient privileges 
    没有权限?请问问什么?
      

  5.   

    用户没有建视图的权限。虽然你可以建视图,但那是角色的权限而不是用户本身的权限。你可以使用DBA用户登录,执行grant create any view to XX --XX用你的用户名代替
    如果不方便的话,将过程中的execute immediate sqlstr;
    改成dbms_output.put_line(sqlstr);
    然后从output结果中拷贝代码运行(直接拷贝select 部分,没必要建视图了)
      

  6.   

    请问
    identifier is too long
    is too small 
    如何 解决?有没有不限制大小的?