1

私は非常に単純なSQLスクリプトを書き込もうとしています。select*fromtable_X; ある場合は、oraclesqlplusで結果を確認したいと思います。これらの結果は、さらなる分析にとって重要です。また、最初に作成されたテーブルの数にもよりますが、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

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 に答える
0

代わりに、使用してループし、使用して印刷するexecute immediate 'query'ことができます。execute immediate 'query' bulk collect intodbms_output

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

于 2012-11-30T11:04:34.257 に答える