Код: Выделить всё
CREATE OR REPLACE PACKAGE mypkg AS
FUNCTION f1 ( p1 IN NUMBER ) RETURN SYS_REFCURSOR;
FUNCTION f2 ( p1 IN NUMBER ) RETURN SYS_REFCURSOR;
END;
/
CREATE OR REPLACE PACKAGE BODY mypkg AS
FUNCTION f1 ( p1 IN NUMBER ) RETURN SYS_REFCURSOR IS
rc SYS_REFCURSOR;
BEGIN
OPEN rc FOR
SELECT *
FROM mytable
WHERE c1 = p1;
RETURN rc;
END;
FUNCTION f2 ( p1 IN NUMBER ) RETURN SYS_REFCURSOR IS
rc SYS_REFCURSOR;
BEGIN
OPEN rc FOR
SELECT c2, COUNT(1) num_rows
FROM mytable
WHERE c1 = p1
GROUP BY c2;
RETURN rc;
END;
END;
/
Код: Выделить всё
public DataTable getData ( string sname, string p1 )
{
DataTable dt = new DataTable();
string qry = "BEGIN :rc := mypkg." + sname + " ( TO_NUMBER( :p1 ) ); END;";
try
{
OracleConnection conn = getConn(); // returns connection
conn.open();
OracleCommand cmd = new OracleCommand( qry, conn);
cmd.BindByName = true;
OracleParameter refcur = new OracleParamater("rc", OracleDbType.RefCursor);
refcur.Direction = ParameterDirection.ReturnValue;
cmd.Parameters.Add(refcur);
cmd.Parameters.Add(new OracleParameter("p1", OracleDbType.Varchar2)).Value = p1.ToString();
using ( OracleDataReader rd = cmd.ExecuteReader())
{
dt.Load(rd);
}
cmd.Dispose();
conn.Close();
return dt;
}
Код: Выделить всё
DataTable dt = getData ( "f1", "5" );Код: Выделить всё
DataTable dt = getData ( "f2", "5" );У меня есть несколько аналогичные функции и те, которые кажутся неработающими, — это те, которые повторно запускают столбец COUNT() или SUM(). Может ли это быть причиной, и если да, то как можно это исправить?
Подробнее здесь: https://stackoverflow.com/questions/790 ... ry-is-fine