我想将动态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 :(得分: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
获取更多信息答案 1 :(得分:0)
TYPE rec_type IS RECORD (
sid number,
somefield t1.somefield%TYPE
...);
t_row rec_type;
您可以通过以下方式访问数据:
t_row.sid etc...
答案 2 :(得分: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;