请问这个中文字段名翻译查询如何写?

时间:2022-11-02 07:50:11
请问这个查询如何写?
我有二个表
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中定义的中文字段名

8 个解决方案

#1


用过程做

先查chinesename表找出 名称
然后拼成下面的sql

select 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


引用 4 楼 hongqishi 的回复:
begin
proc('sm_user');
end;
是报 insufficient privileges
没有权限?请问问什么?

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

#6


太帅了,谢谢,搞定了.

#7


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

#8


名称太长,超过30个字符?
改到30个字符以内

#1


用过程做

先查chinesename表找出 名称
然后拼成下面的sql

select 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


引用 4 楼 hongqishi 的回复:
begin
proc('sm_user');
end;
是报 insufficient privileges
没有权限?请问问什么?

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

#6


太帅了,谢谢,搞定了.

#7


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

#8


名称太长,超过30个字符?
改到30个字符以内