powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Вызов процедуры в select
25 сообщений из 30, страница 1 из 2
Вызов процедуры в select
    #34827619
blakitti
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
как можно в ASE 12.0 вызывать процедуру (типа функцию) для вставки данных из табл1 в табл2 Процедура берет значения из табл1 обрабатывает их и возвращает результат, который и должен попасть в табл2.

Пример:

declare @result numeric(16,6)
declare @a_tip int

select @a_tip = 1

insert into b (b, sum_b)
select a,
exec sum_commis sum_a, @a_tip. @result output
from a
-------------------------------
процедура sum_commis

в зависимости от @a_tip вычисляет @result учитывая sum_a
...
Рейтинг: 0 / 0
Вызов процедуры в select
    #34827808
blakitti
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это вопрос....помогите справиться с этой проблемой

не могу найти как можно свое сообщение отредактировать....
...
Рейтинг: 0 / 0
Вызов процедуры в select
    #34827837
Dim2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blakitti wrote:

> не могу найти как можно свое сообщение отредактировать....

Никак.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Вызов процедуры в select
    #34829112
blakitti
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что никто не может мне помочь?

Не хочется огромную процедуру переводить на курсоры....к тому же она не моя....думала, что так можно (до этого работала с ASA.....там было с этим проще)....поискала похожие темы на форуме....не нашла ничего подходящего....неужели таки ничего нельзя с этим сделать???
...
Рейтинг: 0 / 0
Вызов процедуры в select
    #34829535
Бока
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blakittiЧто никто не может мне помочь?

Не хочется огромную процедуру переводить на курсоры....к тому же она не моя....думала, что так можно (до этого работала с ASA.....там было с этим проще)....поискала похожие темы на форуме....не нашла ничего подходящего....неужели таки ничего нельзя с этим сделать???
А в ASA Вы аналогичную процедуру делали тоже в T-SQL или в Watcom-SQL ?
...
Рейтинг: 0 / 0
Вызов процедуры в select
    #34829688
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
БокаА в ASA Вы аналогичную процедуру делали тоже в T-SQL или в Watcom-SQL ?
А в ASA достаточно написать:
select * from myProcedure(param1, param2);
и работать с резалтсетом процедуры как с любой таблицей.
...
Рейтинг: 0 / 0
Вызов процедуры в select
    #34831253
sn1251
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
FAQ ?
...
Рейтинг: 0 / 0
Вызов процедуры в select
    #34831783
blakitti
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sn1251 FAQ ?

читала...мне это не подходит....это все равно, что микроскопом гвозди забивать.....у меня процедура возвращает одно значение.....только одно!!!!!
...
Рейтинг: 0 / 0
Вызов процедуры в select
    #34833069
Бока
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl БокаА в ASA Вы аналогичную процедуру делали тоже в T-SQL или в Watcom-SQL ?
А в ASA достаточно написать:
select * from myProcedure(param1, param2);
и работать с резалтсетом процедуры как с любой таблицей.Я провел маленький эксперимент в ASA 10.0.1.

1.) Создал процедуру в Watcom-SQL:
CREATE PROCEDURE p_wsql(in a_tip int )
RESULT (ic1 int, ic2 int)
ON EXCEPTION RESUME
BEGIN
SELECT c1, c2+a_tip FROM t2
END;

2.) Создал процедуру c тем же алгоритмом в Transact-SQL:
CREATE PROCEDURE p_tsql a_tip int
AS
SELECT c1, c2+@a_tip FROM t2

3.) Обе процедуры работают одинаково при (возвращают ожидаемый result set) при обочных способах вызова, например:
exec p_tsql(2)
exec p_wsql(4)
call p_tsql(2)
call p_wsql(4)

4.) Если же пытаещься вызывать эти процедуры из SELECTа, то:
- вызов Watcom-SQL процедуры
SELECT * FROM p_wsql(4)
нормально выдаёт ожидаемый result set;
- а вызов Transact-SQL процедуры
SELECT * FROM p_tsql(2)
выдаёт error message
The following error occured while fetching results:
p_tsql returned a result set with a different schema then expected
SQLCODE = -866 ODBC 3 State="HY000"

