powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Листинги моих служебных view, UDF и SP под ASA 8 (может кому пригодиться)
6 сообщений из 6, страница 1 из 1
Листинги моих служебных view, UDF и SP под ASA 8 (может кому пригодиться)
    #32214937
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Собрать дату из частей. Требуется функция fn_NumToStr.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
create function fn_BuildDate (
  @Year smallint, 
  @Month tinyint, 
  @Day tinyint
)
returns date
begin
  declare @D smalldatetime;
  set @D = convert(date, convert(char( 4 ), @Year) + fn_NumToStr(@Month,  2 , '0') + fn_NumToStr(@Day,  2 , '0'),  112 );
  return @D;
end


Сбрасывает на первый или последний в месяце день указанную дату
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
create function fn_CDate
 (@Date date,
  @LastDay tinyint)
returns date
begin
  if (@LastDay =  0 ) then
    return convert(date, convert(char( 6 ), @Date,  112 ) + '01',  112 );
  end if;

  return DateAdd(dd, - 1 , convert(date, convert(char( 6 ), DateAdd(mm,  1 , @Date),  112 ) + '01',  112 ));
end


Заменяет часть(и) даты. Требуется функция fn_NumToStr.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
create function fn_ChangeDate
 (@Date smalldatetime,
  @Day tinyint,
  @Month tinyint,
  @Year smallint)
returns date
begin
  declare @Y smallint;
  declare @M tinyint;
  declare @D tinyint;

  set @Y = IsNull(@Year, Year(@Date));
  set @M = IsNull(@Month, Month(@Date));
  set @D = IsNull(@Day, Day(@Date));

  return Convert(date, Convert(varchar( 4 ), @Y) + fn_NumToStr(@M,  2 , '0') + fn_NumToStr(@D,  2 , '0'),  112 );
end


Преобразовать переданную строку к прописному регистру с заглавной первой буквой
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
create function fn_ConvertWord (
  @Value varchar( 512 )
)
returns 
  varchar( 512 )
begin
  if @Value is null then
    return null
  end if;

  if Length(@Value) <  2  then
    return Upper(Left(@Value,  1 ));
  end if;

  return Upper(Left(@Value,  1 )) + Lower(Right(@Value, Length(@Value) -  1 ));
end


Конвертирует дату в начальную дату года
Код: plaintext
1.
2.
3.
4.
5.
6.
create function fn_FirstDateYear
 (@Value date)
returns date
begin
  return convert(date, convert(varchar( 4 ), Year(@Value)) + '0101',  112 );
end


Проверка на отсутствие других подключений к БД (1-да/0-нет)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
create function fn_IsExclusiveMode ()
returns tinyint
begin
  declare @ConnID int;

  set @ConnID = Next_Connection(@ConnID, null);
  list_conn: loop
    if @ConnID is null then
      leave list_conn;
    end if;

    if @ConnID <> @@SPID then
      return  0 ;
    end if;

    set @ConnID = Next_Connection(@ConnID, null);
  end loop list_conn;

  return  1 ;
end


Конвертирует дату в последнюю дату года
Код: plaintext
1.
2.
3.
4.
5.
6.
create function fn_LastDateYear
 (@Value date)
returns date
begin
  return convert(date, convert(varchar( 4 ), Year(@Value)) + '1231',  112 );
end


Преобразует целое число в строку с заданной длиной и заполнителем справа
Код: plaintext
1.
2.
3.
4.
5.
6.
create function fn_NumToStr
 (@Value int, @Scale int, @FillChar char( 1 )) 
returns varchar( 20 )
begin
  return Right(Replicate(@FillChar,  20 ) + convert(varchar( 20 ), @Value), @Scale);
end


