Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Вернуть ROWID из хранимой процедуры / 19 сообщений из 19, страница 1 из 1
25.01.2017, 14:13
    #39391137
balykovdron
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вернуть ROWID из хранимой процедуры
Я новичок в Oracle - помогите пожалуйста написать процедуру, которая возвращает ROWID новой записи.

Я пишу так:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
CREATE OR REPLACE PROCEDURE TP_EVENT_ADD(in_ProcessSourceId NUMBER, in_ProcessId NUMBER
    out_rowid OUT ROWID) 
IS
BEGIN

INSERT INTO TP_EVENT E
   (PROCESSSOURCEID, PROCESSID)
 VALUES
   (in_ProcessSourceId, in_ProcessId)
 RETURNING E.ROWID INTO out_rowid;
 
END TP_EVENT_ADD;
/



Она даже компилируется, но из .NET я никак не могу получить значение параметра out_rowid
...
Рейтинг: 0 / 0
25.01.2017, 14:14
    #39391140
AmKad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вернуть ROWID из хранимой процедуры
balykovdron,

А что ты будешь делать в .NET делать с этим rowid?
...
Рейтинг: 0 / 0
25.01.2017, 14:17
    #39391145
Jebrail
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вернуть ROWID из хранимой процедуры
Ну так покажи что на .нет пишешь , а лучше сразу в форум .нет .
...
Рейтинг: 0 / 0
25.01.2017, 14:19
    #39391147
balykovdron
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вернуть ROWID из хранимой процедуры
AmKad,

Он мне нужен, чтобы потом удалять эту запись по ROWID. Даже не спрашивайте почему нельзя использовать PK.
Архитекторы спроектировали таблицу где нет ни одного ключа - вообще. Предполагаются гигантские объемы - и нужна быстрая вставка значений туда. Поэтому ни индексов ни PK нет.

При этом в таблицу нужно вставлять записи, выбирать по одной, удалять...
...
Рейтинг: 0 / 0
25.01.2017, 14:22
    #39391152
balykovdron
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вернуть ROWID из хранимой процедуры
JebrailНу так покажи что на .нет пишешь , а лучше сразу в форум .нет .

С .NET, думаю, у меня нет проблем - чую проблема в Оракле - что-то я делаю не так... Но если интересно - то вот

Код: 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.
public new T Add(T entity)
        {
            var ret = entity;
            using (var cn = this.ConnectionProvider.GetConnection())
            {
                var cmd = cn.CreateCommand();
                cmd.CommandText = string.Concat(this.GetTableName(), "_ADD");
                cmd.CommandType = CommandType.StoredProcedure;
                this.SetAddParameters(cmd, entity);
                var rowid = cmd.Parameters.Add("out_rowid", OracleDbType.Varchar2, ParameterDirection.Output);

                cn.Open();

                var rdr = cmd.ExecuteNonQuery();

                if (rowid.Value == DBNull.Value)
                    return default(T);
                else
                {
                    ret.RowId = (string) rowid.Value;
                }
            }

            return ret;
        }



Я уже пробовал и ExecuteReader и ExecuteScalar...

Отвечает ошибкой "Oracle.ManagedDataAccess.Client.OracleException : ORA-06502: PL/SQL: ошибка числа или значения
ORA-06512: на "TP_EVENT_ADD", line 9
ORA-06512: на line 1"
...
Рейтинг: 0 / 0
25.01.2017, 14:28
    #39391159
AmKad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вернуть ROWID из хранимой процедуры
balykovdronПредполагаются гигантские объемы - и нужна быстрая вставка значений туда.А построчная вставка - это действительно быстро?

balykovdronПри этом в таблицу нужно вставлять записи, выбирать по одной, удалять...Ну тогда и удалять надо быстро-быстро, пока rowid у записи не сменился.

И твой архитектор конечно же не опустился до того, чтобы не удосужился протестить производительность вставки в таблицу с PK из без такового.
...
Рейтинг: 0 / 0
25.01.2017, 14:35
    #39391168
balykovdron
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вернуть ROWID из хранимой процедуры
AmKad,

Ребят, работаю с чем дали - помогите верно написать. Может как-то селектом его можно вернуть? Я не силен в Оракле - пока мне хотелось бы что-бы просто работало...
...
Рейтинг: 0 / 0
25.01.2017, 14:39
    #39391174
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вернуть ROWID из хранимой процедуры
balykovdronнужно вставлять записи, выбирать по одной, удалять...Ну ладно еще, что обновлять не требуется. А по поводу удаления, в твоем варианте можно обойтись и без rowid:
Код: plsql
1.
 delete from TP_EVENT where rownum=1;
