test表是从其他数据库过来的insert into tablexxx (column1,column2,column3) from select t.column1,t.column2,t.column3 from test基于上面的插入语句的需求,想获取column1,column2,column3的位置,因为tablexxx的表字段和select过来的表字段顺序不同。
SQL> desc emp; Name Type Nullable Default Comments -------- ------------ -------- ------- -------- EMPNO NUMBER(4) ENAME VARCHAR2(10) Y JOB VARCHAR2(9) Y MGR NUMBER(4) Y HIREDATE DATE Y SAL NUMBER(7,2) Y COMM NUMBER(7,2) Y DEPTNO NUMBER(2) Y
--构造一个表,和emp表的部分字段相同,但是顺序不同 SQL> create table t_emp as 2 select ename,empno,deptno,sal 3 from emp 4 where 1=0 5 /
Table created --添加数据 SQL> insert into t_emp(ename,empno,deptno,sal) 2 select ename,empno,deptno,sal 3 from emp 4 where sal >= 2500 5 /
5 rows inserted
SQL> select * from t_emp;
ENAME EMPNO DEPTNO SAL ---------- ----- ------ --------- JONES 7566 20 2975.00 BLAKE 7698 30 2850.00 SCOTT 7788 20 3100.00 KING 7839 10 5000.00 FORD 7902 20 3000.00
SQL> select * from emp;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO ----- ---------- --------- ----- ----------- --------- --------- ------ 7369 SMITH CLERK 7902 1980-12-17 800.00 20 7499 ALLEN SALESMAN 7698 1981-02-20 1600.00 300.00 30 7521 WARD SALESMAN 7698 1981-02-22 1250.00 500.00 30 7566 JONES MANAGER 7839 1981-04-02 2975.00 20 7654 MARTIN SALESMAN 7698 1981-09-28 1250.00 1400.00 30 7698 BLAKE MANAGER 7839 1981-05-01 2850.00 30 7782 CLARK MANAGER 7839 1981-06-09 2450.00 10 7788 SCOTT ANALYST 7566 1987-04-19 3100.00 20 7839 KING PRESIDENT 1981-11-17 5000.00 10 7844 TURNER SALESMAN 7698 1981-09-08 1500.00 0.00 30 7876 ADAMS CLERK 7788 1987-05-23 1100.00 20 7900 JAMES CLERK 7698 1981-12-03 950.00 30 7902 FORD ANALYST 7566 1981-12-03 3000.00 20 7934 MILLER CLERK 7782 1982-01-23 1300.00 10
14 rows selected
你的tablexxx 与test表字段名称一致?
哈哈,原来有 desc table这样的写法~~~
是和test表字段是一样的,可是test查询字段的顺序可能不同好像tablexxx ,表字段顺序是 column1,column2,column3 可是select过来的字段可能是这样子 select t.column2,t.column1,t.column3 from testso,用insert into tablexxx 要指定插入的字段,我想把这些都是程序自动去做,不是认为去做
可是select过来的字段可能是这样子 select t.column2,t.column1,t.column3 from test如果能确定这个sql的格式没有大的变化 你可以截取啊 把select和from中间的部分取出来 再把表名.列名中.前边的去掉 列名就出来了
select '' column1, '' column2, '' column3 from dual
desc cat; /*或者:*/ desc tab;TNAME是表名。
select s.COLUMN_NAME from user_tab_columns s where s.TABLE_NAME='TEST1'这个sql的意思是说查询这个表的字段名称,那么我想在查询的sql中获取字段名称好像select t.column2,t.column1,t.column3 from test这个查询语句,我想获取column2,column1,column3的字段名称,不通过对象查询(因为我这个查询语句可以是多表查询)。
如果知道表名,可以重系统字典表中查找列名,然后动态拼接SQL,如:SELECT t.COLUMN_NAME FROM user_tab_columns t WHERE t.TABLE_NAME = 'TEST';PS:不要砭低别人,多从自己身上找原因。
ORACLE数据字典那来你的表结构定义?
SQL> desc emp;
Name Type Nullable Default Comments
-------- ------------ -------- ------- --------
EMPNO NUMBER(4)
ENAME VARCHAR2(10) Y
JOB VARCHAR2(9) Y
MGR NUMBER(4) Y
HIREDATE DATE Y
SAL NUMBER(7,2) Y
COMM NUMBER(7,2) Y
DEPTNO NUMBER(2) Y
--构造一个表,和emp表的部分字段相同,但是顺序不同
SQL> create table t_emp as
2 select ename,empno,deptno,sal
3 from emp
4 where 1=0
5 /
Table created
--添加数据
SQL> insert into t_emp(ename,empno,deptno,sal)
2 select ename,empno,deptno,sal
3 from emp
4 where sal >= 2500
5 /
5 rows inserted
SQL> select * from t_emp;
ENAME EMPNO DEPTNO SAL
---------- ----- ------ ---------
JONES 7566 20 2975.00
BLAKE 7698 30 2850.00
SCOTT 7788 20 3100.00
KING 7839 10 5000.00
FORD 7902 20 3000.00
SQL> select * from emp;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
----- ---------- --------- ----- ----------- --------- --------- ------
7369 SMITH CLERK 7902 1980-12-17 800.00 20
7499 ALLEN SALESMAN 7698 1981-02-20 1600.00 300.00 30
7521 WARD SALESMAN 7698 1981-02-22 1250.00 500.00 30
7566 JONES MANAGER 7839 1981-04-02 2975.00 20
7654 MARTIN SALESMAN 7698 1981-09-28 1250.00 1400.00 30
7698 BLAKE MANAGER 7839 1981-05-01 2850.00 30
7782 CLARK MANAGER 7839 1981-06-09 2450.00 10
7788 SCOTT ANALYST 7566 1987-04-19 3100.00 20
7839 KING PRESIDENT 1981-11-17 5000.00 10
7844 TURNER SALESMAN 7698 1981-09-08 1500.00 0.00 30
7876 ADAMS CLERK 7788 1987-05-23 1100.00 20
7900 JAMES CLERK 7698 1981-12-03 950.00 30
7902 FORD ANALYST 7566 1981-12-03 3000.00 20
7934 MILLER CLERK 7782 1982-01-23 1300.00 10
14 rows selected
column1,column2,column3
可是select过来的字段可能是这样子
select t.column2,t.column1,t.column3 from testso,用insert into tablexxx 要指定插入的字段,我想把这些都是程序自动去做,不是认为去做
select t.column2,t.column1,t.column3 from test如果能确定这个sql的格式没有大的变化 你可以截取啊 把select和from中间的部分取出来 再把表名.列名中.前边的去掉 列名就出来了
/*或者:*/
desc tab;TNAME是表名。
效果不是通过表名来获取这些字段名,是通过查询SQL获取字段名称
PS:不要砭低别人,多从自己身上找原因。不好意思,话说得有点锋
SQL>
SQL> DECLARE
2 v_sql VARCHAR2(2000);
3 v_col VARCHAR2(2000);
4 BEGIN
5 v_sql := 'select col1,col2,col3 from test';
6 v_sql := trim(v_sql);
7 v_col := regexp_replace(regexp_replace(regexp_substr(
8 'select col1,col2,col3 from test','^select.+from',1,1,'i')
9 ,'select','',1,1,'i'),'from','',1,1,'i');
10 dbms_output.put_line(v_col);
11 END;
12 /
col1,col2,col3
PL/SQL procedure successfully completed