Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Вызов процедуры в select / 25 сообщений из 30, страница 1 из 2
26.09.2007, 13:22
    #34827619
blakitti
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов процедуры в select
как можно в 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
26.09.2007, 13:56
    #34827808
blakitti
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов процедуры в select
Это вопрос....помогите справиться с этой проблемой

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

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

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

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

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

читала...мне это не подходит....это все равно, что микроскопом гвозди забивать.....у меня процедура возвращает одно значение.....только одно!!!!!
...
Рейтинг: 0 / 0
27.09.2007, 23:23
    #34833069
Бока
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов процедуры в select
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
28.09.2007, 01:34
    #34833173
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов процедуры в select
Бока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
28.09.2007, 01:54
    #34833180
rcryo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов процедуры в select
автор.неужели таки ничего нельзя с этим сделать???
а функция на java не подойдет?
...
Рейтинг: 0 / 0
28.09.2007, 11:07
    #34833781
blakitti
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов процедуры в select
БокаЯ предплолагаю, что в 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
28.09.2007, 12:16
    #34834140
Бока
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов процедуры в select
Дело в том, что 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
28.09.2007, 15:12
    #34835028
rcryo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов процедуры в select
вот заладил
нет в ASE функций на Transact-SQL, есть только на java

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

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

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

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

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

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

попробую :-)
...
Рейтинг: 0 / 0
02.10.2007, 06:27
    #34839724
Kru
Kru
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов процедуры в select
Добрый день,
можно всё-таки попробовать сделать через прокси таблицу. У меня дома 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
10.10.2007, 13:28
    #34860059
blakitti
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов процедуры в select
rcryo

Вопрос про функции на java есть ли какие-то требования к ним? есть функция, но подключить ее не получается....ругается на java.lang.ClassFormatError.....Sybase error code = 10707
...
Рейтинг: 0 / 0
10.10.2007, 14:50
    #34860460
blakitti
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов процедуры в select
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
10.10.2007, 23:33
    #34861716
Kru
Kru
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов процедуры в select
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
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Вызов процедуры в select / 25 сообщений из 30, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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