我是广阔的甲骨文世界的新手。我想要做的是,创建一个存储过程并检索其结果。 我的程序是
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 :(得分:1)
正如Shareef指出你在程序中的语句中缺少分号,但看起来你实际上并没有正确创建它。在过程之后,您需要/
告诉Oracle执行代码并实际执行创建。我认为它将var
和exec
语句视为单个调用的一部分,这是不正确的。但是我也不确定你是怎么运行它的;如果是在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;
/
如果您收到一条消息,说明该过程是使用警告编译的,请执行“显示错误”以获取详细信息。
答案 1 :(得分: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,可能是因为