Plsql 游标中的动态字符串连接
我有一个函数,它包含光标的值。它现在只包含4列,列名称应该是硬编码的。是否有一种通用的解决方案,这样,如果我传递一个游标,它将自动包含数据,而不考虑11g中的列名和列数Plsql 游标中的动态字符串连接,plsql,oracle11g,Plsql,Oracle11g,我有一个函数,它包含光标的值。它现在只包含4列,列名称应该是硬编码的。是否有一种通用的解决方案,这样,如果我传递一个游标,它将自动包含数据,而不考虑11g中的列名和列数 FUNCTION generateData(p_dataCursor IN SYS_REFCURSOR) RETURN VARCHAR2 AS -- --------------------------------------------------------------------- crlf VARCHAR
FUNCTION generateData(p_dataCursor IN SYS_REFCURSOR)
RETURN VARCHAR2 AS
-- ---------------------------------------------------------------------
crlf VARCHAR2(2) := chr(13)||chr(10);
lv_message VARCHAR2(32000);
BEGIN
FOR rec IN p_dataCursor
LOOP
lv_message := lv_message || rec.a||','||rec.b||','||rec.c||','||rec.d || crlf;
END LOOP;
RETURN lv_message;
END;
由于11g Oracle内置包DBMS\U SQL提供了指向\u游标\u编号的函数-“此函数接受打开的强类型或弱类型ref游标,并将其转换为DBMS\u SQL游标编号。” 示例代码:
DECLARE
l_cursor SYS_REFCURSOR;
FUNCTION generateData(p_dataCursor IN SYS_REFCURSOR)
RETURN VARCHAR2 AS
curs SYS_REFCURSOR := p_dataCursor;
l_cursorid NUMBER;
l_column_count INTEGER;
l_describe_table DBMS_SQL.DESC_TAB;
l_numvar NUMBER;
l_ignore INTEGER;
l_value VARCHAR2(2000);
l_coma VARCHAR2(10);
crlf VARCHAR2(2) := chr(13)||chr(10);
lv_message VARCHAR2(32000);
BEGIN
l_cursorid := dbms_sql.to_cursor_number( curs );
dbms_sql.describe_columns( l_cursorid, l_column_count, l_describe_table );
FOR i IN 1..l_column_count LOOP
dbms_sql.define_column(l_cursorid, i, l_value, 2000);
END LOOP;
LOOP
IF DBMS_SQL.FETCH_ROWS(l_cursorid)>0 THEN
l_coma := '';
FOR i IN 1..l_column_count LOOP
dbms_sql.column_value(l_cursorid, i, l_value);
lv_message := lv_message || l_coma || l_value;
l_coma := ',';
END LOOP;
lv_message := lv_message || crlf;
ELSE
EXIT;
END IF;
END LOOP;
dbms_sql.close_cursor( l_cursorid );
RETURN lv_message;
END;
BEGIN
open l_cursor FOR 'SELECT 1 as A, 2 AS B, 3 AS C, 4 AS D FROM DUAL UNION ALL SELECT 1 as A, 2 AS B, 3 AS C, 4 AS D FROM DUAL';
dbms_Output.put_Line(generateData(l_cursor));
END;
/