我有二个表
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;
先查chinesename表找出 名称
然后拼成下面的sql
select name as "name(名称)" from sm_user;
#2
涉及到字段名和表名的动态变化,需要通过存储过程来实现
我写个存储过程为例,自动生成视图,根据查询这个视图来得到想要的结果
调用
查询视图
通过传入表名来生成视图,新生成的视图会覆盖掉原先的旧视图
查询视图即可
需要用户(不是角色)有create any view的权限
我写个存储过程为例,自动生成视图,根据查询这个视图来得到想要的结果
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
没有权限?请问问什么?
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
太帅了,谢谢,搞定了.
#7
请问
identifier is too long
is too small
如何 解决?有没有不限制大小的?
identifier is too long
is too small
如何 解决?有没有不限制大小的?
#8
名称太长,超过30个字符?
改到30个字符以内
改到30个字符以内
#1
用过程做
先查chinesename表找出 名称
然后拼成下面的sql
select name as "name(名称)" from sm_user;
先查chinesename表找出 名称
然后拼成下面的sql
select name as "name(名称)" from sm_user;
#2
涉及到字段名和表名的动态变化,需要通过存储过程来实现
我写个存储过程为例,自动生成视图,根据查询这个视图来得到想要的结果
调用
查询视图
通过传入表名来生成视图,新生成的视图会覆盖掉原先的旧视图
查询视图即可
需要用户(不是角色)有create any view的权限
我写个存储过程为例,自动生成视图,根据查询这个视图来得到想要的结果
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
没有权限?请问问什么?
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
太帅了,谢谢,搞定了.
#7
请问
identifier is too long
is too small
如何 解决?有没有不限制大小的?
identifier is too long
is too small
如何 解决?有没有不限制大小的?
#8
名称太长,超过30个字符?
改到30个字符以内
改到30个字符以内