我想从表中返回所有行和字段,其中tablename和fieldnames都不会事先知道。类似的东西:
select * from [TABLENAME]
这个其他方法看起来很有希望,但select * from test_cursor
给出"尝试访问其类型未知的项目的行..."
https://stackoverflow.com/a/101064/209942
EXECUTE IMMEDIATE
似乎很有希望,但我读到返回多行需要一个光标,我无法找到一个例子。
首选解决方案非常简单快速(即,希望避免逐行处理)。
想避免创建一个函数或过程,但也许这是不可避免的。也许我需要使用表函数?
可能是以下情况?
CREATE OR REPLACE FUNCTION GetTable(table_name CHAR)
BEGIN
EXECUTE IMMEDIATE 'CREATE TABLE temp_table
AS (SELECT * FROM :1)' USING table_name;
END;
SELECT * FROM table (temp_table)
THX
答案 0 :(得分:0)
您需求中最难的部分是您要获取的列的数据类型一致性,以及列数,您希望选择的每个表名之间可能有所不同。
对于您的问题,您可以使用:
动态SQL和Global Temporary Table:仅当fieldname1和fieldname2的数据类型始终与global_temp的col1和col2匹配时(必须先创建global_temp表)。
delete global_temp;
sql_stmt := 'insert into global_temp(col1,col2)
SELECT '|| fieldname1 || ',' || fieldname2
||' FROM ' || var_table_name;
EXECUTE IMMEDIATE sql_stmt;
select * from global_temp; --do any thing with result temp table
dynamic SQL into records(循环每一行以获得结果):转到链接,搜索emp_rec
答案 1 :(得分:0)
我使用user_tables创建一个变量,该变量存储在表名中。
Create procedure dynamic_tab_name(tab_name user_tables.table.name%type)
As
Type refc is ref cursor;
Cur refc;
Result varchar2(30);
Begin
Open cur for 'select a from'|| tab_name;
Fetch cur into result;
dbms_output. put_line(result);
Close cur;
End;
答案 2 :(得分:-1)
此答案不需要任何字段类型或数字知识。
简短的回答是:
EXECUTE IMMEDIATE 'CREATE TABLE temp_table AS (SELECT * FROM ' ||table_name||')';
SELECT * FROM temp_table;
答案很长:
DROP TABLE TEMP_TABLE;
DECLARE table_name VARCHAR2(200);
BEGIN
table_name := 'subreports';
EXECUTE IMMEDIATE 'CREATE TABLE temp_table AS (SELECT * FROM ' ||table_name||')';
END;
SELECT * FROM temp_table;
或者,作为一个程序(任何人,纠正我的语法):
create procedure GetTable (table_name in VARCHAR2(200), result_set out sys_refcursor)
is
begin
DROP TABLE TEMP_TABLE PURGE;
EXECUTE IMMEDIATE 'CREATE TABLE temp_table AS (SELECT * FROM ' ||table_name||')';
open result_set for select * from temp_table;
end;