CREATE PROCEDURE

BN1978
Дата: 30.01.2006 15:38:36
Возможно ли создание подобной процедуры в каше и как мог бы выглядеть возврат значений ?
CREATE PROCEDURE GETPARENTS (ID INTEGER)
RETURNS (DID INTEGER,OID INTEGER,NAME VARCHAR(60),CCOUNT INTEGER)
AS
BEGIN
WHILE (:ID > 0) DO
BEGIN
SELECT O.ID, O.PARENT, O.NAME, O.CCOUNT
FROM DETAIL O
WHERE O.ID = :ID
INTO :DID, :OID, :NAME , :CCOUNT;
ID = :OID;
SUSPEND;
END
END
ну я
Дата: 30.01.2006 15:50:44
Да нет проблем. Студия, добавить запрос с опцией переопределить методы запроса. Переписываем три метода. Детали в документации.
http://127.0.0.1:1972/csp/docbook/DocBook.UI.Page.cls?KEY=GOBJ_queries
Тема - User-Written Class Queries
bn1978
Дата: 30.01.2006 16:36:32
Так можно на любой вопрос ответить.

Мне нужен такой вариант, который можно было бы использовать чез ОДБС
например так Select * from GETPARENTS(:ID) или так CALL GETPARENTS(:ID)
ни один из вариантов для Query мне запустить не удалось.
ну я
Дата: 30.01.2006 16:55:30
Мне тоже нужен такой вариант :-) и очень давно, но увы, полного соответствия между моделью Интербейз и Каше нет. Я дал ближайшее соответствие.
bn1978
Дата: 30.01.2006 17:07:35
Мне кажется должен быть какой то выход.
bn1978
Дата: 31.01.2006 17:22:39
Class User.Wisdom Extends %Persistent [ ClassType = persistent, SqlTableName = WISDOM, TimeChanged = "60296,29970.979684" ]
{

ClassMethod NewQuery1Close(ByRef qHandle As %Binary)
As %Status [ PlaceAfter = NewQuery1Execute ]
{
s qHandle="", ID = "" Quit $$$OK
}

ClassMethod NewQuery1Execute(ByRef qHandle As %Binary, RoutineName As
%CacheString, P0 As %CacheString, P1 As %CacheString, P2 As %CacheString,P3 As %CacheString) As
%Status
{
set ID = RoutineName,Temp = 0
// d @RoutineName
s qHandle=$lb("",$g(P0,"p0 undef"),$g(P1,"p1 undef"),$g(P2,"p2 undef"),$g(P3,"p3 undef")) ;
Quit $$$OK
}

ClassMethod NewQuery1Fetch(ByRef qHandle As %Binary, ByRef Row As %List, ByRef AtEnd As %Integer = 0)
As %Status [ PlaceAfter = NewQuery1Execute ]
{
new DID, OID, NAME , CCOUNT
if (qHandle'=$lb("")) {
s AtEnd=0

&sql(SELECT O.ID, O.PARENT, O.NAME, O.CCOUNT INTO :DID, :OID, :NAME , :CCOUNT FROM DETAIL O WHERE O.ID = :ID )
set ID = OID
s Row=$lb(DID,OID,NAME,CCOUNT)

if (ID < 1){ s qHandle=$lb("") }
}
else {
s AtEnd=1, Row=""
}
Quit $$$OK
}

Query NewQuery1(RoutineName As %CacheString )
As %Query(ROWSPEC = "DID:%CacheString,OID:%CacheString,NAME:%CacheString,CCOUNT:%CacheString")
[ SqlName = VisMQuery, SqlProc ]
{
}


Query1->SQL->Text = "CALL VisMQuery(123)";
Query1->Open();
На борланде выводит в решотку как положенно, через SQL Manager почему то не работает.
VadimF
Дата: 01.02.2006 10:55:27
SQL-менеджер (Кстати, пора уже переходить на Cache' 5.1. и, соответственно, на Портал Управления Cache') работает на через ODBC, а через Dynamic SQL.
В SQL-менеджере нельзя запускать хранимые процедуры (call sp).

В Cache' есть 2 типа хранимых процедур.
На основе class query и на основе classmethod.
1-ый тип - возвращает ResultSet.
2-ой - какие-то значения.


Мне кажется, Вашу хранимую процедуру легко реализовать с помощью classmethod.
Делаете classmethod, указываете, что это хранимая процедура.
В методе Вы можете использовать встроенный или динамический SQL, объекты, прямой доступ и т.д.

Что касается вызова хранимой процедуры в SQL-запросе, такая возможность есть.

Посмотрите документацию.


Вадим
bn1978
Дата: 03.02.2006 09:23:26
Мне кажется, Вашу хранимую процедуру легко реализовать с помощью classmethod.

Мне поначалу так тоже показалось, но мне не удалось понять каким образом
возвращать значения, с одним все понятно, но как вернуть несколько значении


ClassMethod Cube(val As %Integer)
As %Query(ROWSPEC = "DID:%CacheString,OID:%CacheString,NAME:%CacheString,CCOUNT:%CacheString") [sqlproc]
{
???
}
VadimF
Дата: 03.02.2006 10:48:22
Почему Вы возвращаете %Query.
Из classmethod Вы можете вернуть сколько угодно переменных, если передаете их в метод по ссылке, а не по значению.

Посмотрите пример:
Область Samples
Класс Sample.Person
Метод StoredProcTest.

ClassMethod StoredProcTest(name As %String, ByRef response As %String) As %Integer [ SqlName = Stored_Procedure_Test, SqlProc ]
{
// Set response to the concatenation of name.
Set response = name _ "||" _ name
QUIT 29
}

Вадим
bn1978
Дата: 03.02.2006 12:50:44
Мне такой стиль не нравится. Да и тему начального вопроса это впринципе не затрагивает.
Моя задача, реляционное дерево http://rxlib.ru/WinLesson/bles3.htm, нуждается в процедуре, которая бы возвращала курсор, другими словами таблицу значений т.е %Query. Сначала пробовал вернуть его с помощью метода, но не нашол как это сделать. Получилось через Query.

Вы сказали что без проблем моглибы это сделать, при помощи метода класса
Если это правда , мне хотелось бы посмотреть, могу дать Вам класс дерева для Каше для которого все это нужно.