Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Вернуть ROWID из хранимой процедуры  [new]
balykovdron
Member

Откуда:
Сообщений: 99
Я новичок в Oracle - помогите пожалуйста написать процедуру, которая возвращает ROWID новой записи.

Я пишу так:
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
25 янв 17, 14:13    [20144523]     Ответить | Цитировать Сообщить модератору
 Re: Вернуть ROWID из хранимой процедуры  [new]
AmKad
Member

Откуда:
Сообщений: 5222
balykovdron,

А что ты будешь делать в .NET делать с этим rowid?
25 янв 17, 14:14    [20144532]     Ответить | Цитировать Сообщить модератору
 Re: Вернуть ROWID из хранимой процедуры  [new]
Jebrail
Member

Откуда: Тбилиси
Сообщений: 328
Ну так покажи что на .нет пишешь , а лучше сразу в форум .нет .
25 янв 17, 14:17    [20144554]     Ответить | Цитировать Сообщить модератору
 Re: Вернуть ROWID из хранимой процедуры  [new]
balykovdron
Member

Откуда:
Сообщений: 99
AmKad,

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

При этом в таблицу нужно вставлять записи, выбирать по одной, удалять...
25 янв 17, 14:19    [20144558]     Ответить | Цитировать Сообщить модератору
 Re: Вернуть ROWID из хранимой процедуры  [new]
balykovdron
Member

Откуда:
Сообщений: 99
Jebrail
Ну так покажи что на .нет пишешь , а лучше сразу в форум .нет .


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

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"
25 янв 17, 14:22    [20144575]     Ответить | Цитировать Сообщить модератору
 Re: Вернуть ROWID из хранимой процедуры  [new]
AmKad
Member

Откуда:
Сообщений: 5222
balykovdron
Предполагаются гигантские объемы - и нужна быстрая вставка значений туда.
А построчная вставка - это действительно быстро?

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

И твой архитектор конечно же не опустился до того, чтобы не удосужился протестить производительность вставки в таблицу с PK из без такового.
25 янв 17, 14:28    [20144609]     Ответить | Цитировать Сообщить модератору
 Re: Вернуть ROWID из хранимой процедуры  [new]
balykovdron
Member

Откуда:
Сообщений: 99
AmKad,

Ребят, работаю с чем дали - помогите верно написать. Может как-то селектом его можно вернуть? Я не силен в Оракле - пока мне хотелось бы что-бы просто работало...
25 янв 17, 14:35    [20144650]     Ответить | Цитировать Сообщить модератору
 Re: Вернуть ROWID из хранимой процедуры  [new]
-2-
Member

Откуда:
Сообщений: 15330
balykovdron
нужно вставлять записи, выбирать по одной, удалять...
Ну ладно еще, что обновлять не требуется. А по поводу удаления, в твоем варианте можно обойтись и без rowid:
 delete from TP_EVENT where rownum=1;
25 янв 17, 14:39    [20144683]     Ответить | Цитировать Сообщить модератору
 Re: Вернуть ROWID из хранимой процедуры  [new]
balykovdron
Member

Откуда:
Сообщений: 99
 delete from TP_EVENT where rownum=1;
[/quot]

Он удалит - первую попавшуюся. А мне нужно удалить запись с нужным ROWID. Но пока не про это речь - нужно получить ROWID новой...
25 янв 17, 14:40    [20144700]     Ответить | Цитировать Сообщить модератору
 Re: Вернуть ROWID из хранимой процедуры  [new]
-2-
Member

Откуда:
Сообщений: 15330
balykovdron
Он удалит - первую попавшуюся. А мне нужно удалить запись с нужным ROWID.
В идеальном мире rowidов первая попавшаяся запись и есть нужная.
А в неидеальном - как, в отсутствие ключа, отличить одно от другого?
25 янв 17, 14:47    [20144755]     Ответить | Цитировать Сообщить модератору
 Re: Вернуть ROWID из хранимой процедуры  [new]
AmKad
Member

Откуда:
Сообщений: 5222
balykovdron
Она даже компилируется
Как же она у тебя компилится, если второй и третий параметр не разделены запятой?
25 янв 17, 14:47    [20144757]     Ответить | Цитировать Сообщить модератору
 Re: Вернуть ROWID из хранимой процедуры  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 63986
Блог
balykovdron
Архитекторы спроектировали таблицу где нет ни одного ключа - вообще. Предполагаются гигантские объемы - и нужна быстрая вставка значений туда. Поэтому ни индексов ни PK нет.

И при этом вставка планируется через ХП, которую Вы тут показали - угадал? Тогда правильная последовательность действий такая:

а) уволить архитекторов за полнейшую некомпетентность и нежелание читать хотя бы базовую документацию
б) найти хотя бы одного специалиста, который что-то в этом смыслит
в) слушаться и делать как он говорит.
25 янв 17, 14:48    [20144773]     Ответить | Цитировать Сообщить модератору
 Re: Вернуть ROWID из хранимой процедуры  [new]
Сергей Арсеньев
Member

Откуда:
Сообщений: 4118
сколько забавных ответов про смысл жизни и ни одного про
select ROWIDTOCHAR(CHARTOROWID('AAAFd1AAFAAAABSAA/')) from dual

хотя конечно штука опасная. Ибо IOT всякие и т.п.
25 янв 17, 15:06    [20144916]     Ответить | Цитировать Сообщить модератору
 Re: Вернуть ROWID из хранимой процедуры  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 63986
Блог
У чувака проблема - он не может открутить плоский болт крестовой отвёрткой. Давайте ему поможем, плевать, что рядом тихо плавится твэл в четвёртом энергоблоке
25 янв 17, 15:09    [20144939]     Ответить | Цитировать Сообщить модератору
 Re: Вернуть ROWID из хранимой процедуры  [new]
Сергей Арсеньев
Member

Откуда:
Сообщений: 4118
Ну от рядом плавящегося ничего не спасет, ни PK, ни ROW_SCN ...
25 янв 17, 15:12    [20144962]     Ответить | Цитировать Сообщить модератору
 Re: Вернуть ROWID из хранимой процедуры  [new]
-=APS=-
Member

Откуда: Киев
Сообщений: 737
balykovdron

А попробуй-ка параметр создать так:
var rowid = cmd.Parameters.Add(new OracleParameter("out_rowid", OracleDbType.Varchar2, ParameterDirection.Output) { Size = 100 });
25 янв 17, 15:30    [20145072]     Ответить | Цитировать Сообщить модератору
 Re: Вернуть ROWID из хранимой процедуры  [new]
pamibol
Member

Откуда:
Сообщений: 30
С .NET не работаю но для возврата ROWID обычно использую функцию


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;
/
25 янв 17, 17:48    [20145955]     Ответить | Цитировать Сообщить модератору
 Re: Вернуть ROWID из хранимой процедуры  [new]
AmKad
Member

Откуда:
Сообщений: 5222
pamibol
но для возврата ROWID обычно использую функцию
Вот! Это принципиально меняет дело!
25 янв 17, 17:52    [20145976]     Ответить | Цитировать Сообщить модератору
 Re: Вернуть ROWID из хранимой процедуры  [new]
balykovdron
Member

Откуда:
Сообщений: 99
[quot pamibol]С .NET не работаю но для возврата ROWID обычно использую функцию
Спасибо тебе, добрый человек!
26 янв 17, 11:09    [20148163]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить