我有一个存储其他表名称的表。像
COL_TAB
--------------
TABLE_NAME
--------------
TAB1
TAB2
TAB3
我想要做的是,我想在这样的表上运行SQL查询,
SELECT * FROM (SELECT TABLE_NAME from COL_TAB WHERE TABLE_NAME = 'TAB1')
由于
答案 0 :(得分:1)
Oracle SQL查询可以使用动态表名,使用Oracle Data Cartridge和ANY *类型。但在使用这些高级功能之前,请退后一步,问自己是否真的有必要。
你真的需要 SQL 语句才能成为动态吗?通常情况下,这可以由可以提交不同类型的查询的应用程序更好地处理。有许多应用程序编程语言和工具包可以处理意外类型。如果这是仅用于数据库的操作,那么通常将结果存储在某处,在这种情况下,PL / SQL和动态SQL会更容易。
如果你确定你遇到了一个需要完全动态的SQL语句的罕见案例,你需要像我的开源项目Method4这样的东西。下载并安装它并尝试以下代码。
架构设置
create table tab1(a number);
create table tab2(b number);
create table tab3(c number);
insert into tab1 values(10);
insert into tab2 values(20);
insert into tab3 values(30);
create table col_tab(table_name varchar2(30), id number);
insert into col_tab values('TAB1', 1);
insert into col_tab values('TAB1', 2);
insert into col_tab values('TAB1', 3);
commit;
<强>查询强>
select * from table(method4.dynamic_query(
q'[
select 'select * from '||table_name sql
from col_tab
where id = 1
]'));
结果:
A
--
10
您很快就会发现查询中的查询非常困难。这可能是一种更简单的方法,但可能需要进行设计更改。
答案 1 :(得分:0)
我手边没有数据库来测试这个,但我认为你正在寻找这样的东西:
DECLARE
-- Create a cursor on the table you are looking through.
CURSOR curTable IS
SELECT *
FROM MainTable;
recTable curTable%ROWTYPE;
vcQuery VARCHAR2(100);
BEGIN
-- Loop through all rows of MainTable.
OPEN curTable;
LOOP
FETCH curTable INTO recTable;
EXIT WHEN curTable%NOTFOUND;
-- Set up a dynamic query, with a WHERE example.
vcQuery := 'SELECT ColumnA, ColumnB FROM ' || recTable.Table_Name || ' WHERE 1 = 1';
-- Execute the query.
OPEN :dyn_cur FOR vcQuery;
END LOOP;
CLOSE curTable;
END;
/
答案 2 :(得分:-1)
试试这个
CREATE OR REPLACE PROCEDURE TEST IS
sql_stmt VARCHAR2(200);
V_NAME VARCHAR2(20);
BEGIN
sql_stmt := 'SELECT * FROM ';
EXECUTE IMMEDIATE sql_stmt|| V_NAME;
END;
<强>更新强> select语句在程序中不起作用。
在sql server中你可以试试sql block
Declare @name varchar2(50)
Select @name='Select * from '+TABLE_NAME from COL_TAB WHERE TABLE_NAME = 'TAB1'
EXEC(@name);