识别和检索Oracle数据库中所有varchar列的值

时间:2018-06-22 10:23:52

标签: oracle plsql

我有以下查询,该查询为我提供了Run-time error '1004': Method 'Range' of object'_Global' failed 列的Oracle数据库中所有表和列的结果集:

Dim rgCopy As Range
    Dim rCount As Integer

    Set rgCopy = Range("E6", Selection.End(xlDown))
    Selection.Copy
    rCount = Application.WorksheetFunction.CountA(Range("E:E")) - 1
    lastrow = Cells(Rows.Count, 4).End(xlUp).Row

    Range("E6:" & Selection.End(xlDown)).Copy Destination:=Range("D" & lastrow + 5)

为此,我想添加第4列以显示ATC.COLUMN_NAME的值。有简单的方法吗?

我考虑过要联接到一条通过ATC.COLUMN_NAME循环并输出值的SQL语句。联接将在表名上完成。

我不知道是否要使它复杂化,也无法想到SQL。我尝试在变量中声明上述语句,然后使用CTE对其进行查询,但我仍然需要遍历table_name和column_name值。

有没有更简单的方法?

编辑:示例数据

enter image description here

1 个答案:

答案 0 :(得分:2)

您需要使用动态SQL。这是一个概念证明,在大型数据库上运行时无法很好地扩展。

declare
    stmt varchar2(32767);
    val varchar2(4000);
    rc sys_refcursor;
begin
    for r in ( SELECT ATC.OWNER, ATC.TABLE_NAME, ATC.COLUMN_NAME
               FROM all_tab_columns ATC
                WHERE DATA_TYPE LIKE '%VARCHAR%' )
    loop
        stmt := ' select distinct '|| r.column_name || 
                ' from '|| r.owner||'.'||r.table_name;
        open rc for stmt;
        loop
            fetch rc in val;
            exit when rc%notfound;
            dbms_output.put_line ( r.owner||'.'||r.table_name ||'.'|| r.column_name
                   ||': '|| val );
        end loop;
    end loop;
end;