Я предплолагаю, что в ASA Transact-SQL не поддерживает SELECT из процедуры, в отличии от Watcom-SQL. А поскольку Sybase декларирует в ASA 10.0 полную совместимость Transact-SQL с ASA 12.0 и выше, то моожно предположить, что SELECTе из процедуры не поддерживается и в ASA 12.0.

Что касается конструкции, предлагаемой blakitti, то как в Watcom-SQL, так и в Transact-SQL, подобную конструкцию можно сделать с помощью функции, а не процедуры.
...
Рейтинг: 0 / 0
Вызов процедуры в select
    #34833173
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Бока2.) Создал процедуру c тем же алгоритмом в Transact-SQL:
CREATE PROCEDURE p_tsql a_tip int
AS
SELECT c1, c2+@a_tip FROM t2Неправильно. Должно быть:
Код: plaintext
1.
2.
CREATE PROCEDURE p_tsql @a_tip int
AS
   SELECT c1, c2+@a_tip FROM t2
Не забывай о любви Transact SQL к символу @ в именах переменных и параметров и будет тебе щастье.


Бока SELECT * FROM p_tsql(2)
выдаёт error message
The following error occured while fetching results:
p_tsql returned a result set with a different schema then expected
SQLCODE = -866 ODBC 3 State="HY000"А если делаешь процедуру с вариантным резалтсетом, то не грех будет и явно объявить колонки:
Код: plaintext
SELECT * FROM p_tsql( 2 ) with (ic1 int, ic2 int)
Заодно и имена им дашь удобные. Но для данного теста достаточно будет правильно объявить процедуру.

БокаЯ предплолагаю, что в ASA Transact-SQL не поддерживает SELECT из процедуры, в отличии от Watcom-SQL. А поскольку Sybase декларирует в ASA 10.0 полную совместимость Transact-SQL с ASA 12.0 и выше, то моожно предположить, что SELECTе из процедуры не поддерживается и в ASA 12.0.Неправильные предположения и логика хромает. Одно из другого не следует.
...
Рейтинг: 0 / 0
Вызов процедуры в select
    #34833180
rcryo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор.неужели таки ничего нельзя с этим сделать???
а функция на java не подойдет?
...
Рейтинг: 0 / 0
Вызов процедуры в select
    #34833781
blakitti
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
БокаЯ предплолагаю, что в ASA Transact-SQL не поддерживает SELECT из процедуры, в отличии от Watcom-SQL. А поскольку Sybase декларирует в ASA 10.0 полную совместимость Transact-SQL с ASA 12.0 и выше, то моожно предположить, что SELECTе из процедуры не поддерживается и в ASA 12.0.

Что касается конструкции, предлагаемой blakitti, то как в Watcom-SQL, так и в Transact-SQL, подобную конструкцию можно сделать с помощью функции, а не процедуры.

Я это пытаюсь сделать НЕ в ASA....мне надо это сделать в ASE :-) я ж в первом посте указала :-)
недавно начала работать в ASE (до этого работала с ASA)....и столкнулась с этой проблемой....вот и задала вопрос :-)
...
Рейтинг: 0 / 0
Вызов процедуры в select
    #34834140
Бока
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дело в том, что Sybase декларирует полную совместимость Transact-SQL в ASA и в ASE начиная с ASA 9.0. Я проверил предполагаемую Вами конструкцию с использовании функции вместо процедуры в Transact-SQL в ASA 10.0.1. Получилось вот что:
создаётся функция

CREATE FUNCTION f_tsql(@ic2 INT,@a_tip INT )
RETURNS INT
AS
DECLARE @Result INT
SELECT @Result = @ic2+@a_tip
RETURN @Result

и тогда конструкция

declare @a_tip int
select @a_tip = 4
insert into t1 (c1,c2) select c1,f_tsql(c2,@a_tip) from t2

работает.

Вы можете проверить применение этого типа в ASE, заменив свою процедуру
sum_commis на фунуцию, оставив те же самые два входных параметра, а один выходной параметер @result заменить на возвращаемое значение функции.
...
Рейтинг: 0 / 0
Вызов процедуры в select
    #34835028
rcryo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот заладил
нет в ASE функций на Transact-SQL, есть только на java

