【问题标题】:Calling columns of record by it´s index, not name通过索引而不是名称调用记录列
【发布时间】:2016-05-22 21:21:18
【问题描述】:

我有超过 160 列的表,我需要处理 PL/SQL 过程中的每一列。我从表中记录了整行,如下所示:

DECLARE
  l_employee rec_employees%ROWTYPE;
  COLUMN_AND_VALUE VARCHAR2(200);

BEGIN
  SELECT *
  INTO l_employee
  FROM employees
  WHERE employee_id = 100;

现在我想用 FOR LOOP 处理这条记录的所有列,但我不知道如何,因为我必须通过列名来引用记录的每一列,例如 l_employee.id、l_employee.salary、 ....是否可以像 l_employee[INDEX_OF_COLUMN] 那样以某种方式引用它们,并获得我正在使用的列的名称?这是我想用记录做的例子:

FOR INDEX_OF_COLUMN IN 1 .. 167 LOOP
     COLUMN_AND_VALUE := l_employee[INDEX_OF_COLUMN].COLUMN_NAME || ': ' || l_employee[INDEX_OF_COLUMN].VALUE_OF_COLUMN

-- I know those commands don't work, but I need something like that

END LOOP;

或者在不使用记录的情况下,这里有更好的方法吗?

非常感谢你,我真的很抱歉我的英语不好。我希望你能理解我的问题:)

【问题讨论】:

  • 你能帮我们了解一下这个的用法吗?你真的要处理所有 167 列吗?如果是,那么在处理时,您肯定必须明确给出column name。因为我认为每列数据的处理会有所不同。
  • 但是,您可以使用 `CURSOR C2 is select COLUMN_NAME from ALL_TAB_COLUMNS where TABLE_NAME ='EMPLOYEES'; 获取表的所有列名;

标签: plsql record


【解决方案1】:

最后我在一些帮助下找到了这个解决方案。这正是我在这篇文章中所需要的,但后来我意识到这对我来说不是最好的方式,因为我有其他条件。

`DECLARE  
  l_query      VARCHAR2(32767) := 'SELECT * FROM employees where id=1';  
  l_theCursor  INTEGER DEFAULT dbms_sql.open_cursor;  
  l_columnValue VARCHAR2(4000);  
  l_status      INTEGER;  
  l_descTbl dbms_sql.desc_tab;  
  l_colCnt NUMBER;  
BEGIN  
  dbms_sql.parse(l_theCursor,l_query,dbms_sql.native);  
  dbms_sql.describe_columns( l_theCursor, l_colCnt, l_descTbl);  
  FOR i IN 1 .. l_colCnt  
  LOOP  
    dbms_sql.define_column(l_theCursor, i, l_columnValue, 4000);  
  END LOOP;  
  l_status := dbms_sql.execute(l_theCursor);  
  WHILE ( dbms_sql.fetch_rows(l_theCursor) > 0 )  
  LOOP  
    FOR i IN 1 .. l_colCnt  
    LOOP  
      dbms_sql.column_value( l_theCursor, i, l_columnValue );  
      dbms_output.put_line( l_descTbl(i).col_name|| ': ' ||l_columnValue ); 
    END LOOP;
  END LOOP;  
EXCEPTION  
WHEN OTHERS THEN  
  dbms_sql.close_cursor( l_theCursor );  
  RAISE;  
END;  `

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-17
    • 2014-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-22
    相关资源
    最近更新 更多