2017-07-26 48 views
0

我想从动态sql查询中将行收集到pl/sql行中。问题是查询是动态构建的,我不确定所有列将在那里。结果集基于我DB中的表(示例中的t1)+一个附加列(示例中为sid)。似乎不可能动态创建此记录类型并从动态sql中将记录取出。动态构建记录类型以获取到

PLS-00597:表达式“t_row”在INTO列表是错误的类型

是有可能做到这一点任何其他方式?

请注意代码已被简化为方便阅读:

DECLARE 
    v_query_string VARCHAR2(32767 BYTE); 

    TYPE ref_cursor IS REF CURSOR; 
    cur ref_cursor; 

    TYPE rec_type IS RECORD (
    sid number, 
    struct t1%ROWTYPE); 

    t_row rec_type; 

BEGIN 

    --build v_query_string -> select sid,t1.a,t1.b,t1.c,t1.some_column_from_t1 from t1 

    OPEN cur FOR v_query_string; 
    LOOP 
    FETCH cur INTO t_row; 
    EXIT WHEN cur%NOTFOUND; 
    DBMS_OUTPUT.PUT_LINE(t_row.some_column_from_t1); 
    END LOOP; 
    CLOSE cur; 

END; 
+0

你可以显示你的DDL表吗?无论如何,你应该使用** t_row.sid **这是在** rec_type ** – Frank

+0

@Frank我更新了DBMS_OUTPUT行,以便更清楚地表明我想从t1表中访问任何列(因此t1_rec_type中的%ROWTYPE )。 – JochenDB

回答

0

您可以随时使用动态游标,非常容易阅读,不需要额外的数据类型或变量声明。在您的样品SQL,你可以这样做:

BEGIN 
    FOR cv IN (select sid, t1.a, t1.b, t1.c, t1.some_column_from_t1 from t1) 
    LOOP 
    DBMS_OUTPUT.PUT_LINE(cv.some_column_from_t1); 
    END LOOP; 
END; 

请注意,这不符合SQL建立在飞,并存储在一个变量的工作,但你将能够访问任何列在表中简单SELECT * FROM t1;

+0

我结束了使用这种方法,谢谢! – JochenDB

1

可以使用DMBS_SQL.DESCRIBE_COLUMNS功能。

DECLARE 
     cur PLS_INTEGER := DBMS_SQL.OPEN_CURSOR; 
     cols DBMS_SQL.DESC_TAB; 
     col_num PLS_INTEGER; 
    BEGIN 
     DBMS_SQL.PARSE 
      (cur, 'SELECT * FROM table', DBMS_SQL.NATIVE); 
     // Retrieving column information 
     DBMS_SQL.DESCRIBE_COLUMNS (cur, col_num, cols); 
     ... 
    END; 

你可以从这个link

0
TYPE rec_type IS RECORD (
    sid number, 
    somefield t1.somefield%TYPE 
    ...); 

    t_row rec_type; 

获得更多的Infor,你可以访问数据以这种方式:

t_row.sid etc... 
+0

sid列不是t1表结构的一部分,它是一个派生值 – JochenDB

+0

也许你不能这样做,但是你可以从t1表中转换N个变量中的** struct **,我将编辑答案 – Frank