Поиск части текста в исходниках вьюверов, триггеров, функций и процедур.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
create procedure sp_ScriptFindText (
in @Text varchar( 250 )
)
begin
  set @Text = Upper(@Text);

  select TypeObject, Name
  from (
    select ViewName as Name, 'View' as TypeObject
    from SysViews
    where VCreator = User_Name() and CharIndex(@Text, Upper(ViewText)) >  0 
    union all
    select TName as Name, 'Trigger' as TypeObject
    from SysTriggers
    where Owner = User_Name() and CharIndex(@Text, Upper(TrigDefn)) >  0 
    union all
    select Proc_Name as Name, 'Procedure' as TypeObject
    from SysProcedure
    where Creator = User_id() and CharIndex(@Text, Upper(Proc_Defn)) >  0 
    ) as x
  order by TypeObject, Name;
end


Проверка работоспособности всех вьюверов БД
Код: 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.
create procedure sp_valid_view ()
begin
  declare @Name varchar( 50 );
  declare @Count int;

  declare err_notfound exception for sqlstate '02000';

  declare cViewList no scroll cursor for
    select ViewName
    from SysViews
    where VCreator = User_Name();

  open cViewList;

  ViewLoop: 
  loop
    fetch next cViewList into @Name;

    if sqlstate = err_notfound then
      leave ViewLoop;
    end if;


    print @Name;
    execute immediate 'select count(*) into @Count from "' + @Name + '"';
    print convert(varchar( 20 ), @Count) + ' records';
    print '---';
    print ' ';
  end loop ViewLoop;

  close cViewList;
  deallocate cViewList;
end


Возвращает все обьекты БД по их типам
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
create view v_SysObjects
as
  select Table_Name as Name, 'Table' as Type
  from SysTable
  where Creator = user_id() and Table_Type = 'BASE'
  union all
  select ViewName as Name, 'View' as Type
  from SysViews
  where VCreator = User_Name()
  union all
  select TName as Name, 'Trigger' as Type
  from SysTriggers
  where Owner = User_Name()
  union all
  select Proc_Name as Name, 'Procedure' as Type
  from SysProcedure
  where Creator = User_id()



Вроде пока все. Появится что еще, сюда довыложу :)
...
Рейтинг: 0 / 0
Листинги моих служебных view, UDF и SP под ASA 8 (может кому пригодиться)
    #32216780
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вьювер, возвращающий зависимости между таблицами Dependenced, вычисляемых по Foreign Key (для корректной работы нужно логиниться под владельцем БД):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
create view SysDependences
as
  select sf.Primary_Table_id, o1.Table_Name as Primary_Name, sf.Foreign_Table_id, o2.Table_Name as Foreign_Name
  from (
      select distinct Primary_Table_id, Foreign_Table_id
      from SysForeignKey) as sf
    inner join SysTable o1 on o1.Table_id = sf.Primary_Table_id and
                              o1.Creator = User_id()
    inner join SysTable o2 on o2.Table_id = sf.Foreign_Table_id and
                              o2.Creator = User_id()



