如何对名称取自另一个表

时间:2016-07-14 14:42:19

标签: sql oracle plsql

我有一个存储其他表名称的表。像

COL_TAB
--------------
TABLE_NAME
--------------
TAB1
TAB2
TAB3

我想要做的是,我想在这样的表上运行SQL查询,

SELECT * FROM (SELECT TABLE_NAME from COL_TAB WHERE TABLE_NAME = 'TAB1')

由于

3 个答案:

答案 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);