Как вызвать хранимую процедуру PL / SQL с выходным параметром таблицы записей с использованием C #? - PullRequest
0 голосов
/ 07 декабря 2018

ORA-06550: строка 1, столбец 7:
PLS-00306: неверный номер или типы аргументов при вызове 'GET_STUDENTS'

ORA-06550: строка 1, столбец 7:
PL / SQL: оператор игнорируется

Я получаю эту ошибку, и я не знаю, что я делаю неправильно.Я пробовал разные вещи и до сих пор не получилось.

Спасибо.

create or replace PACKAGE APPS.XXHP_LT AS
  TYPE student_rec IS RECORD
  (
     first_name varchar2(30)
    ,last_name varchar2(30)
    ,grade number
  );

  TYPE student_tab IS TABLE OF student_rec INDEX BY BINARY_INTEGER;

  PROCEDURE get_students
  (
    p_grade           IN  number
    ,x_students         OUT student_tab
    ,x_highest_grade    OUT NOCOPY NUMBER
  );
end;
/
create or replace PACKAGE BODY APPS.XXHP_LT AS
  PROCEDURE get_students
  (
    p_grade           IN  number
    ,x_students         OUT student_tab
    ,x_highest_grade    OUT NOCOPY NUMBER
  )
  IS
  begin
    x_students(1).first_name := 'Scarlett';
    x_students(1).last_name := 'Johansson';
    x_students(1).grade := 4;

    x_students(2).first_name := 'Jennifer';
    x_students(2).last_name := 'Lawrence';
    x_students(2).grade := 3;

    x_students(3).first_name := 'Megan';
    x_students(3).last_name := 'Fox';
    x_students(3).grade := 2;

    x_students(4).first_name := 'Gal';
    x_students(4).last_name := 'Gadot';
    x_students(4).grade := 1;

    select count(grade) into x_highest_grade from table(x_students) where grade >= p_grade;
  end;
end;
/
DECLARE
  P_GRADE NUMBER;
  X_STUDENTS APPS.XXHP_LT.STUDENT_TAB;
  X_HIGHEST_GRADE NUMBER;
BEGIN
  P_GRADE := 4;

  XXHP_LT.GET_STUDENTS(
    P_GRADE => P_GRADE,
    X_STUDENTS => X_STUDENTS,
    X_HIGHEST_GRADE => X_HIGHEST_GRADE
  );

  DBMS_OUTPUT.PUT_LINE('Your Desired Grade = ' || P_GRADE);
  DBMS_OUTPUT.PUT_LINE('Number of Matches = ' || X_HIGHEST_GRADE);
  DBMS_OUTPUT.PUT_LINE('');

  FOR i IN X_STUDENTS.FIRST .. X_STUDENTS.LAST
  LOOP
    DBMS_OUTPUT.PUT_LINE(X_STUDENTS(i).first_name || ' ' || X_STUDENTS(i).last_name || ' ' || X_STUDENTS(i).grade);
  END LOOP;
END;

выходные данные для этого прогона приведены ниже, и это означает, что с кодом PLSQL все в порядке.

Your Desired Grade = 4
Number of Matches = 1

Scarlett Johansson 4
Jennifer Lawrence 3
Megan Fox 2
Gal Gadot 1

Я написал небольшое консольное приложение с приведенным ниже кодом и продолжаю получать указанную ошибку.

static void Main(string[] args)
{
    int retValue = 0;
    string ConnectionString = ConfigurationManager.ConnectionStrings["EBS"].ConnectionString;
    string SQL = @"APPS.XXHP_LT.GET_STUDENTS";

    OracleParameter opStudents = new OracleParameter("X_STUDENTS", OracleDbType.Raw, ParameterDirection.Output);
    opStudents.UdtTypeName = "APPS.XXHP_LT.STUDENT_TAB";
    //opEmpOrgsOutSmTab.CollectionType = OracleCollectionType.PLSQLAssociativeArray;
    //opEmpOrgsOutSmTab.Size = 1000;
    //opEmpOrgsOutSmTab.ArrayBindSize = Enumerable.Repeat(10000, opEmpOrgsOutSmTab.Size).ToArray();

    OracleParameter opHighestGrade = new OracleParameter("X_HIGHEST_GRADE", OracleDbType.Int32, ParameterDirection.Output);

    List<OracleParameter> paraList = new List<OracleParameter>();
    paraList.Add(new OracleParameter("P_GRADE", OracleDbType.Int32, 4, ParameterDirection.Input));
    paraList.Add(opStudents);
    paraList.Add(opHighestGrade);

    using (OracleConnection dbConnection = new OracleConnection(ConnectionString))
    {
        try
        {
            dbConnection.Open();

            using (OracleCommand cmd = new OracleCommand(SQL, dbConnection))
            {
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.BindByName = true;
                cmd.Parameters.AddRange(paraList.ToArray());

                retValue += cmd.ExecuteNonQuery();
            }
        }
        catch (Exception ex)
        {
            retValue = -1;
            Console.WriteLine(ex.Message);
        }
        finally
        {
            dbConnection.Dispose();
        }
    }

    Console.Read();
}
...