4

ORACLE:到目前为止,我所尝试的都没有奏效。我希望在屏幕上显示select * from my_table. 在这种情况下 my_table = select table_name from all_tables where owner='ABC' and name like 'ABC%'。表名将是一个加号,但列名是必需的。我可以使用 DB2 在几秒钟内完成此操作,但不能完全转换为 Oracle。

我的尝试:

    variable refcur refcursor;
    declare
    my_select     varchar2(64);
    cursor c_tables is
        select table_name
          from all_tables 
         where owner='ABC' and table_name like 'ABC%';
    begin
    for x in c_tables
      loop
         dbms_output.put_line(x.table_name);  
         my_select := 'select * from ' || x.table_name;
         open :refcur for my_select;
      end loop;

   exception
     when no_data_found
     then dbms_output.put_line('Nothing is found');
   end;
   /

在我所有的尝试中,我得到的最好的结果是表不存在谢谢

4

2 回答 2

0

我不知道你是如何登录的,但如果你没有登录,ABC你需要包括模式和表名,例如

my_select := 'select * from ' || x.owner || '.' || x.table_name;

此外,打开游标不会从中获取任何内容,也不会在任何地方显示数据。您需要添加逻辑以从游标中获取数据、显示数据并关闭游标。而且由于表名不固定,数据库无法提前知道您的行是什么样的,因此您需要熟悉 DBMS_SQL 包,它用于处理这样的动态 SQL。

祝你好运。

于 2016-12-06T03:42:39.153 回答
0

您可以使用以下示例:

create or replace procedure app_test(v_tab varchar2) is
  type cur_type is ref cursor;
  my_cur   cur_type;
  v_name   varchar2(20);
  dyna_sql varchar2(4000);
begin
  dyna_sql := 'select username from ' || v_tab || ' where rownum=1';
  open my_cur for dyna_sql;
  fetch my_cur
    into v_name;
  while my_cur%found LOOP
    fetch my_cur
      into v_name;
    DBMS_output.put_line(v_name);
  end loop;
  close my_cur;
end app_test;
于 2018-05-17T02:52:18.090 回答