从表中选择记录,其中表名来自另一个表

时间:2018-03-01 07:34:42

标签: sql oracle11g

我们动态生成表格。表T_1,T_2,T_3等&我们可以通过以下查询从另一个表中获取该表名。

SELECT CONCAT('T_', T_ID) AS T_NAME FROM T_NAMES WHERE T_KEY = 'ABC';

现在我想从这个检索到的表名中获取记录。我该怎么办?

我做了以下但是没有工作:

SELECT * FROM (SELECT CONCAT('T_', T_ID) AS T_NAME FROM T_NAMES WHERE T_KEY = 'ABC')

仅供参考:我现在打了两个单独的查询但是我想要消除一个由于某些限制我无法遵循游标/程序方法

2 个答案:

答案 0 :(得分:0)

使用refcursor的程序似乎对我来说最合适。这是一个例子:

SQL> -- creating test case (your T_NAMES table and T_1 which looks like Scott's DEPT)
SQL> create table t_names (t_id number, t_key varchar2(3));

Table created.

SQL> insert into t_names values (1, 'ABC');

1 row created.

SQL> create table t_1 as select * from dept;

Table created.

SQL> -- a procedure; accepts KEY and returns refcursor
SQL> create or replace procedure p_test
  2    (par_key in varchar2, par_out out sys_refcursor)
  3  as
  4    l_t_name varchar2(30);
  5  begin
  6    select 'T_' || t_id
  7      into l_t_name
  8      from t_names
  9      where t_key = par_key;
 10
 11    open par_out for 'select * from ' || l_t_name;
 12  end;
 13  /

Procedure created.

好的,让我们测试一下:

SQL> var l_out refcursor
SQL> exec p_test('ABC', :l_out)

PL/SQL procedure successfully completed.

SQL> print l_out

    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 ACCOUNTING     NEW YORK
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO
        40 OPERATIONS     BOSTON

SQL>

答案 1 :(得分:0)

我可以向你推荐动态SQL。 首先,您需要创建一个游标。游标将按动态表进行迭代。然后,您可以使用动态SQL创建查询,然后执行它。

所以例子:

  1. https://livesql.oracle.com/apex/livesql/file/content_C81136WLRFYZF8ION6Q57GWE1.html - 详细的光标示例。
  2. https://docs.oracle.com/cd/B28359_01/appdev.111/b28370/dynamic.htm#i13057 - Oracle中的动态SQL