我有以下查询,该查询为我提供了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值。
有没有更简单的方法?
编辑:示例数据
答案 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;