sql >> Databáze >  >> RDS >> Oracle

Při provádění Stroredprocedure došlo k chybě

Jak říká Nicholas Karasnov, potřebujete argumenty ve volání, aby odpovídaly deklaraci procedury. V tomto případě máte OUT parametr, takže potřebujete někam, kde se mají data, která vybíráte, přesunout - něco, co odpovídá sys_refcursor typ parametru.

Pokud k testování používáte SQL*Plus, můžete deklarovat Proměnná SQL*Plus za tímto účelem a poté to předejte jako proměnnou vazby a poté použijte print příkaz pro zobrazení obsahu kurzoru:

variable rc refcursor
exec javao(1, :rc);
print rc

Funguje to i v SQL Developer. Když zavoláte proceduru z jiného kódu, budete mít proměnnou deklarovanou v bloku PL/SQL nebo v externí aplikaci (např. přes jdbc ), ale podrobnosti o nich závisí na tom, co děláte.

Chcete-li volat z Javy, udělali byste něco jako:

// get connection
CallableStatement cStmt = conn.prepareCall("{ call javao(?, ?) }");
cStmt.setInt(1, 1);
cStmt.registerOutParameter(2, OracleTypes.cursor);
cStmt.execute();
ResultSet rSet = ((OracleCallableStatement) cStmt).getCursor(2);
while (rSet.next())
{
    // get columns from result set row and do something with the data
}

... ale to hraničí s pseudokódem a budete si muset přečíst dokumentaci, abyste vyplnili prázdná místa (a opravili případné chyby; pravděpodobně potřebujete například typy příkazů specifické pro Oracle) a přidejte zavírání objektů a zpracování všech chyb. další dobré věci.




  1. Různé výsledky v sqlfiddle.com 5.5.30 a MariaDB 5.5.31

  2. Dynamický dotaz PLSQL

  3. CakePHP 1.3 - Neznámý sloupec v klauzuli where

  4. Automatizujte obnovu testů databáze v SQL Server