Используйте asp.net для вызова хранимой процедуры oracle. Visual Studio 2005 - PullRequest
0 голосов
/ 06 августа 2010

У нас есть хранимая процедура oracle, которая находится в базе данных oracle 10.2. Хранимая процедура содержит определенные входные и выходные параметры. Мы пытаемся создать веб-приложение asp.net для выполнения хранимой процедуры и связать результат, полученный из выходных параметров, в сетку. Но не повезло.

Вот что я сделал до сих пор

Oracle.DataAccess.dll

Я установил компоненты доступа к данным Oracle (ODAC) с Oracle Developer Tools для Visual Studio и использовал его для вызова хранимой процедуры оракула.

** Вот ошибка, которую я получаю **
ORA-06550: строка 1, столбец 7:
PLS-00306: неверный номер или типы аргументов при вызове 'CALC_NUMBERVOTES'
ORA-06550: строка 1, столбец 7:
PLS-00306: неверный номер или типы аргументов при вызове 'CALC_NUMBERVOTES'
ORA-06550: строка 1, столбец 7:
PLS-00306: неверный номер или типы аргументов при вызове 'CALC_NUMBERVOTES'
ORA-06550: строка 1, столбец 7:
PLS-00306: неверный номер или типы аргументов при вызове 'CALC_NUMBERVOTES'
ORA-06550: строка 1, столбец 7:
PL / SQL: оператор игнорируется

любая помощь очень ценится.
устный код хранимой процедуры

PROCEDURE calc_numbervotes (  
  i_Office                IN  ELECTIONRESULTS.office%TYPE,  
  o_candidate             OUT tblcandidate ,  
  o_party                 OUT tblparty,  
  o_votes                 OUT tblvotes,  
  o_percAll               OUT tblpercAll)  
IS  
/***************Find Number of candidate per office and party******************/  
 CURSOR c1 is  
  SELECT distinct candidate, party,sum(votes) totalvotes  
   FROM ELECTIONRESULTS  
   WHERE candidate not in ('Registered Voters' )  
   AND office = i_office  
   AND Precinct <> ' '  
   GROUP BY candidate,party  
   ORDER BY sum(votes) desc;  
/****************** Find total county votes per candidate *********************/  
 CURSOR c2 is  
  SELECT sum(votes) from ELECTIONRESULTS  
  WHERE candidate !='Registered Voters'  
  AND office       = i_Office  
  AND Precinct    <> ' ';  

  recCount     NUMBER DEFAULT 0;  
  totvotesall  NUMBER;  
  totvotescandidateprec NUMBER;  

 BEGIN  

  OPEN   c2;  
    FETCH c2 into totvotesall;  
   CLOSE c2;  
   ************************************************************/  
   FOR rec  in c1 LOOP  

   recCount:= recCount + 1;  

       o_candidate(recCount):= rec.candidate;  
       o_party(recCount)    := rec.party;  
       o_votes(recCount)    := rec.totalvotes;  

    if rec.totalvotes = 0 then  
       o_percAll(recCount)  := 0;  
    else  

       o_percAll(recCount)  := round((rec.totalvotes/totvotesall)*100,2);  

    end if;  

  END LOOP;  
 END calc_numbervotes;  

код asp.net

Dim constr As String = "data source=ds;user id=uid;password=pwd;"  
Dim orclCon As OracleConnection  
orclCon = New OracleConnection(constr)  
Dim objCmd As OracleCommand = New OracleCommand()  
objCmd.Connection = orclCon  
objCmd.CommandText = "pkg_calc_votes.calc_numbervotes"  
objCmd.CommandType = CommandType.StoredProcedure  
objCmd.Parameters.Add(New OracleParameter("i_office", OracleDbType.NVarchar2,  255)).Value  = "U.S. CONGRESS 05"  
objCmd.Parameters.Add(New OracleParameter("o_party", OracleDbType.NVarchar2, 10)).Direction = ParameterDirection.Output  
objCmd.Parameters.Add(New OracleParameter("o_candidate", OracleDbType.NVarchar2, 255)).Direction = ParameterDirection.Output  
objCmd.Parameters.Add(New OracleParameter("o_votes", OracleDbType.Decimal, 10)).Direction = ParameterDirection.Output  
objCmd.Parameters.Add(New OracleParameter("o_percAll", OracleDbType.Double, 10)).Direction = ParameterDirection.Output  
orclCon.Open()  
Dim orclDtRdr As OracleDataReader = Nothing  
orclDtRdr = objCmd.ExecuteReader()  
gvCursor.DataSource() = orclDtRdr  
gvCursor.DataBind()  
orclDtRdr.Close()  
orclCon.Close()  

Сохраненный обработчик выбирает все данные из таблицы в базе данных, кроме одного значения, которое _o_percAll_. этот параметр рассчитывается в sp.

Спасибо, Eyad

Ответы [ 2 ]

1 голос
/ 06 августа 2010

Ваша хранимая процедура имеет четыре выходных параметра, которые являются ассоциативными массивами pl / sql (предположительно, хотя вы не показываете, как именно tblcandidate и т. Д. Определены в вашем примере кода).Итак, в вашем .Net-коде вы должны указать, что вы связываете четыре выходных параметра как ассоциативные массивы pl / sql, таким образом:

o_party.CollectionType = OracleCollectionType.PLSQLAssociativeArray

на.Для получения дополнительной информации см. Здесь:

Объект OracleCommand - детали привязки массива

1 голос
/ 06 августа 2010

Чтобы использовать ExecuteReader(), ваша хранимая процедура должна возвращать набор результатов. Кажется, ваша хранимая процедура этого не делает. Подумайте об этом, который возвращает набор результатов без использования выходных параметров:

CURSOR votes_cur is  
  SELECT sum(votes) from ELECTIONRESULTS  
  WHERE candidate !='Registered Voters'  
  AND office       = i_Office  
  AND Precinct    <> ' ';  

  totvotesall  NUMBER;  

  OPEN   votes_cur;  
  FETCH votes_curinto totvotesall;  
  CLOSE votes_cur;  

  SELECT distinct candidate, party,
    sum(votes) totalvotes,
    round((sum(votes)/totvotesall)*100,2) votesPerc
   FROM ELECTIONRESULTS  
   WHERE candidate not in ('Registered Voters' )  
   AND office = i_office  
   AND Precinct <> ' '  
   GROUP BY candidate,party  
   ORDER BY sum(votes) desc;  

Мои навыки PL / SQL далеко не соответствуют моим навыкам T-SQL, но я думаю, что это приблизит вас. Вы можете даже удалить курсор, например, так:

totvotesall  NUMBER;  

SELECT totvotesall = sum(votes)
FROM ELECTIONRESULTS  
WHERE candidate !='Registered Voters'  
AND office       = i_Office  
AND Precinct    <> ' ';  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...