1

我正在尝试编写一个非常简单的 sql 脚本: select * from table_X; 如果有的话,我想在 oracle sqlplus 中查看结果。这些结果对于进一步分析很重要。还要提一下,这取决于最初创建了多少表,因此 table_X 可能根本不在数据库中。但是我想避免在解析时出现错误,在上面运行该脚本时 table_X 不存在。

所以我试图将该 SQL 包装到一些 PLSQL 动态代码中,如下所示:

Define table_X="MY_TAB"
    DECLARE
       stmt_     VARCHAR2(2000);
       exist_ number := 0;
       CURSOR table_exist IS
         SELECT 1
           FROM user_tables
          WHERE table_name = '&table_X';
    BEGIN
       OPEN table_exist;
       FETCH table_exist INTO exist_;
       CLOSE table_exist;

       IF exist_ = 1 THEN
          stmt_ := 'SELECT * FROM &table_X';
          EXECUTE IMMEDIATE stmt_;
       ELSE
          dbms_output.put_line('This functionality is not installed.');
       END IF;
    END;
/
  1. 如果 MY_TAB 中有数据,为什么我看不到任何结果(记录)?我真的需要绑定一些列并使用 ex. dbms_output 能看到一些信息吗?
  2. 如果该表不存在(理想情况下仅使用 SQL),是否有任何简单的方法来查询表而不获取“ORA-00942:表或视图不存在”?

提前致谢

4

2 回答 2

0

而不是execute immediate 'query'你可以使用execute immediate 'query' bulk collect into然后循环它并使用它dbms_output来打印它。

http://docs.oracle.com/cd/B19306_01/appdev.102/b14261/executeimmediate_statement.htm

于 2012-11-30T11:04:34.257 回答
0

如果你想在sqlplus中这样:

SQL> var c refcursor;
SQL> create or replace function get_table(p_tab in varchar2)
  2  return sys_refcursor
  3  is
  4  v_r sys_refcursor;
  5  NO_TABLE exception;
  6  pragma exception_init(NO_TABLE, -942);
  7  begin
  8    open v_r for 'select * from ' || dbms_assert.simple_sql_name(p_tab);
  9    return v_r;
 10  exception
 11    when NO_TABLE
 12    then
 13      open v_r for select 'NO TABLE ' || p_tab as oops from dual;
 14      return v_r;
 15  end;
 16  /

Function created.

SQL> exec :c := get_table('DUAL2');

PL/SQL procedure successfully completed.

SQL> print c

OOPS
-----------------------------------------
NO TABLE DUAL2

SQL>
SQL> exec :c := get_table('DUAL');

PL/SQL procedure successfully completed.

SQL> print c

D
-
X
于 2012-11-29T18:11:42.780 回答