100分!在线等,关于不知字段个数从游标中取值的问题!
定义一个游标: CURSOR ABC IS SELECT A.* FROM A
现在不知道 表A 中有多少字段,请问如何操作能把游标中每一行中每个字段
的值以逗号为隔点赋值到一个字符串变量 STRROWVALUE中呢?
------解决方案--------------------你直接从A里面区是取不出来的,oracle把你的列名都存在User_Tab_Columns这个table里面,你可以通过table_name去取。
Select * From User_Tab_Columns Where table_name= 'A '
------解决方案--------------------定义一个游标
把取出来的值给一个变量加进去
循环过程中
用一个字符串变量接受这些值
最后输出字符串变量
------解决方案--------------------好象只有这个办法了,其实10个表还好呀,写法都一样的
------解决方案--------------------无所谓的,先从User_Tab_Columns 里面count一把,然后循环一下就行了,多少个字段写法都一样
------解决方案--------------------先从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;
/
------解决方案--------------------那就放输入参数啊 一样的