ls的是获得指定表名中所有列举个例子,假如有个sql如下 select a.DUMMY, b.DUMMY from dual a, dual b; 如何知道 第一列所在的表名(A)和第二列所在的表名(B)?
select a.DUMMY, b.DUMMY,table_name,column_name from dual a, dual b,user_tab_cols;
select table_name from user_tab_cols where column_name='DUMMY'
需求就是运行程序,由用户输入一个sql,程序需要连接到指定的数据库判断合法是否能正常执行,并分析此sql 返回如下 sql列名 所在表 列名1 表名1 列名2 表名2 ... ...举例,用户输入select a.DUMMY cola, b.DUMMY colb from dual a, dual b; 程序需要返回 sql列名 所在表 cola a colb b
判断合法非常简单,执行一下就可以。create or replace function is_valid_sql (p_sql varchar2) return varchar2 is w_sql varchar2(32000); w_ret varchar2(10); begin w_sql := 'select 1 from dual where exists ('||p_sql||')'; execute immediate w_sql into w_ret; return 'valid'; exception when others then return 'invalid'; end; /但是返回列和列所属的表在一般意义上是无法完成的。oracle select列表中不光是单纯的列名,还可以是别名、伪列、表达式、函数,比如 select dummy as col_alias from dual; select rownum, rownum + 1 from dual; select sum(col1) from table1; from列后面也不光是表名,可以是任何合法的子查询,并可能是内存表,合并表(union, union all),比如 select col1 from (select col1 from table1); select col1 from table1 union all select col2 from table2; select column_name from table (get_ids('1,2,3')); 等等。如果你规定用户输入的sql只能是基本的列、表,不允许使用别名、伪列、表达式、函数等等,那还有一定的可能性。但那基本是对sql字符串进行分析,而不是oracle内部查询的问题了。
select table_name,column_name from user_tab_cols
select a.DUMMY, b.DUMMY from dual a, dual b;
如何知道
第一列所在的表名(A)和第二列所在的表名(B)?
返回如下
sql列名 所在表
列名1 表名1
列名2 表名2
... ...举例,用户输入select a.DUMMY cola, b.DUMMY colb from dual a, dual b;
程序需要返回
sql列名 所在表
cola a
colb b
return varchar2 is
w_sql varchar2(32000);
w_ret varchar2(10);
begin
w_sql := 'select 1 from dual where exists ('||p_sql||')';
execute immediate w_sql into w_ret;
return 'valid';
exception when others then
return 'invalid';
end;
/但是返回列和列所属的表在一般意义上是无法完成的。oracle select列表中不光是单纯的列名,还可以是别名、伪列、表达式、函数,比如
select dummy as col_alias from dual;
select rownum, rownum + 1 from dual;
select sum(col1) from table1;
from列后面也不光是表名,可以是任何合法的子查询,并可能是内存表,合并表(union, union all),比如
select col1 from (select col1 from table1);
select col1 from table1 union all select col2 from table2;
select column_name from table (get_ids('1,2,3'));
等等。如果你规定用户输入的sql只能是基本的列、表,不允许使用别名、伪列、表达式、函数等等,那还有一定的可能性。但那基本是对sql字符串进行分析,而不是oracle内部查询的问题了。