2011-12-16 62 views
1

我有一個遊標返回兩個值:一個我將使用(因此將分配給一個out變量)和另一個我只返回使ROWNUM的東西工作。爲什麼這個PL/SQL過程不起作用?

如果我將遊標作爲查詢運行,它按預期工作。但是如果我執行該程序,則out變量爲空。我的方法不知何故不被支持?我的意思是,返回兩個值,但只使用其中之一?這個是我的程序代碼:(不要在查詢本身上鑽得太多,它的工作原理,我知道它有點難看,但是它可以工作,這是我發現返回倒數第二個的唯一方法行)

procedure retorna_infos_tabela_164(i_nip in varchar, 
           o_CODSDPANTERIOR out number) is 
cursor c_tabela_164 is 
    select * 
    from(
     select CODSDP,ROWNUM rn 
     from 
       (
       select NRONIP,CODTIPOMOV,CODSDP 
       from TB164_HISTORICOMOVIMENTACOES 
       where NRONIP = i_nip and 
       CODTIPOMOV='S1' 
       order by DTHMOV desc 
      ) 
     ) 
    where rn=2; 

    v_temp_nr number; 

begin 
    open c_tabela_164; 
    fetch c_tabela_164 into o_CODSDPANTERIOR,v_temp_nr; 
    close c_tabela_164; 
end retorna_infos_tabela_164; 

編輯我試圖運行此程序的方式是通過dbms_output.put_line(o_CODSDPANTERIOR)沒有工作。然後我google了一下,看到我應該先var TO_CHAR()然後輸出它。也沒有工作。

+0

是否可以將光標作爲查詢運行? (在sybase中不是) – 2011-12-16 17:53:01

+0

@aF如果你在`select`關鍵字之前切斷了部分,你可以運行它。 :) – GolezTrol 2011-12-16 17:55:48

回答

0

對不起,我已經讓大家花時間回答我的問題,當答案與我使用的工具有關時。我希望你們都學到了一些東西。

該查詢對我來說至少起作用,我還沒有遇到任何邊界情況,它不起作用,但我沒有詳盡地測試它。

問題蟾蜍,我使用的運行程序的工具,有時填充帶參數的程序我告訴它,但有時事實並非如此。這裏的問題是,我試圖執行沒有參數的過程,結果沒有任何結果...

課程學習:使用右鍵單擊運行過程時仔細檢查生成的過程代碼>在TOAD版本9上運行過程。

2

將數字傳遞給DBMS_OUTPUT.PUT_LINE沒有任何問題。 Oracle會默認使用默認格式將其他內置類型轉換爲VARCHAR2。如果你想控制使用的格式,你只需要使用TO_CHAR--這通常是一個好主意,但通常不是必須的。

但是,有一種可能性是您沒有看到輸出,因爲您沒有啓用它。如果您正在SQLPlus中運行測試,請確保您在運行包含DBMS_OUTPUT調用的代碼之前執行SET SERVEROUTPUT ON。如果您使用的是其他客戶端,請查閱其文檔以獲取啓用DBMS_OUTPUT的正確方法。 (你當然可以測試是否通過添加另一個調用來輸出字符串文字來啓用它。)

你用來填充out參數的技術本質上沒有什麼錯誤。但是,不需要返回光標的兩列;您的select *可能只是select CODSDP。您似乎有一種誤解,謂詞中引用的任何列必須位於選擇列表中,但事實並非如此。在最內層的查詢中,選擇列表不需要包含NRONIPCODTIPOMOV,因爲它們未在外部塊中引用;該查詢中的WHERE子句可以引用表中的任何列,而不管它是否在選擇列表中。

所以,我的第一個猜測是,你根本沒有啓用服務器輸出。我現在唯一可以想到的另一種可能性是,您在兩個不同的會話中運行查詢和過程,其中一個會對該表提交未提交的事務,因此他們實際上看到了不同的數據。

如果這些建議似乎不是問題,我建議您在單個SQLPlus會話中運行獨立查詢和過程的測試,然後在此處複製並粘貼整個會話,以便我們可以看到正是你在做什麼。