2012-07-23 123 views
4
Set ServerOutput on size 100000; 
declare 
countTab number := 0; 
countCol number := 0; 
currDate varchar2(30); 
scale number := 0; 


Begin 

select count(*) into countCol from USER_TAB_COLUMNS where TABLE_NAME = 'EVAPP_INTERFACE' and COLUMN_NAME = 'TARGET_AMNT_LTV_NUM' and DATA_SCALE is null; 
IF (countCol <> 0) then 

DBMS_OUTPUT.put_line(' EVAPP_INTERFACE.TARGET_AMNT_LTV_NUM values begin'); 
execute immediate 'select APPSEQNO, TARGET_AMNT_LTV_NUM from evapp_interface where TARGET_AMNT_LTV_NUM > 999999999999'; 

END IF; 
END; 
\ 

我試圖顯示select查詢的結果。我試圖按照原樣運行select語句,但它提供了一個例外,說它找不到提到的列。所以,我試着把列名稱放在列的前面,它抱怨我需要使用INTO,我也使用它,但它仍然不喜歡語法。select語句的pl/sql顯示結果

+0

和DATA_SCALE爲空?這不是表格的一列USER_TAB_COLUMNS – Nathan 2012-07-23 15:34:04

+1

@Nathan - [yes yes is](http://docs.oracle.com/cd/E14072_01/server.112/e10820/statviews_5459.htm); '數字中小數點右側的數字'。 – 2012-07-23 15:49:17

回答

3

假設你正在使用SQL * Plus,最簡單的方法可能是如果你想顯示從PL/SQL結果做類似的東西

Set ServerOutput on size 100000; 
variable rc refcursor; 
declare 
    countTab number := 0; 
    countCol number := 0; 
    currDate varchar2(30); 
    scale number := 0; 
Begin 
    select count(*) 
    into countCol 
    from USER_TAB_COLUMNS 
    where TABLE_NAME = 'EVAPP_INTERFACE' 
    and COLUMN_NAME = 'TARGET_AMNT_LTV_NUM' 
    and DATA_SCALE is null; 
    IF (countCol <> 0) then 
    DBMS_OUTPUT.put_line(' EVAPP_INTERFACE.TARGET_AMNT_LTV_NUM values begin'); 
    open :rc 
    FOR 'select APPSEQNO, TARGET_AMNT_LTV_NUM ' || 
     ' from evapp_interface ' || 
     ' where TARGET_AMNT_LTV_NUM > 999999999999'; 
    END IF; 
END; 
/

PRINT rc; 

,你需要打開遊標,取結果導入局部變量,然後用局部變量做一些事情,比如將它們寫入DBMS_OUTPUT

+0

如果我有其他的SQL塊,我正在檢查其他列,我使用不同的光標?或者我可以使用同一個,並最終打印所有內容? – roymustang86 2012-07-23 16:14:31

+0

@ roymustang86 - 我不確定我是否理解這個問題。遊標是指向查詢的指針。如果您聲明需要執行多個動態查詢,並且希望在執行了許多匿名PL/SQL塊後打印每個查詢的結果,則需要在SQL * Plus中聲明多個'refcursor'變量。如果你只是要執行一個匿名塊,打印結果,執行另一個匿名塊,打印結果等,那麼你可以在SQL * Plus中使用一個'refcursor'變量。 – 2012-07-23 16:17:29

+0

我做了你所說的,但在8個光標後,它給了我錯誤,說光標已關閉。另外,Oracle是否注意在腳本結尾關閉遊標? – roymustang86 2012-07-23 17:01:30