2012-08-24 57 views
1

對不起,對於非常通用的標題,不能想到最好的方式把它放在簡短的話。我有針對不同客戶的一些出口的查詢。它們對於每個客戶都是相同的查詢,但是通過ID進行過濾。我想爲每種不同類型的導出創建選項卡,併爲每個選項卡中的不同客戶提供變量,以便我可以輕鬆地在任何數據庫實例上爲任何客戶運行它們。然而,最後一條語句是一個查詢,我希望它在結果窗口中返回,但它告訴我它期待着一個INTO語句。我並不擅長使用遊標,我不知道這是否是正確的答案,但是我認爲我會問你們所有人,因爲你們在過去幫助過我很多。謝謝。問題與底層金工作區

標籤示例:

DECLARE lEventID INTEGER; 
     lCustID  INTEGER := 1 -- Development Customer1 
     --lCustID  INTEGER := 2 -- Development Customer2 
     --lCustID  INTEGER := 3 -- Development Customer3 
     --lCustID  INTEGER := 4 -- Development Customer4 
     --lCustID  INTEGER := 5 -- Development Customer5 
     --lCustID  INTEGER := 101 -- Testing Customer1 
     --lCustID  INTEGER := 102 -- Testing Customer2 
     --lCustID  INTEGER := 103 -- Testing Customer3 
     --lCustID  INTEGER := 104 -- Testing Customer4 
     --lCustID  INTEGER := 105 -- Testing Customer5 
     --lCustID  INTEGER := 201 -- Production Customer1 
     --lCustID  INTEGER := 202 -- Production Customer2 
     --lCustID  INTEGER := 203 -- Production Customer3 
     --lCustID  INTEGER := 204 -- Production Customer4 
     --lCustID  INTEGER := 205 -- Production Customer5 

BEGIN 

    SELECT EventID INTO lEventID 
    FROM Event 
    WHERE EventName = 'Event1' 

    SELECT Field1, 
      Field2, 
      Field3 
    FROM Table1 
    WHERE EventID = lEventID 
     AND CustomerID = lCustID; 

END; 

現在,我相信我大概可以改變DECLAREvar,除去BEGINEND;,然後把第一次查詢的子查詢在第二個查詢,並應工作。但是,我試圖保持它的結構,因爲它在它的包中。我不想運行此代碼在程序包中的過程,因爲有更新和插入語句。我只想運行這個查詢,所以我可以看到在實際做它想做的事情之前會發生什麼。我將與同事共享這個工作空間,我不希望他們太困惑。在原始包中,查詢被放入遊標中,該遊標是最終被導出的過程的輸出參數。如果你能幫忙,我真的很感激。此外,底層金是我們開發人員用於與Oracle交互的實用程序,因爲這是我們公司獲得許可的內容(我們不能使用我相信的其他套件)。非常感謝你。

+0

不熟悉該產品,但聽起來像是試圖表現得像SQL * Plus;如果它支持'var',它是否也支持'print',如果是這樣,那麼它會將輸出放到結果窗口中?你提到現有的包過程有一個'out'遊標 - 如果你執行了這個過程(我知道你不想這樣做),你能夠在結果窗口中顯示遊標,如果是這樣的話通過「打印」或其他東西? –

+0

如果我以這種方式執行過程:var_recursor refcursor; exec user.package。procedure1(input1,input2,:reccursor);'就是這樣,它會自動返回窗口中的光標而不需要打印任何東西,這就是爲什麼我希望它能在這裏做同樣的事情。但事實並非如此。 – XstreamINsanity

+0

只需注意Golden([Benthic Software](http://www.benthicsoftware.com/))支持大部分標準SQLPlus腳本語法。 – MarkF

回答

1

在您必須選擇到東西的PL/SQL塊;要麼顯式地寫入局部變量(你可以打印,就像Najzero顯示的那樣),要麼是本地聲明的光標,以便稍後進行操作或打印,或者使用外部聲明的(ref)遊標。

基於您的評論,而不是與此客戶的經驗,這聽起來像你應該能夠做到這一點:

var reccursor refcursor; 

DECLARE 
    lEventID INTEGER; 
    lCustID  INTEGER := 1; 
BEGIN 

    SELECT EventID INTO lEventID 
    FROM Event 
    WHERE EventName = 'Event1' 

    -- open an externally-declared ref cursor to hold the result of the query 
    OPEN :reccursor FOR 
     SELECT Field1, 
       Field2, 
       Field3 
     FROM Table1 
     WHERE EventID = lEventID 
      AND CustomerID = lCustID; 
END; 
/

這我想是非常相似的程序做什麼,但它會打開out參數引用遊標而不是綁定變量。

這與您在SQL * Plus或SQL Developer中所做的相同,但他們需要明確的print :reccursor才能看到該內容,而聽起來像您的客戶端自動處理它。

+0

進行格式化。您真了不起。我所要做的只是添加你放置的線路並按F5,運行良好。非常感謝你。 – XstreamINsanity

+0

另請注意,在[Golden](http://www.benthicsoftware.com/golden.html)中,可以使用「:cursor」作爲綁定var名稱,這樣就不需要使用var行。 var cursor refcursor自動聲明。 – MarkF

1

好了,你沒有說明在你的第二個SELECT語句中的 「進」,你總是可以使用這樣的事情:

CURSOR mySqlStatement IS 
SELECT Field1, 
      Field2, 
      Field3 
    FROM Table1 
    WHERE EventID = lEventID 
     AND CustomerID = lCustID; 

(進入DECLARE面積),而不是選擇ABC的

INTO你去像(在BEGIN後)

FOR row_ IN mySqlStatement LOOP 
//row_ gets generated automaticly and you can access colums as row_.columname 
END LOOP; 
+0

我沒有試圖向變量中插入任何值,我只是想要最後一個查詢將結果顯示到結果窗口中。 – XstreamINsanity

+0

我想你將不得不緩存/將它們放入變量中,並將它們按照您的要求使用DBMS_OUTPUT.put_line()或.put() – Najzero