ORA:00900 - 无效的SQL语句

时间:2012-06-28 10:03:54

标签: oracle plsql

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

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

当我运行该过程的查询部分时,它运行正常但是使用过程它会给我错误。

2 个答案:

答案 0 :(得分:1)

正如Shareef指出你在程序中的语句中缺少分号,但看起来你实际上并没有正确创建它。在过程之后,您需要/告诉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;
/

如果您收到一条消息,说明该过程是使用警告编译的,请执行“显示错误”以获取详细信息。

答案 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,可能是因为

Oracle/PLSQL: ORA-00900 Error