【问题标题】:Dynamically build record type to fetch into动态构建记录类型以获取
【发布时间】:2017-07-26 14:29:30
【问题描述】:

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

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

是否可以通过其他方式做到这一点?

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

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;

【问题讨论】:

  • 你能显示你的 DDL 表吗?无论如何,您应该使用 rec_type 中的 t_row.sid
  • @Frank 我更新了 DBMS_OUTPUT 行,以更清楚地表明我想访问 t1 表中的任何列(因此 rec_type 中的 t1%ROWTYPE)。

标签: oracle plsql


【解决方案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获得更多信息

【讨论】:

    【解决方案2】:

    您始终可以使用动态游标,它非常易于阅读,并且不需要声明额外的数据类型或变量。在您的示例 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; 访问表中的任何列

    【讨论】:

      【解决方案3】:
       TYPE rec_type IS RECORD (
          sid number,  
          somefield t1.somefield%TYPE
          ...);
      
        t_row rec_type;
      

      您可以通过这种方式访问​​数据:

      t_row.sid etc...
      

      【讨论】:

      • sid 列不是 t1 表结构的一部分,它是派生值
      • 也许你不能那样做,但是你可以在 t1 表的 N 个变量中转换 struct,我会编辑答案
      猜你喜欢
      • 2011-07-16
      • 2019-03-12
      • 1970-01-01
      • 1970-01-01
      • 2011-08-19
      • 2014-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多