2012-06-28 95 views
-1

我是oracle的廣闊世界的新手。我想要做的是創建一個存儲過程並檢索其結果。 我的程序進入作爲ORA:00900 - 無效的SQL語句

Create or Replace Procedure usp_RotaPlateProductie_Select(
afdelingId in varchar2, 
productTypeId in varchar2, 
productieData out sys_refcursor) 
IS 
Begin 
Open productieData for 
Select Rotaplateproductie.Batchnummer, Cpiplusproductieorder.Productnummer, 
    Product.Omschrijving, Productieresultaatrtplrol.Bruto_In_Meters 
    From Rotaplateproductie inner join Productieresultaatrtplrol on 
    Rotaplateproductie.Batchnummer = Productieresultaatrtplrol.Batchnummer 
    inner join Cpiplusproductieorder on 
    Productieresultaatrtplrol.ProductieNummer = Cpiplusproductieorder.ProductNummer 
    inner join Product on 
    Cpiplusproductieorder.Productnummer = Product.Productnummer 
    Where Rotaplateproductie.Afdelingid = '3144' and Rotaplateproductie.producttype = 'PT005' 
END; 

而且使用下面的代碼,我試圖去執行它。

var rc REFCURSOR 
EXEC usp_RotaPlateProductie_Select('3144','PT005', :rc); 

在執行上面的行時,我得到Ora:00900錯誤。

當我運行該過程的查詢部分,它運行良好,但與程序,它給了我錯誤。

+0

我假設這個程序是有效的嗎? – shareef

+0

該查詢是有效的,但不知道有關過程 – Maverick

+0

特立獨行下一次不接受,除非你確定它是否確實發生請...請讓我們知道爲什麼所有人都可以從這個問題中獲得使用 – shareef

回答

1

由於謝里夫指出你錯過了在你的程序中的聲明分號,但它看起來你並沒有正確地創建它。在程序結束後您需要/來告訴Oracle執行代碼並實際執行創建。我認爲它將varexec語句看作單個調用的一部分,這是不正確的。但我也不確定你是如何運行的;如果它在SQL Developer中,則需要'運行腳本'(F5)而不是'運行'。

Create or Replace Procedure usp_RotaPlateProductie_Select(
    p_afdelingId in varchar2, 
    p_productTypeId in varchar2, 
    p_productieData out sys_refcursor) 
IS 
Begin 
    Open p_productieData for 
     Select Rotaplateproductie.Batchnummer, Cpiplusproductieorder.Productnummer, 
      Product.Omschrijving, Productieresultaatrtplrol.Bruto_In_Meters 
     From Rotaplateproductie 
     inner join Productieresultaatrtplrol on 
      Rotaplateproductie.Batchnummer = Productieresultaatrtplrol.Batchnummer 
     inner join Cpiplusproductieorder on 
      Productieresultaatrtplrol.ProductieNummer = Cpiplusproductieorder.ProductNummer 
     inner join Product on 
      Cpiplusproductieorder.Productnummer = Product.Productnummer 
     Where Rotaplateproductie.Afdelingid = p_afdelingId 
     and Rotaplateproductie.producttype = p_productTypeId; 
END; 
/
var rc REFCURSOR 
EXEC usp_RotaPlateProductie_Select('3144','PT005', :rc); 
print :rc 

我切換到使用IN參數,但我已採取更改其名稱,這樣你就可以參數和列名區分的自由;他們是相同的,可能會導致混淆。

您可能會發現它有助於別名表的使用;沒有功能上的區別,但也許更容易閱讀:

Create or Replace Procedure usp_RotaPlateProductie_Select(
    p_afdelingId in varchar2, 
    p_productTypeId in varchar2, 
    p_productieData out sys_refcursor) 
IS 
Begin 
    Open p_productieData for 
     Select rp.Batchnummer, cppo.Productnummer, 
      p.Omschrijving, pra.Bruto_In_Meters 
     From Rotaplateproductie rp 
     inner join Productieresultaatrtplrol par 
      on rp.Batchnummer = pra.Batchnummer 
     inner join Cpiplusproductieorder cppo 
      on pra.ProductieNummer = cppo.ProductNummer 
     inner join Product p 
      on cppo.Productnummer = p.Productnummer 
     Where rp.Afdelingid = p_afdelingId 
     and rp.producttype = p_productTypeId; 
END; 
/

如果你得到該程序有警告編譯的消息,做「顯示錯誤」,以獲得詳細信息。

0

做你運行該代碼

Select Rotaplateproductie.Batchnummer, Cpiplusproductieorder.Productnummer, 
    Product.Omschrijving, Productieresultaatrtplrol.Bruto_In_Meters 
    From Rotaplateproductie inner join Productieresultaatrtplrol on 
    Rotaplateproductie.Batchnummer = Productieresultaatrtplrol.Batchnummer 
    inner join Cpiplusproductieorder on 
    Productieresultaatrtplrol.ProductieNummer = Cpiplusproductieorder.ProductNummer 
    inner join Product on 
    Cpiplusproductieorder.Productnummer = Product.Productnummer 
    Where Rotaplateproductie.Afdelingid = '3144' and Rotaplateproductie.producttype = 'PT005' 

我它的工作原理請回復 我想你到底

錯過分號;

@Mavrik編輯

在查詢的末尾添加分號之後,該過程是正確創建 。感謝,但它仍然是返回相同的錯誤代碼 當我嘗試使用以下代碼

變種RC REFCURSOR EXEC usp_RotaPlateProductie_Select來執行它(「3144」,「PT005」, :RC);

更新1: 如果你有ORA 00900這可能是因爲

Oracle/PLSQL: ORA-00900 Error

+1

如果它們全部一起運行,那麼它也可能在程序結束和'var'之間缺少'/'。 (大概查詢應該使用'IN'參數,而不是硬編碼值)。 –

+0

我將來會使用它們使用IN參數。只是爲了測試我這樣做 – Maverick

+0

@Maverick你使用sql plus – shareef

相關問題