Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Как генерировать последовательные числа? (типа счетчика в Access, нужно для Oracle) / 9 сообщений из 9, страница 1 из 1
29.08.2005, 16:54:25
    #33239404
Kroket
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как генерировать последовательные числа? (типа счетчика в Access, нужно для Oracle)
Добрый день!
БД и приложение переводим из Access в Oracle.
В Access есть тип данных счетчик, а в Oracle нет. На форуме Oracle дают советы использовать для этого тригерры, в которых всю эту бодягу писать для каждой таблицы. Но что-то не очень хочется огород городить.
Как-то давно сталкивался с описанием (где не помню) о функции, которая генерит уникальные номера в зависимости от системной даты, времени и вероятность выдачи одного и того же числа очень низка.
Никто не в курсе этого или может есть еще какой-то вариант?
...
Рейтинг: 0 / 0
29.08.2005, 17:16:56
    #33239483
LeonM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как генерировать последовательные числа? (типа счетчика в Access, нужно для Oracle)
Если не обяательно целое число, то
Код: plaintext
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.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
'LbUuid

Private Type Uuid
    data1 As Long
    data2 As Integer
    data3 As Integer
    data4( 7 ) As Byte
End Type

Private Declare Function CoCreateGuid Lib "ole32" (ByVal pg As Long) As Long
Private Declare Function UuidToString Lib "Rpcrt4" Alias "UuidToStringA" (ByVal pg As Long, ps As Long) As Long
Private Declare Function RpcStringFree Lib "Rpcrt4" Alias "RpcStringFreeA" (ps As Long) As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (ByVal tgt As Long, ByVal src As Long, ByVal size As Long)

Private m_u As Uuid

Private Function Generate() As Boolean
    Generate = CoCreateGuid(VarPtr(m_u)) =  0 
End Function

Public Function Guid() As String
    Dim i As Integer
    Guid = ""
    If Generate() Then
        Guid = "{" & Hex(m_u.data1) & "-" & Hex(m_u.data2) & "-" & Hex(m_u.data3) & "-"
        For i =  0  To  7 
            Guid = Guid & Hex(m_u.data4(i))
        Next i
        Guid = Guid & "}"
    End If
End Function

Private Function StringToGuid(ByVal str As String) As Uuid
    Dim d( 2 ) As Integer, s As String, l As Long, i As Integer, g As Uuid
    On Error GoTo wrong
    StringToGuid.data1 =  0 
    StringToGuid.data2 =  0 
    StringToGuid.data3 =  0 
    For i =  0  To  7 
        StringToGuid.data4(i) =  0 
    Next i
    i =  0 
    l =  0 
    For i =  1  To Len(str)
        If Mid(str, i,  1 ) = "-" Then
            d(l) = i
            l = l +  1 
        End If
    Next i
    s = "&H" & Mid(str,  2 , d( 0 ) -  2 )
    g.data1 = CLng(s)
    s = "&H" & Mid(str, d( 0 ) +  1 , d( 1 ) - d( 0 ) -  1 )
    g.data2 = CInt(s)
    s = "&H" & Mid(str, d( 1 ) +  1 , d( 2 ) - d( 1 ) -  1 )
    g.data3 = CInt(s)
    For i =  0  To  7 
        s = "&H" & Mid(str, d( 2 ) +  1  + i *  2 ,  2 )
        g.data4(i) = CByte(s)
    Next i
    StringToGuid = g
wrong:
End Function
...
Рейтинг: 0 / 0
29.08.2005, 17:23:16
    #33239502
Melkiades
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как генерировать последовательные числа? (типа счетчика в Access, нужно для Oracle)
Ну и к чему огород городить? Есть же стандартная.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
Private Declare Function CoCreateGuid Lib "ole32" (id As Any) As Long
Private Sub Form_Load()
    MsgBox "Generated GUID: " + CreateGUID