но я бы рекомендовал работать со множествами а не с фукциями
...
Рейтинг: 0 / 0
Вызов процедуры в select
    #34835111
blakitti
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rcryoно я бы рекомендовал работать со множествами а не с фукциями

вот с этого места поподробнее.....это как?
...
Рейтинг: 0 / 0
Вызов процедуры в select
    #34835413
rcryo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вам ссылку на Faq уже давали где MasterZiv все расказал:
авторДля реализации этой возможности в ASE надо рассмотреть альтернативные варианты решения задачи.
замечание от MasterZiv Я лично хочу заметить, что по моему убеждению, сложившемуся за годы работы с SQL, SQL - это язык немодульный, в том смысле, что в нем практически нет возможностей повторного использования кода и попытки повторного испоьлзования кода часто бывают даже вредны (например для производительности). Так что первый вариант решения - просто скопировать текст запроса или использовать такие средства "размножения кода", как макропроцессоры.

Рассмотреть возможность использования VIEW. Это подходит только в случаях достаточно несложных запросов - JOIN-ов может быть сколько угодно, главное чтобы не было сложных операций типа множественных вложенных подзапросов или реляционного вычитания.

Рассмотреть возможность использовать временную, псевдовременную или постоянную таблицу для промежуточного хранения данных. Кстати, в этом варианте процедура может формировать несколько наборов данных в разных таблицах. При этом код исходной процедуры помещается в ещё одну процедуру -- процедуру-реализацию, которая складывает данные в выходную таблицу, а остальные процедуры либо выдают эти данные клиенту, либо используют их как-то еще.
например, если есть возможность перед инсертом заполните временную таблицу пред рассчитанными значениями, а в инсерте подсоедините её
...
Рейтинг: 0 / 0
Вызов процедуры в select
    #34835740
Бока
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rcryoвот заладил
нет в ASE функций на Transact-SQL, есть только на java

но я бы рекомендовал работать со множествами а не с фукциямиА в чём тогда заключается декларируемая в документации ASA якобы полная совместимость Transact-SQL, начиная с ASA 9.0 и ASE 12.0 ?
...
Рейтинг: 0 / 0
Вызов процедуры в select
    #34835794
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
БокаА в чём тогда заключается декларируемая в документации ASA якобы полная совместимость Transact-SQL, начиная с ASA 9.0 и ASE 12.0 ?В том, что корректно написаный код на TSQL с ASE 12 пойдет без переписывания на ASA9. Все.
Обратную совместимость никто не обещал.
...
Рейтинг: 0 / 0
Вызов процедуры в select
    #34836544
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В ASE нет селективных процедур. Можно только внутри этой процедуры и вставлять в нужною таблицу.
...
Рейтинг: 0 / 0
Вызов процедуры в select
    #34838002
blakitti
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rcryoнапример, если есть возможность перед инсертом заполните временную таблицу пред рассчитанными значениями, а в инсерте подсоедините её

спасибо....это не подходит :-(
...
Рейтинг: 0 / 0
Вызов процедуры в select
    #34838058
blakitti
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rcryoа функция на java не подойдет?

попробую :-)
...
Рейтинг: 0 / 0
Вызов процедуры в select
    #34839724
Kru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день,
можно всё-таки попробовать сделать через прокси таблицу. У меня дома ASE 15 стоит и эксперемент до конца не удался из-за лицензионной ругани. На 12.5 может быть и получится.
Я попробовал на следующей задачке:
Есть таблица test1 с 2мя столбцами и есть таблица test2 с 3мя стобцами. Все int.
Требуется сделать insert в test2 из test1 так чтобы в test2.a добавлялись значения из test1.a, в test2.b значения из test1.b и в test2.c некоторая функция вставляла бы произведение стобцов a и b из test1.
Прошу прощения, если пишу криво -- устал после работы
Создаём временные таблицы:
use pubs2
go

create table dbo.test1 (a int, b int)
go
insert into dbo.test1 values (1,1)
insert into dbo.test1 values (1,2)
insert into dbo.test1 values (1,3)
insert into dbo.test1 values (2,2)
insert into dbo.test1 values (2,3)
go
create table dbo.test2 (a int, b int, c int)
go
создаём процедуру умножения
create procedure dbo.mathtutor1
@mult1 int , @mult2 int
as
select @mult1 * @mult2 as res
go