...
Рейтинг: 0 / 0
25.01.2017, 14:40
    #39391177
balykovdron
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вернуть ROWID из хранимой процедуры
Код: plsql
1.
 delete from TP_EVENT where rownum=1;

[/quot]

Он удалит - первую попавшуюся. А мне нужно удалить запись с нужным ROWID. Но пока не про это речь - нужно получить ROWID новой...
...
Рейтинг: 0 / 0
25.01.2017, 14:47
    #39391182
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вернуть ROWID из хранимой процедуры
balykovdronОн удалит - первую попавшуюся. А мне нужно удалить запись с нужным ROWID.В идеальном мире rowidов первая попавшаяся запись и есть нужная.
А в неидеальном - как, в отсутствие ключа, отличить одно от другого?
...
Рейтинг: 0 / 0
25.01.2017, 14:47
    #39391183
AmKad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вернуть ROWID из хранимой процедуры
balykovdronОна даже компилируетсяКак же она у тебя компилится, если второй и третий параметр не разделены запятой?
...
Рейтинг: 0 / 0
25.01.2017, 14:48
    #39391185
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вернуть ROWID из хранимой процедуры
balykovdronАрхитекторы спроектировали таблицу где нет ни одного ключа - вообще. Предполагаются гигантские объемы - и нужна быстрая вставка значений туда. Поэтому ни индексов ни PK нет.
И при этом вставка планируется через ХП, которую Вы тут показали - угадал? Тогда правильная последовательность действий такая:

а) уволить архитекторов за полнейшую некомпетентность и нежелание читать хотя бы базовую документацию
б) найти хотя бы одного специалиста, который что-то в этом смыслит
в) слушаться и делать как он говорит.
...
Рейтинг: 0 / 0
25.01.2017, 15:06
    #39391222
Сергей Арсеньев
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вернуть ROWID из хранимой процедуры
сколько забавных ответов про смысл жизни и ни одного про
Код: plsql
1.
select ROWIDTOCHAR(CHARTOROWID('AAAFd1AAFAAAABSAA/')) from dual


хотя конечно штука опасная. Ибо IOT всякие и т.п.
...
Рейтинг: 0 / 0
25.01.2017, 15:09
    #39391227
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вернуть ROWID из хранимой процедуры
У чувака проблема - он не может открутить плоский болт крестовой отвёрткой. Давайте ему поможем, плевать, что рядом тихо плавится твэл в четвёртом энергоблоке
...
Рейтинг: 0 / 0
25.01.2017, 15:12
    #39391233
Сергей Арсеньев
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вернуть ROWID из хранимой процедуры
Ну от рядом плавящегося ничего не спасет, ни PK, ни ROW_SCN ...
...
Рейтинг: 0 / 0
25.01.2017, 15:30
    #39391249
-=APS=-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вернуть ROWID из хранимой процедуры
balykovdron

А попробуй-ка параметр создать так:
Код: c#
1.
var rowid = cmd.Parameters.Add(new OracleParameter("out_rowid", OracleDbType.Varchar2, ParameterDirection.Output) { Size = 100 });
...
Рейтинг: 0 / 0
25.01.2017, 17:48
    #39391407
pamibol
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вернуть ROWID из хранимой процедуры
С .NET не работаю но для возврата ROWID обычно использую функцию


Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
CREATE OR REPLACE FUNCTION TP_EVENT_ADD(in_ProcessSourceId NUMBER, in_ProcessId NUMBER) 
RETURN VARCHAR2
IS
S VARCHAR2(100);
BEGIN

INSERT INTO TP_EVENT E
   (PROCESSSOURCEID, PROCESSID)
 VALUES
   (in_ProcessSourceId, in_ProcessId)
 RETURNING E.ROWID INTO S;
 
 RETURN(S);
 
END;
/
...
Рейтинг: 0 / 0
25.01.2017, 17:52
    #39391411
AmKad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вернуть ROWID из хранимой процедуры
pamibolно для возврата ROWID обычно использую функциюВот! Это принципиально меняет дело!
...
Рейтинг: 0 / 0
26.01.2017, 11:09
    #39391882
balykovdron
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вернуть ROWID из хранимой процедуры
[quot pamibol]С .NET не работаю но для возврата ROWID обычно использую функцию
Спасибо тебе, добрый человек!
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Вернуть ROWID из хранимой процедуры / 19 сообщений из 19, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]