-1

我是甲骨文广阔世界的新手。我要做的是创建一个存储过程并检索其结果。我的程序是

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 错误。

当我运行程序的查询部分时,它运行良好,但是使用程序它给了我错误。

4

2 回答 2

1

正如 Shareef 指出的那样,您在过程中的语句中缺少分号,但看起来您实际上并没有正确创建它。您需要/在过程之后告诉 Oracle 执行代码并实际进行创建。我认为它将varandexec语句视为单个调用的一部分,这是不正确的。但我也不确定你是如何运行它的;如果它在 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;
/

如果您收到一条消息,表明程序编译时带有警告,请执行“显示错误”以获取详细信息。

于 2012-06-28T11:28:15.420 回答
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 已编辑

在查询末尾添加分号后,正确创建了过程。谢谢,但是当我尝试使用以下代码执行它时,它仍然返回相同的错误代码

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

更新 1: 如果你有 ora 00900 可能是因为

Oracle/PLSQL:ORA-00900 错误

于 2012-06-28T10:12:09.463 回答