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

问题描述 投票:0回答:2

我们动态生成表格。表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')

仅供参考:截至目前,我正在进行两次单独查询,但由于存在一些限制,我想要删除一个并且我无法遵循光标/过程方法。

sql oracle11g
2个回答
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>

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
热门问题
推荐问题
最新问题