日期:2014-05-17  浏览次数:20763 次

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;
/
------解决方案--------------------
那就放输入参数啊 一样的