End Sub
Public Function CreateGUID() As String
    Dim id( 0  To  15 ) As Byte
    Dim Cnt As Long, GUID As String
    If CoCreateGuid(id( 0 )) =  0  Then
        For Cnt =  0  To  15 
            CreateGUID = CreateGUID + IIf(id(Cnt) <  16 , "0", "") + Hex$(id(Cnt))
        Next Cnt
        CreateGUID = Left$(CreateGUID,  8 ) + "-" + Mid$(CreateGUID,  9 ,  4 ) + "-" + Mid$(CreateGUID,  13 ,  4 ) + "-" + Mid$(CreateGUID,  17 ,  4 ) + "-" + Right$(CreateGUID,  12 )
    Else
        MsgBox "Error while creating GUID!"
    End If
End Function
...
Рейтинг: 0 / 0
29.08.2005, 17:34:05
    #33239537
Kroket
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как генерировать последовательные числа? (типа счетчика в Access, нужно для Oracle)
Всем спасибо большое.
И вопрос насчет стандартной функции, а она всегда уникальные числа генерит или с какой степенью вероятности? И эти числа целые?
И что это за:
MsgBox "Error while creating GUID!" это в каких случаях ошибка выскакивает?
...
Рейтинг: 0 / 0
29.08.2005, 17:39:09
    #33239560
Melkiades
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как генерировать последовательные числа? (типа счетчика в Access, нужно для Oracle)
KroketВсем спасибо большое.
И вопрос насчет стандартной функции, а она всегда уникальные числа генерит или с какой степенью вероятности? И эти числа целые?

C очень большой. Майкрософт сама ей пользуется. Вот только целые числа сгенерировать уникальными невозможно, имхо (если автоинкремент не использовать). Поэтому - не целые.
Kroket
И что это за:
MsgBox "Error while creating GUID!" это в каких случаях ошибка выскакивает?
Если функция CoCreateGuid ничего не сгенерировала
...
Рейтинг: 0 / 0
29.08.2005, 17:49:00
    #33239591
Kroket
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как генерировать последовательные числа? (типа счетчика в Access, нужно для Oracle)
ясно, спасибо
...
Рейтинг: 0 / 0
29.08.2005, 17:54:54
    #33239613
Как генерировать последовательные числа? (типа счетчика в Access, нужно для Oracle)
Код: plaintext
 Поэтому - не целые.
целые-целые. даже не сомневайся. тока 128-битные
...
Рейтинг: 0 / 0
01.09.2005, 09:40:32
    #33244975
Worobjoff
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как генерировать последовательные числа? (типа счетчика в Access, нужно для Oracle)
А почему нельзя использовать объект SEQUENCE оракла?
Это - стандартная оракловая альтернатива счетчикам других СУБД.
Можно читать следующее значение перед вставкой записи в БД.
Код: plaintext
1.
2.
3.
4.
5.
   If rsSEQ.State = adStateOpen Then rsSEQ.Close
   rsSEQ.Open "SELECT МояСХЕМА.SEQ_ПКМоейТабилицы.NEXTVAL FROM DUAL" _
         , Conn1, adOpenForwardOnly, adLockReadOnly, adCmdText
   m_NextID = rsSEQ( 0 )
   rsSEQ.Close
   'Используем m_ID для вновь добавляемой записи
Можно прочитать только что вставленное занчение триггером (который естественно использует SEQUENCE)
Код: plaintext
1.
2.
3.
4.
5.
   If rsSEQ.State = adStateOpen Then rsSEQ.Close
   rsSEQ.Open "SELECT МояСХЕМА.SEQ_ПКМоейТабилицы.CURRVAL FROM DUAL" _
         , Conn1, adOpenForwardOnly, adLockReadOnly, adCmdText
   m_CurrID = rsSEQ( 0 )
   rsSEQ.Close
   'Используем m_ID например для определения значения внешнего ключа
...
Рейтинг: 0 / 0
02.09.2005, 18:45:45
    #33249345
Ander Borisov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как генерировать последовательные числа? (типа счетчика в Access, нужно для Oracle)
WorobjoffА почему нельзя использовать объект SEQUENCE оракла?

Послностью согласен. Только при CREATE SEQUENCE установить необходимое начальное значение.
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Как генерировать последовательные числа? (типа счетчика в Access, нужно для Oracle) / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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