动态构建要获取的记录类型

时间:2017-07-26 14:29:31

标签: oracle plsql

我想将动态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;

3 个答案:

答案 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;

访问表中的任何列