Форум программистов, компьютерный форум, киберфорум
Наши страницы
C#: Базы данных, ADO.NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
Eugene_Ivash
0 / 0 / 0
Регистрация: 20.03.2014
Сообщений: 14
1

Как вернуть курсор в функции оракл и вызвать ее в C#, используя интерфейс OLEDB, можно ADO.NET

20.03.2014, 19:42. Просмотров 1116. Ответов 3
Метки нет (Все метки)

есть функция оракл, думаю она правильная:
Oracle 11 SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
CREATE OR REPLACE PACKAGE test_pkg1 
IS 
TYPE c1_ref_cursor IS REF CURSOR;
FUNCTION getc1(myinvar IN INTEGER) RETURN c1_ref_cursor;
END test_pkg1;
 
CREATE OR REPLACE PACKAGE BODY test_pkj1
IS FUNCTION getc1(myinvar IN INTEGER) RETURN c1_ref_cursor;
IS
myoutvar c1_ref_cursor;
BEGIN
OPEN myoutvar FOR SELECT c1 FROM testable WHERE c2 = myinvar;
RETURN myoutvar;
END;
END test_pkg1;
Код C#:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
private void button2_Click(object sender, EventArgs e)
        {
            try
            {
                String connetionString = "Provider=MSDAORA.1; Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=home)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=orcl)));"
       + "User Id=ieucore1;Password=123;";
                OleDbConnection con = new OleDbConnection(connetionString);
                OleDbCommand cmd = new OleDbCommand("test_pkg1.getc1", con);
                con.Open();
                cmd.CommandType = CommandType.StoredProcedure;
 
                OleDbParameter retval = new OleDbParameter("myoutvar", Oracle.ManagedDataAccess.Types.OracleRefCursor.Null);
                 retval.Direction = ParameterDirection.ReturnValue;
                 cmd.Parameters.Add(retval);
                
                OleDbParameter inval = new OleDbParameter("myinvar", OleDbType.Integer);
                inval.Direction = ParameterDirection.Input;
                inval.Value = 1;
                cmd.Parameters.Add(inval);
            
                cmd.ExecuteNonQuery();
          
                MessageBox.Show("value: " + retval.Value);
             
               
                con.Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show(" " + ex);
            }
        }
Возникает ошибка оракл при выполнении cmd.ExecuteNonQuery();
ORA-06550: expression is of wrong type
PL/SQL: Statement ignored
Помогите исправить код. Не могу понять как вызвать именно функции
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.03.2014, 19:42
Ответы с готовыми решениями:

Как вернуть курсор в функции оракл и вызвать ее в C#, используя интерфейс OLEDB
есть функция оракл, думаю она правильная: create or replace package test_pkg1 is type...

Можно ли подключиться одновременно к нескольким базам по ADO-OLEDB
Можно ли подключиться одновременно к нескольким базам сразу(*.dbf,*.xls,*.mdb)по ADO-OLEDB,...

Как можно вернуть из функции более 1 значения?
Matlab. Как можно вернуть из функции более 1 значения? Может как-нибудь типа указателя как это...

Полностью ли можно заменить ADO.NET на LINQ
Полностью ли можно заменить ADO.NET на LINQ ? Что потеряем ?

можно ли в с++ вызвать переменную из одной функции в другую т.е. мы переменну задали в одной функции а использовали в другой... и как это реализовать?
можно ли в с++ вызвать переменную из одной функции в другую т.е. мы переменну задали в одной...

3
pincet
1382 / 966 / 130
Регистрация: 23.07.2010
Сообщений: 5,226
21.03.2014, 15:34 2
Печаль в том, что функции не есть хранимки. Их нельзя exec (для Oracle не знаю, не работал). Их можно только в выражениях применять. Посему и
Цитата Сообщение от Eugene_Ivash Посмотреть сообщение
ORA-06550: expression is of wrong type
PL/SQL: Statement ignored
ошибка явно сервера.
0
Grossmeister
Модератор
3491 / 2529 / 440
Регистрация: 21.01.2011
Сообщений: 11,069
21.03.2014, 15:56 3
Цитата Сообщение от pincet Посмотреть сообщение
Печаль в том, что функции не есть хранимки
В терминологии Oracle и процедуры, и функции есть "хранимки".
Вызов в Oracle:
SQL
1
2
3
4
5
6
7
8
9
BEGIN
  proc1;
END;
 
DECLARE
  var1  NUMBER;
BEGIN
  var1:= func1;
END;
В данном случае ошибка именно из-за (некорректной) передачи курсора.
1
Eugene_Ivash
0 / 0 / 0
Регистрация: 20.03.2014
Сообщений: 14
21.03.2014, 21:19  [ТС] 4
Цитата Сообщение от Grossmeister Посмотреть сообщение
В терминологии Oracle и процедуры, и функции есть "хранимки".
Вызов в Oracle:
SQL
1
2
3
4
5
6
7
8
9
BEGIN
  proc1;
END;
 
DECLARE
  var1  NUMBER;
BEGIN
  var1:= func1;
END;
В данном случае ошибка именно из-за (некорректной) передачи курсора.
Расскажите тогда разницу между вызовом функции и процедуры? Процедура у меня работает, в ней можно на выход параметр передавать только через OUT-параметр. В процедуре же, через return курсор не получается сделать почему то. Пробовал еще через sys_refcursor, но тоже ошибки связанные с параметрами. Или вопрос еще, как кроме курсора можно вернуть несколько значений.
Например есть вот функция:
Oracle 11 SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
CREATE OR REPLACE FUNCTION myfunc(myinvar IN INTEGER) 
RETURN CHAR 
IS 
  TYPE testtable_type IS REF CURSOR RETURN testtable%ROWTYPE;
  xcurs testtable_type;
  rec_testtable testtable%ROWTYPE;
  val1 CHAR(20);
  val2 CHAR(5);
BEGIN
OPEN xcurs FOR SELECT * FROM ieucore1.testtable WHERE c2=myinvar;
  FETCH xcurs INTO rec_testtable;
  WHILE (xcurs%found)
  LOOP
  val1:= rec_testtable.c1; 
  val2:= rec_testtable.c2;
  FETCH xcurs INTO rec_testtable;
  END LOOP;
  CLOSE xcurs;
  RETURN val2 || val1;
END;
В переменную заталкивать данные это ведь не по феншую... Думаю курсор единственный способ. И вот основная проблема, в которой хотелось бы получить помощь. Покажите рабочий пример курсора, возвращенного через return в OLEDB. Заранее спасибо тем у кого еще будут мысли какие то.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.03.2014, 21:19

Как вернуть курсор
Я поменяла обычный курсор в программе курсором .ani через Screen.Cursors. Как мне вернуть...

Программа для работы с БД, используя ADO.NET ( сервер БД - MS SQL Server), открывать через браузер
Помогите разобраться, я не могу понять как программа должна открываться через браузер ( программа...

Можно ли определить, находится ли курсор в окне GraphABC в PascalABC.net?
Хотел написать следующее за курсором окно, но столкнулся с такой проблемой-как определить,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru