2012-11-29 24 views
1

我想寫一個非常簡單的SQL腳本: select * from table_X; 我想看看oracle sqlplus中的結果,如果有的話。這些結果對於進一步分析非常重要。 另外值得一提的是,它取決於最初創建了多少個表,因此很有可能table_X根本不在數據庫中。但是,我想避免在解析時出現錯誤,即在運行上述腳本時table_X不存在。oracle - 混合SQL代碼與PLSQL時WHERE語句中沒有綁定

所以我想換行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上的數據?我真的需要綁定一些列並使用前。 dbms_output能夠看到一些信息?
  2. 是否有任何簡單的方法來查詢表沒有得到'ORA-00942:表或視圖不存在' 如果該表不存在(理想情況下只使用SQL)?

在此先感謝

+0

有在腳本的開頭你嘗試添加'設置SERVEROUTPUT on'? http://www.adp-gmbh.ch/ora/sqlplus/serveroutput.html – FrustratedWithFormsDesigner

+0

此外,您的問題#2應該移動到一個單獨的StackOverflow問題,因爲它不是真的與您的輸出問題有關。 – FrustratedWithFormsDesigner

回答

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