Теперь по поводу loopbsck сервера. В ASE15 при установке создаётся loopback c именем loopback.
В 12.5 такого сервера, насколько я помню, нет.
Его нужно создать: sp_addserver 'loopback', null, 'your_local_server_name'

Дальше создаётся прокси таблица "смотрящая" на процедуру.
Я переконектился к северу на всякий случай, хотя может быть необязательно.

create existing table dbo.func_subst_mathtutor
(res int
, _mult1 integer null -- Важно, поле должно позволять Null
,_mult2 integer null)
external procedure
at 'loopback.pubs2.dbo.mathtutor1'

На моей 15шке команда прошла. Надеюсь, что на 12.5 тоже пройдёт, хотя RPC штука хитрая, может быть какую-нибудь лицензию попросит.

Если получится, то последняя команда:
insert into test2
select a,b,res
from test1 t
inner join func_subst_mathtutor1 m
on t.a = m._mult1 and t.b = m._mult2

(Это эквивалент insert into test2 select a,b, function(a,b) from test1)

Здесь у меня, к сожалению, выскочила ошибка 5629 - судя по описанию, это какие-то лицензионные дела. Может быть в 12.5 пройдйт нормально.

Попробуйте.
Если получится, напишите.

Напоследок. У меня был случай когда только таким неудобным образом удалось решить задачу. Я тогда на 12.5 работал и помню, что какие-то проблемы с RPC возникали, но администратор что-то подкрутил и всё заработало. Производительность была плохая, но там случай был сложный и вопрос стоял либо так либо никак.

Удачи
...
Рейтинг: 0 / 0
Вызов процедуры в select
    #34860059
blakitti
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rcryo

Вопрос про функции на java есть ли какие-то требования к ним? есть функция, но подключить ее не получается....ругается на java.lang.ClassFormatError.....Sybase error code = 10707
...
Рейтинг: 0 / 0
Вызов процедуры в select
    #34860460
blakitti
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kru Попробуйте.
Если получится, напишите.
на вашем примере все проходит, на моих данных нет.....может сможете обьяснить почему

итак

create table dbo.test1 (a int, b money)
go
insert into dbo.test1 values (1,10)
insert into dbo.test1 values (2,20)
insert into dbo.test1 values (3,30)
insert into dbo.test1 values (4,40)
insert into dbo.test1 values (5,50)
go
create table dbo.test2 (a int, b money, c numeric(16,6))
go

CREATE PROCEDURE dbo.sum_commis @sum_op money, @type_com tinyint
AS
declare @sum_s1 money
declare @sum_s2 money
declare @fix smallmoney
declare @pr numeric(8,7)
declare @sum_com numeric(16,6)
declare @res numeric(16,6)

BEGIN
select @sum_s1=isNull(S1,0), @sum_s2=isnull(S2,0), @fix=FIX, @pr=PERCENT
from C
where TYPE_COM = @type_com

select @sum_com = @sum_op*@pr+@fix
if @sum_com < @sum_s1
select @res = @sum_s1
else
if @sum_com > @sum_s2 and @sum_s2 <> 0
select @res = @sum_s2
else
select @res = @sum_com
END

create existing table dbo.commis_summ
(_res numeric(16,6) null
, _sum_op money null
, _type_com tinyint null)
external procedure
at 'loopback.MAIN.dbo.sum_commis'
go
*****************************
insert into test2
select a,b,_res
from test1 t
inner join commis_summ m
on t.b = m._sum_op and m._type_com = 3

при вставке в tabl2 выдает ошибку на план запроса :-(
что я делаю не так? и как это исправить?
...
Рейтинг: 0 / 0
Вызов процедуры в select
    #34861716
Kru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blakitti
*****************************
insert into test2
select a,b,_res
from test1 t
inner join commis_summ m
on t.b = m._sum_op and m._type_com = 3

при вставке в tabl2 выдает ошибку на план запроса :-(
что я делаю не так? и как это исправить?

A sam select rabotaet bez insert?
...
Рейтинг: 0 / 0
25 сообщений из 30, страница 1 из 2
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Вызов процедуры в select
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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