100分!在线等,关于不知字段个数从游标中取值的问题! 定义一个游标: CURSOR ABC IS SELECT A.* FROM A 现在不知道 表A 中有多少字段,请问如何操作能把游标中每一行中每个字段的值以逗号为隔点赋值到一个字符串变量 STRROWVALUE中呢? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 你直接从A里面区是取不出来的,oracle把你的列名都存在User_Tab_Columns这个table里面,你可以通过table_name去取。Select * From User_Tab_Columns Where table_name='A' 无所谓的,先从User_Tab_Columns 里面count一把,然后循环一下就行了,多少个字段写法都一样 我怎么不太明白呢,那字段里面的值怎么取呢?User_Tab_Columns 好像只能知道字段名啊! 先从USER_TAB_COLUMNS中取出列SELECT * FROM USER_TAB_COLUMNS WHERE TABLE_NAME = 'A';然后通过循环将字段组合到一起SELECT COL_1|| ',' || COL_2|| ',' || COL_3 ... AA FROM A; 给个范例给你(以EMP表为例):DECLARE strColumns varchar2(1000); strCol varchar2(20); v_sql varchar2(2000); strMergerVals varchar2(2000); tblName varchar2(50); TYPE refCursor IS REF CURSOR; curFields refCursor; curValues refCursor; BEGIN tblName := 'EMP'; v_sql := 'select COLUMN_NAME from USER_TAB_COLUMNS where TABLE_NAME = :tblName'; strColumns := '#'; OPEN curFields FOR v_sql USING tblName; LOOP FETCH curFields INTO strCol; EXIT WHEN curFields%NOTFOUND; strColumns := strColumns || 'TO_CHAR(' || strCol || ') || '; END LOOP; IF (strColumns <> '#') THEN strColumns := SUBSTR(strColumns, 2, LENGTH(strColumns) - 4); END IF; CLOSE curFields; DBMS_OUTPUT.PUT_LINE(strColumns); v_sql := 'select ' || strColumns || ' as MergeCols FROM ' || tblName; DBMS_OUTPUT.PUT_LINE(v_sql); DBMS_OUTPUT.PUT_LINE('=============================================='); OPEN curValues FOR v_sql; LOOP FETCH curValues INTO strMergerVals; EXIT WHEN curValues%NOTFOUND; DBMS_OUTPUT.PUT_LINE(strMergerVals); END LOOP; CLOSE curValues;END;/ 下面的加了一点异常处理DECLARE strColumns varchar2(1000); strCol varchar2(20); v_sql varchar2(2000); strMergerVals varchar2(2000); tblName varchar2(50); TYPE refCursor IS REF CURSOR; curFields refCursor; curValues refCursor; BEGIN tblName := 'emp'; v_sql := 'select COLUMN_NAME from USER_TAB_COLUMNS where TABLE_NAME = :tblName'; strColumns := '#'; OPEN curFields FOR v_sql USING tblName; LOOP FETCH curFields INTO strCol; EXIT WHEN curFields%NOTFOUND; strColumns := strColumns || 'TO_CHAR(' || strCol || ') || '; END LOOP; IF (strColumns <> '#') THEN strColumns := SUBSTR(strColumns, 2, LENGTH(strColumns) - 4); /*新加的,找不到指定表时的处理*/ ELSE DBMS_OUTPUT.PUT_LINE('指定表名' || tblName || '错误!'); RETURN; /**************************/ END IF; CLOSE curFields; DBMS_OUTPUT.PUT_LINE(strColumns); v_sql := 'select ' || strColumns || ' as MergeCols FROM ' || tblName; DBMS_OUTPUT.PUT_LINE(v_sql); DBMS_OUTPUT.PUT_LINE('=============================================='); OPEN curValues FOR v_sql; LOOP FETCH curValues INTO strMergerVals; EXIT WHEN curValues%NOTFOUND; DBMS_OUTPUT.PUT_LINE(strMergerVals); END LOOP; CLOSE curValues;END;/ 中间迦逗号的话把:strColumns := strColumns || 'TO_CHAR(' || strCol || ') || ';改成:strColumns := strColumns || 'TO_CHAR(' || strCol || ') || '','' || ';就可以了 你可能没有明白我的意思,我是要把表里面每个字段的值相连!比如 CLASS NAME AGE ... 01 ZHANG 19效果是 连成一个字符串"01,ZHANG,19",但是现在因为有很多个表都要这个操作,所以不能确定表的字段! 那你运行我写的PL/SQL没有呢?从EMP表中挑出来的值不是连在一起了吗? 仔细看看v_sql变量的用法你就会明白,把条件放在v_sql中 刚才在网上找到了一篇相关的文章,也不错,大家一起学习吧!http://yangtingkun.itpub.net/post/468/205331 V_BUFFER := REPLACE(V_BUFFER, '"', '""'); 加上一句就好了! 虛擬字段 一個繁體轉簡體的問題 !!!!高分求解ORACLE函数问题!!!!来着有 分 Oracle 10g客户端 Exp备份出来的dmp文件丢失数据问题 oracle查询时间相减问题,谢谢! sql语句改错 请教一个SQL(查找在多张表中的,更新一个表的字段) 打开服务管理面板,为何服务启动不了?!! 请问如何将含有clob字段的表导出或者打包? 在线等,请问那里有中文版的report教材,谢谢 建立临时表用来更新数据--怎么理解 exp导出数据的小问题
Select * From User_Tab_Columns Where table_name='A'
然后通过循环将字段组合到一起
SELECT COL_1|| ',' || COL_2|| ',' || COL_3 ... AA FROM A;
strColumns varchar2(1000);
strCol varchar2(20);
v_sql varchar2(2000);
strMergerVals varchar2(2000);
tblName varchar2(50);
TYPE refCursor IS REF CURSOR;
curFields refCursor;
curValues refCursor;
BEGIN
tblName := 'EMP';
v_sql := 'select COLUMN_NAME from USER_TAB_COLUMNS where TABLE_NAME = :tblName';
strColumns := '#'; OPEN curFields FOR v_sql USING tblName; LOOP
FETCH curFields INTO strCol;
EXIT WHEN curFields%NOTFOUND;
strColumns := strColumns || 'TO_CHAR(' || strCol || ') || ';
END LOOP; IF (strColumns <> '#') THEN
strColumns := SUBSTR(strColumns, 2, LENGTH(strColumns) - 4);
END IF; CLOSE curFields; DBMS_OUTPUT.PUT_LINE(strColumns);
v_sql := 'select ' || strColumns || ' as MergeCols FROM ' || tblName;
DBMS_OUTPUT.PUT_LINE(v_sql);
DBMS_OUTPUT.PUT_LINE('==============================================');
OPEN curValues FOR v_sql; LOOP
FETCH curValues INTO strMergerVals;
EXIT WHEN curValues%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(strMergerVals);
END LOOP; CLOSE curValues;
END;
/
DECLARE
strColumns varchar2(1000);
strCol varchar2(20);
v_sql varchar2(2000);
strMergerVals varchar2(2000);
tblName varchar2(50);
TYPE refCursor IS REF CURSOR;
curFields refCursor;
curValues refCursor;
BEGIN
tblName := 'emp';
v_sql := 'select COLUMN_NAME from USER_TAB_COLUMNS where TABLE_NAME = :tblName';
strColumns := '#'; OPEN curFields FOR v_sql USING tblName; LOOP
FETCH curFields INTO strCol;
EXIT WHEN curFields%NOTFOUND;
strColumns := strColumns || 'TO_CHAR(' || strCol || ') || ';
END LOOP; IF (strColumns <> '#') THEN
strColumns := SUBSTR(strColumns, 2, LENGTH(strColumns) - 4);
/*新加的,找不到指定表时的处理*/
ELSE
DBMS_OUTPUT.PUT_LINE('指定表名' || tblName || '错误!');
RETURN;
/**************************/
END IF; CLOSE curFields; DBMS_OUTPUT.PUT_LINE(strColumns);
v_sql := 'select ' || strColumns || ' as MergeCols FROM ' || tblName;
DBMS_OUTPUT.PUT_LINE(v_sql);
DBMS_OUTPUT.PUT_LINE('==============================================');
OPEN curValues FOR v_sql; LOOP
FETCH curValues INTO strMergerVals;
EXIT WHEN curValues%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(strMergerVals);
END LOOP; CLOSE curValues;
END;
/
strColumns := strColumns || 'TO_CHAR(' || strCol || ') || ';
改成:
strColumns := strColumns || 'TO_CHAR(' || strCol || ') || '','' || ';
就可以了
比如 CLASS NAME AGE ...
01 ZHANG 19
效果是 连成一个字符串"01,ZHANG,19",但是现在因为有很多个表都要这个操作,所以不能确定表的字段!
从EMP表中挑出来的值不是连在一起了吗?
http://yangtingkun.itpub.net/post/468/205331