На подходе ХП, возвращающая таблицы в порядке их возрастания в иеархии зависимостей.
...
Рейтинг: 0 / 0
Листинги моих служебных view, UDF и SP под ASA 8 (может кому пригодиться)
    #32218349
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Возвращает список таблиц БД в порядке их зависимостей между собой.
Код: 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.
63.
create procedure sp_GetTables (
   -- если NULL - то вернуть данные, 
 
   -- иначе засунуть их в указанную таблицу 
 
   -- (порядок следования полей должен совпадать)
 
  in @TableName varchar( 150 ) default null
)
begin
  declare local temporary table #GetTables_List (
     -- Порядковый номер в списке
 
    Number int identity not null primary key,

     -- Уровень в иеархии вложенности зависимостей 
 
    Level tinyint not null,

     -- ID таблицы
 
    Table_id int
  );

  declare @Level tinyint;
  set @Level =  0 ;

  while exists(
          select *
          from SysTable t
          where Creator = User_id() and
                Table_Type = 'BASE' and
                Table_id not in (select Table_id from #GetTables_List) )
  loop
    set @Level = @Level +  1 ;

    insert into #GetTables_List (Level, Table_id)
      select @Level, Table_id
      from SysTable t
      where Creator = User_id() and
            Table_Type = 'BASE' and
            Table_id not in (
              select Table_id 
              from #GetTables_List) and
            Table_id not in (
              select Foreign_Table_id
              from SysForeignKey
              where Primary_Table_id not in (select Table_id from #GetTables_List) );
  end loop;

  if @TableName is null then
    select l.*, t.Table_Name
    from #GetTables_List l
      inner join SysTable t on t.Table_id = l.Table_id
    order by Number;
  else
    begin
      declare @Script varchar( 500 );
      set @Script = 'insert into ' + @TableName + ' select * from #GetTables_List';
      execute immediate @Script;
    end;
  end if;
end


Примеры использования:

Вернуть список таблиц в виде набора данных
Код: plaintext
call sp_asc_GetTables ();


Получить список в указанную таблицу:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
begin
  declare local temporary table #Tables (
    Num int not null primary key,
    Lev tinyint not null,
    Tab_id int not null);

  call sp_asc_GetTables ('#Tables');

  select l.*, t.Table_Name
  from #Tables l
    inner join SysTable t on t.Table_id = l.Tab_id;
end


Думаю раз эту ХП сюда перевел, следом выложу скрипт быстрого обнуления всей БД :)
...
Рейтинг: 0 / 0
Листинги моих служебных view, UDF и SP под ASA 8 (может кому пригодиться)
    #32222106
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Полная очистка данных базы данных. Требует наличия моей процедуры sp_GetTables и логина владельца БД.

ОСТОРОЖНО - эта ХП действительно гарантированно чистит данных всех таблиц базы данных, не взирая на тригеры и связи между таблицами. Так что лучше на рабочей БД с ней не экспериментировать, иначе все закончится печально !!!

Код: 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.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
create procedure sp_ClearDataBase (
 /*
  Внимание - транзакцию должен самостоятельно  организовывать
  вызывающий источник (или не организовывать, если это не требуется).
*/ 

   -- Флаг отключения тригеров во время работы (0-не выключать, 1-выключать)
 
  in @DisableTriggers tinyint default  1 ,

   -- Имя таблицы, содержащей список таблиц, не подлежащих обработке (должно быть поле Table_id)
 
  in @TableName varchar( 150 ) default null,

   -- Флаг разрешения трассировки хода выполнения процедуры (0-выкл, 1-вкл)
 
  in @IsDebug tinyint default  1 
)
begin
   -- Значение опции работы тригеров
 
  declare @Opt_Fire_Triggers varchar( 3 );

   -- Список таблиц
 
  declare local temporary table #Tables (
     -- Порядковый номер в списке
 
    Number int not null primary key,

     -- Уровень в иеархии вложенности зависимостей 
 
    Level tinyint not null,

     -- ID таблицы
 
    Table_id int
  );

   -- Курсор для обработки списка таблиц
 
  declare cTables no scroll cursor for
    select t.Table_Name
    from #Tables l
      inner join SysTable t on t.Table_id = l.Table_id
    order by l.Number desc;

   -- Обрабатываем ситуацию отключения тригеров
 
  if @DisableTriggers =  1  then
     -- Получаем значение установленной опции работы тригеров
 
    set @Opt_Fire_Triggers = Connection_Property('FIRE_TRIGGERS');

     -- Если опция включена, то выключаем ее
 
    if @Opt_Fire_Triggers = 'On' then
      set temporary option FIRE_TRIGGERS = 'OFF';
    end if;
  end if;

   -- Получаем список таблиц
 
  call sp_GetTables ('#Tables');

   -- Удаляем со списка не подлежащие обработке таблицы,
 
   -- в случае если указана таблица, содержащая их список
 
  if @TableName is not null then
    execute immediate 'delete from #Tables where Table_id in (select Table_id from ' + @TableName + ' )';
  end if;

   -- Организуем движение по списку таблиц
 
  open cTables;

  if @IsDebug =  1  then
    print 'Proccess tables ...';
    print '-------';
  end if;

  lp: loop
    fetch next cTables into @TableName;

     -- Если список закончился, то выходим из цикла
 
    if SQLCode <>  0  then
      leave lp;
    end if;

    if @IsDebug =  1  then
      print @TableName;
    end if;

     -- Очищаем таблицу
 
    execute immediate 'delete from ' + @TableName;
  end loop;

  close cTables;

   -- Обрабатываем ситуацию отключения тригеров
 
  if @DisableTriggers =  1  and @Opt_Fire_Triggers = 'On' then
    set temporary option FIRE_TRIGGERS = 'On';
  end if;

  if @IsDebug =  1  then
    print '-------';
    print 'Proccess complete';
    print convert(varchar( 10 ), (select count(Number) from #Tables)) + ' tables clearing';
  end if;

  return;

 -- Обрабатываем ситуацию возникновения ошибок
 
exception
  when others then
     -- Обрабатываем ситуацию отключения тригеров
 
    if @DisableTriggers =  1  and @Opt_Fire_Triggers = 'On' then
      set temporary option FIRE_TRIGGERS = 'On';
    end if;

    resignal;
end


Пока все. В далеком будующем возможно перекатаю на ASA свою процедуру перегонки данных с одной БД в другую с отличиями в структуре. А может и не буду, пока еще не решил, нужно это или нет :)
...
Рейтинг: 0 / 0
Листинги моих служебных view, UDF и SP под ASA 8 (может кому пригодиться)
    #32311890
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Решил пополнить коллекцию скриптов уже под ASA 9. Приведенные выше старые работать будут, если в ниже приводимых скриптах такие же названия обьектов, значит это замена обьектов.

Для начала тем, кому хочется, чтобы Sybase Central под Windows чуть побыстрее работал и поддерживал интерфейс аля XP:
1. Заходим на раздел download Sun . Там с Download J2SE v 1.4.2_02 - Windows installation offline качаем инсталяцию JRE ( SDK можно не качать ) - весит порядка 16 метров.
2. Выгружаем Sybase Central и ISQL ( не забудьте, что если у них в опциях разрешена опция Fast Launcher , то они в памяти по любому висят и необходимо убить все процессы scjview.exe и dbisqlg.exe ).
2. Запускаем скаченный инсталл Java, инсталлируем.
3. Переименовываем папку Program Files\Sybase\Shared\Sun\jre141 , чтобы осталась старая версия Java под Central на всякий пожарный.
4. Берем папку Program Files\Java\j2re1.4.2_02 - там лежит новая Java и все что в ней есть копируем в созданную Вами папку Program Files\Sybase\Shared\Sun\jre141 .
5. Запускаем Central , все должно работать.

Теперь очередная серия системных скриптов:
Код: 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.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
 -- Возвращает 0, если таблица полная и 1, если она пустая
 
CREATE FUNCTION fn_asc_IsEmptyTable (
  @TableName varchar( 128 )
)
returns tinyint
not deterministic
begin
  declare @TestTable tinyint;
  execute immediate 
    'select if exists ( select * from "' + 
    @TableName + '" ) then 0 else 1 endif into @TestTable';

  return @TestTable;
end;

 -- Возвращает список таблиц БД, 
 
 -- построенных в виде иеархии зависимости по связям
 
CREATE PROCEDURE sp_asc_get_Tables ()
begin
  declare local temporary table #GetTables_List (
     -- Порядковый номер в списке
 
    Number int identity not null primary key,

     -- Уровень в иеархии вложенности зависимостей 
 
    Level smallint not null,

     -- ID таблицы
 
    Table_id int
  ) not transactional;

  declare @Level smallint;
  set @Level =  0 ;

  Tables: loop
    set @Level = @Level +  1 ;

    insert into #GetTables_List (Level, Table_id)
      select @Level, Table_id
      from SysTable t
      where Creator = User_id() and
            Table_Type = 'BASE' and
            Existing_Obj is null and
            Table_id not in (
              select Table_id 
              from #GetTables_List) and
            Table_id not in (
              select Foreign_Table_id
              from SysForeignKey
              where Primary_Table_id <> t.Table_id and
                    Primary_Table_id not in (select Table_id from #GetTables_List) );

    if @@RowCount =  0 
    then
      leave Tables;
    end if;
  end loop;

  select l.*, t.Table_Name
  from #GetTables_List l
    inner join SysTable t on t.Table_id = l.Table_id
  order by Number;
end

 -- Миграция данных с БД аналогичной структуры 
 
 -- подключенного удаленного сервера
 
 /*
 В кач-ве ограничений действия данной ХП:
1. не переносяться значения колонкок удаленного сервера, 
   которые ASA определяет как binary (тот же timestamp MSSQL)
2. подразумевается, что все имена таблиц и полей удаленного сервера
   в культурном формате (своими глазами видел в MSSQL следующее
   название поля - "Аттрибуты# Отдел," !!! )
3. подразумевается, что данной штукой можно быстро переносить БД малого
   и среднего обьема. Думаю не стоит обьяснять, как будет печально и долго
   выглядеть попытка выполнения команды insert с таблицы, содержащей
   миллионы записей
4. на данный момент процедура пытается перенести данные всех таблиц, 
   указать какие не переносить нельзя.

Ограничения 1 и 4 в скором времени сниму, ограничения 2 и 3 естественно остануться по любому.
*/ 
CREATE PROCEDURE sp_asc_migrate (
   -- Имя подключенного удаленного сервера
 
  in  @ServerName varchar(  50  ),

   -- Имя базы данных
 
  in  @DataBaseName varchar(  50  ),

   -- Имя владельца обьектов
 
  in  @OwnerName varchar(  50  ),

   -- если 1, то данные в не пустые таблицы не переносяться
 
  in  @SkipNotEmptyTable tinyint default  1 
)
begin
   -- Конец курсора
 
  declare err_NotFound exception for sqlstate '02000';

   -- Значение опции работы тригеров
 
  declare @Opt_Fire_Triggers varchar( 3 );

  declare cTables no scroll cursor for
    select Number, Table_Name
    from sp_asc_get_Tables()
    order by Number;

  declare @Number int;
  declare @TableName varchar(  128  );
  declare @RemoteTableName varchar(  128  );
  declare @Columns varchar(  10000  );

   -- Получаем значение установленной опции работы тригеров
 
  set @Opt_Fire_Triggers = Connection_Property('FIRE_TRIGGERS');

   -- Если опция включена, то выключаем ее
 
  if @Opt_Fire_Triggers = 'On' then
    set temporary option FIRE_TRIGGERS = 'OFF';
  end if;

  print 'Start migration';

   -- Получаем список таблиц в порядке их взаимосвязей
 
  select *
  from sp_asc_Get_Tables()
  order by Number;

  open cTables;

   -- Пошел перебор таблиц курсором
 
  TablesLoop:
  loop
     -- Получили имя таблицы
 
    fetch next cTables into @Number, @TableName;

    if SQLState = err_NotFound 
    then
      leave TablesLoop;
    end if;

     -- Копируем данные в таблицу,
 
     -- если стоит флаг не пропускать не пустые или же таблица пустая
 
    if @SkipNotEmptyTable <>  1  or fn_asc_IsEmptyTable( @TableName ) =  1  
    then
      print 'migrating ' || @Number || ' - ' || @TableName;

       -- Придумываем дикое имя для прокси таблицы
 
      set @RemoteTableName = '__' || @ServerName || '_' ||
          @DatabaseName || '_' || @OwnerName || '_' || @TableName;

       -- Подключаем таблицу удаленного сервера как прокси таблицу
 
      execute immediate 'create existing table "' || @RemoteTableName || '" at ''' ||
        @ServerName || '.' || @DatabaseName || '.' ||
        @OwnerName || '.' || @TableName || '''';

      begin
         -- Генерим строку списка колонок, которые будут переноситься,
 
         -- выщемляя с них тип binary
 
         -- ( завидуйте DBA конкурентов - никаких курсоров )
 
        select List( '"' || Column_Name || '"' order by c.Column_id )
        into @Columns
        from SysTable t
          key join syscolumn c
          key join sysdomain d
        where t.Table_Name = @RemoteTableName and
              d.Domain_Name <> 'binary';

         -- Пошли работать дальше, если список не пуст
 
        if Length( IsNull( @Columns, '' ) ) >  0 
        then
           -- Запускаем перекачку
 
          execute immediate 'insert into "' || @TableName || 
            '" with auto name select ' || @Columns || ' from "' || 
            @RemoteTableName || '"';
        end if;

        print '... successfull';
        print ' ';

      exception
         -- Ошибка, но отключить прокси таблицу надо
 
        when others then
          print '... failed';
          execute immediate 'drop table "' || @RemoteTableName || '"';
          resignal;
      end;

       -- Отключаем прокси таблицу
 
      execute immediate 'drop table "' || @RemoteTableName || '"';
    end if;
  end loop TablesLoop;

  close cTables;
  deallocate cTables;

   -- Восстанавливаем состояние триггеров
 
  if @Opt_Fire_Triggers = 'On' then
    set temporary option FIRE_TRIGGERS = 'On';
  end if;

   -- Обрабатываем ситуацию возникновения ошибок
 
  exception
    when others then
       -- Восстанавливаем состояние триггеров
 
      if @Opt_Fire_Triggers = 'On' then
        set temporary option FIRE_TRIGGERS = 'ON';
      end if;

      resignal;
end

Рекомендую обратить внимание на использование в последней процедуре аггрегатной функции List, которая позволяет быстренько построить список колонок одним запросом и без всяких курсоров по системных таблицам. Очень удобная функция, с помощью ее действительно можно творить чудеса.

Есть еще небольшое предложение - если у кого есть толика свободного времени, может быть он сделает доброе дело - на основе этого топика и других по ASA в Sybase ветке сделает FAQ ? Я тогда договорюсь с админом sql.ru и мы выложим систематизированную инфу в раздел FAQ на этом сервере.
Плюс еще предложение подкинул Микола - было бы неплохо организовать некую ассоциацию разработчиков на ASA, мы с Миколой могли бы попробовать через московское представительство Sybase попытаться организовать встречу российских разработчиков с командой разработчиков ASA (во всяком случае попытаться стоит).

Так же скоро попытаюсь выложить типовые отличия TSQL MSSQL 2000 и ASA9 и способы перевода БД на ASA9 (если свободное время будет).

Пока все, будет еще что, напишу. Если будут вопросы, можно слать по мылу.
...
Рейтинг: 0 / 0
Листинги моих служебных view, UDF и SP под ASA 8 (может кому пригодиться)
    #32357887
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Решил выложить еще одну процедурку, которой иногда приходится пользоваться, особенно при конвертации MSSQL на ASA, разных заливов данных, да и просто для информативности. Возвращает имена таблиц и кол-во записей в них:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
create procedure sp_asc_Table_Rows()
begin
  declare @RowCount bigint;

  declare local temporary table #Tables (
    Table_Name varchar( 128 ) not null primary key,
    RowCount bigint not null
  ) not transactional;

  for Tables as cTables no scroll cursor for
    select Table_Name as @Table_Name
    from SysTable
    where Creator = User_id() and
          Table_Type = 'BASE' and
          Existing_Obj is null
  do
    execute immediate 'select count(*) into @RowCount from ' || @Table_Name;
    insert into #Tables( Table_Name, RowCount ) values( @Table_Name, @RowCount );
  end for;

  select *
  from #Tables;
end

С помощью нее например можно запросом получить список таблиц, у которых кол-во записей от миллиона:
Код: plaintext
1.
2.
3.
4.
select *
from sp_asc_Table_Rows()
where RowCount >=  1000000 
order by Table_Name

Или же просто полный список таблиц и их кол-ва записей:
Код: plaintext
1.
call sp_asc_Table_Rows()
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Листинги моих служебных view, UDF и SP под ASA 8 (может кому пригодиться)
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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