Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Вызов процедуры в select
|
|||
|---|---|---|---|
|
#18+
как можно в 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2007, 13:22 |
|
||
|
Вызов процедуры в select
|
|||
|---|---|---|---|
|
#18+
Это вопрос....помогите справиться с этой проблемой не могу найти как можно свое сообщение отредактировать.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2007, 13:56 |
|
||
|
Вызов процедуры в select
|
|||
|---|---|---|---|
|
#18+
blakitti wrote: > не могу найти как можно свое сообщение отредактировать.... Никак. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2007, 14:04 |
|
||
|
Вызов процедуры в select
|
|||
|---|---|---|---|
|
#18+
Что никто не может мне помочь? Не хочется огромную процедуру переводить на курсоры....к тому же она не моя....думала, что так можно (до этого работала с ASA.....там было с этим проще)....поискала похожие темы на форуме....не нашла ничего подходящего....неужели таки ничего нельзя с этим сделать??? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2007, 18:10 |
|
||
|
Вызов процедуры в select
|
|||
|---|---|---|---|
|
#18+
blakittiЧто никто не может мне помочь? Не хочется огромную процедуру переводить на курсоры....к тому же она не моя....думала, что так можно (до этого работала с ASA.....там было с этим проще)....поискала похожие темы на форуме....не нашла ничего подходящего....неужели таки ничего нельзя с этим сделать??? А в ASA Вы аналогичную процедуру делали тоже в T-SQL или в Watcom-SQL ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2007, 20:53 |
|
||
|
Вызов процедуры в select
|
|||
|---|---|---|---|
|
#18+
БокаА в ASA Вы аналогичную процедуру делали тоже в T-SQL или в Watcom-SQL ? А в ASA достаточно написать: select * from myProcedure(param1, param2); и работать с резалтсетом процедуры как с любой таблицей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2007, 22:49 |
|
||
|
Вызов процедуры в select
|
|||
|---|---|---|---|
|
#18+
sn1251 FAQ ? читала...мне это не подходит....это все равно, что микроскопом гвозди забивать.....у меня процедура возвращает одно значение.....только одно!!!!! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.09.2007, 15:52 |
|
||
|
Вызов процедуры в select
|
|||
|---|---|---|---|
|
#18+
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, подобную конструкцию можно сделать с помощью функции, а не процедуры. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.09.2007, 23:23 |
|
||
|
Вызов процедуры в select
|
|||
|---|---|---|---|
|
#18+
Бока2.) Создал процедуру c тем же алгоритмом в Transact-SQL: CREATE PROCEDURE p_tsql a_tip int AS SELECT c1, c2+@a_tip FROM t2Неправильно. Должно быть: Код: plaintext 1. 2. Бока 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 БокаЯ предплолагаю, что в ASA Transact-SQL не поддерживает SELECT из процедуры, в отличии от Watcom-SQL. А поскольку Sybase декларирует в ASA 10.0 полную совместимость Transact-SQL с ASA 12.0 и выше, то моожно предположить, что SELECTе из процедуры не поддерживается и в ASA 12.0.Неправильные предположения и логика хромает. Одно из другого не следует. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2007, 01:34 |
|
||
|
Вызов процедуры в select
|
|||
|---|---|---|---|
|
#18+
автор.неужели таки ничего нельзя с этим сделать??? а функция на java не подойдет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2007, 01:54 |
|
||
|
Вызов процедуры в select
|
|||
|---|---|---|---|
|
#18+
БокаЯ предплолагаю, что в 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)....и столкнулась с этой проблемой....вот и задала вопрос :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2007, 11:07 |
|
||
|
Вызов процедуры в select
|
|||
|---|---|---|---|
|
#18+
Дело в том, что 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 заменить на возвращаемое значение функции. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2007, 12:16 |
|
||
|
Вызов процедуры в select
|
|||
|---|---|---|---|
|
#18+
вот заладил нет в ASE функций на Transact-SQL, есть только на java но я бы рекомендовал работать со множествами а не с фукциями ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2007, 15:12 |
|
||
|
Вызов процедуры в select
|
|||
|---|---|---|---|
|
#18+
rcryoно я бы рекомендовал работать со множествами а не с фукциями вот с этого места поподробнее.....это как? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2007, 15:27 |
|
||
|
Вызов процедуры в select
|
|||
|---|---|---|---|
|
#18+
вам ссылку на Faq уже давали где MasterZiv все расказал: авторДля реализации этой возможности в ASE надо рассмотреть альтернативные варианты решения задачи. замечание от MasterZiv Я лично хочу заметить, что по моему убеждению, сложившемуся за годы работы с SQL, SQL - это язык немодульный, в том смысле, что в нем практически нет возможностей повторного использования кода и попытки повторного испоьлзования кода часто бывают даже вредны (например для производительности). Так что первый вариант решения - просто скопировать текст запроса или использовать такие средства "размножения кода", как макропроцессоры. Рассмотреть возможность использования VIEW. Это подходит только в случаях достаточно несложных запросов - JOIN-ов может быть сколько угодно, главное чтобы не было сложных операций типа множественных вложенных подзапросов или реляционного вычитания. Рассмотреть возможность использовать временную, псевдовременную или постоянную таблицу для промежуточного хранения данных. Кстати, в этом варианте процедура может формировать несколько наборов данных в разных таблицах. При этом код исходной процедуры помещается в ещё одну процедуру -- процедуру-реализацию, которая складывает данные в выходную таблицу, а остальные процедуры либо выдают эти данные клиенту, либо используют их как-то еще. например, если есть возможность перед инсертом заполните временную таблицу пред рассчитанными значениями, а в инсерте подсоедините её ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2007, 16:41 |
|
||
|
Вызов процедуры в select
|
|||
|---|---|---|---|
|
#18+
rcryoвот заладил нет в ASE функций на Transact-SQL, есть только на java но я бы рекомендовал работать со множествами а не с фукциямиА в чём тогда заключается декларируемая в документации ASA якобы полная совместимость Transact-SQL, начиная с ASA 9.0 и ASE 12.0 ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2007, 18:17 |
|
||
|
Вызов процедуры в select
|
|||
|---|---|---|---|
|
#18+
БокаА в чём тогда заключается декларируемая в документации ASA якобы полная совместимость Transact-SQL, начиная с ASA 9.0 и ASE 12.0 ?В том, что корректно написаный код на TSQL с ASE 12 пойдет без переписывания на ASA9. Все. Обратную совместимость никто не обещал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2007, 18:31 |
|
||
|
Вызов процедуры в select
|
|||
|---|---|---|---|
|
#18+
В ASE нет селективных процедур. Можно только внутри этой процедуры и вставлять в нужною таблицу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2007, 19:37 |
|
||
|
Вызов процедуры в select
|
|||
|---|---|---|---|
|
#18+
rcryoнапример, если есть возможность перед инсертом заполните временную таблицу пред рассчитанными значениями, а в инсерте подсоедините её спасибо....это не подходит :-( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.10.2007, 12:21 |
|
||
|
Вызов процедуры в select
|
|||
|---|---|---|---|
|
#18+
rcryoа функция на java не подойдет? попробую :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.10.2007, 12:36 |
|
||
|
Вызов процедуры в select
|
|||
|---|---|---|---|
|
#18+
Добрый день, можно всё-таки попробовать сделать через прокси таблицу. У меня дома 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 возникали, но администратор что-то подкрутил и всё заработало. Производительность была плохая, но там случай был сложный и вопрос стоял либо так либо никак. Удачи ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2007, 06:27 |
|
||
|
Вызов процедуры в select
|
|||
|---|---|---|---|
|
#18+
rcryo Вопрос про функции на java есть ли какие-то требования к ним? есть функция, но подключить ее не получается....ругается на java.lang.ClassFormatError.....Sybase error code = 10707 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2007, 13:28 |
|
||
|
Вызов процедуры в select
|
|||
|---|---|---|---|
|
#18+
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 выдает ошибку на план запроса :-( что я делаю не так? и как это исправить? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2007, 14:50 |
|
||
|
Вызов процедуры в select
|
|||
|---|---|---|---|
|
#18+
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? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2007, 23:33 |
|
||
|
|

start [/forum/topic.php?fid=55&fpage=59&tid=2011875]: |
0ms |
get settings: |
8ms |
get forum list: |
17ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
34ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
38ms |
get tp. blocked users: |
1ms |
| others: | 251ms |
| total: | 368ms |

| 0 / 0 |
