Текущее время: Вс, авг 03 2025, 23:06

Часовой пояс: UTC + 3 часа


Правила форума


ВНИМАНИЕ!

Вопросы по SAP Query и Quick View - сюда



Начать новую тему Ответить на тему  [ Сообщений: 9 ] 
Автор Сообщение
 Заголовок сообщения: Выполнение SQL процедур из ABAP
СообщениеДобавлено: Пн, окт 22 2007, 13:47 
Младший специалист
Младший специалист
Аватара пользователя

Зарегистрирован:
Вт, сен 12 2006, 12:57
Сообщения: 85
Проблема такая: нужно вытащить текстовые описания таблиц из SQL базы. Нашел процедуру, которая это делает: fn_listextendedproperty. Все хорошо, только одна проблема - не могу динамически задавать имя нужной таблицы. Вот код:
Code:
EXEC SQL PERFORMING aaa.
   SELECT value into :tabtext
    FROM fn_listextendedproperty (NULL, 'schema', 'dbo', 'table',
                                  'kpuc1' , default, default);
ENDEXEC.


В таком виде работает прекрасно, но если вместо 'kpuc1' поставить :p_table, то вываливается в дамп DBIF_DSQL2_SQL_ERROR и пишет ваще левую ошибку: CREATE PROCEDURE permission denied in database.

Пробовал писать по-другому:
Code:
TYPES: BEGIN OF a,
         a1(128),
         a2(128),
         a3(128),
         a4(128),
      END OF a.
DATA atab TYPE TABLE OF a.

EXEC SQL PERFORMING aaa.
   execute procedure fn_listextendedproperty ( in '',
                                               in 'schema',
                                               in 'dbo',
                                               in 'table',
                                               in 'acc',
                                               in 'default',
                                               in 'default',
                                               out :atab[] )
ENDEXEC.

При выполнении вообще отваливается режим без дампов :-) В логе процесса пишет: Error Code DBIF_DSQL2_INVALID_REQUEST.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн, окт 22 2007, 14:10 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Ср, ноя 23 2005, 13:37
Сообщения: 1805
Откуда: ECC 6.0
Пол: Мужской
Мне удавалось получить рекордсет из хранимки почти так же:
http://sapboard.ru/forum/viewtopic.php?t=23752
Только into у меня стоит в конце, что, скорее всего, не важно.

Это только для MS SQL.

Страшно предположить, что SAP пытается создать временную хранимку, в которой вызывает запрошенную fn_listextendedproperty, подставив константы вместо переменных.

Точка с запятой внутри EXEC SQL, наверное, не нужна.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн, окт 22 2007, 14:31 
Младший специалист
Младший специалист
Аватара пользователя

Зарегистрирован:
Вт, сен 12 2006, 12:57
Сообщения: 85
Чето нифига не получается. А кинь свой код, в котором у тебя получилось


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн, окт 22 2007, 14:38 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Ср, ноя 23 2005, 13:37
Сообщения: 1805
Откуда: ECC 6.0
Пол: Мужской
В точности так, как предпоследнем посте цитируемой темы. Думаю, что префикс $PROC обязателен.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн, окт 22 2007, 14:51 
Младший специалист
Младший специалист
Аватара пользователя

Зарегистрирован:
Вт, сен 12 2006, 12:57
Сообщения: 85
Я написал так:
Code:
   SELECT value
    FROM $PROC$fn_listextendedproperty
    where ( NULL, 'schema', 'dbo', 'table', 'kpuc1', default, default)
    into :tabtext

И нифига, вываливается в дамп DBIF_DSQL2_SQL_ERROR и пишет: "The request for procedure 'fn_listextendedproperty' failed because 'fn_listextendedproperty' is a table valued function object."


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн, окт 22 2007, 20:25 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Ср, ноя 23 2005, 13:37
Сообщения: 1805
Откуда: ECC 6.0
Пол: Мужской
Могу предположить следующие причины.

Хранимая процедура должна возвращать именно recordset, а не ссылку на recordset (table value).
Нельзя "SELECT value", а можно только "SELECT *".
Попробуйте вставить пробел перед скобкой: "default )".
Переменная tabtext должна быть скаляром, т.е. если это таблица, то обязательно должна иметь header line.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт, окт 23 2007, 09:43 
Младший специалист
Младший специалист
Аватара пользователя

Зарегистрирован:
Вт, сен 12 2006, 12:57
Сообщения: 85
Та шо я уже тока не пробовал! Короче забил я на это дело и нашел другой варик, который делает то же самое:
Code:
         SELECT t.name, value
               FROM sys.extended_properties AS ep
               INNER JOIN sys.tables AS t
               ON ep.major_id = t.object_id
               WHERE class    = 1 and
                     minor_id = 0;


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн, окт 29 2007, 15:11 
Специалист
Специалист
Аватара пользователя

Зарегистрирован:
Пт, июн 02 2006, 14:22
Сообщения: 138
Откуда: г.Новомичуринск
Пол: Мужской
Можно было бы попробовать с курсором. А потом получить из него рекордсет.
Code:
  exec SQL.
    OPEN C FOR
       SELECT
         distinct
         code_oracle, code_sap, ZSMET
              FROM
                  Oracle_SAP
              WHERE
                  mark_del is null
  endexec.

А потом
Code:
  do.
    exec SQL.
      FETCH NEXT C
        INTO :itab_sql-ogk_cod,
             :itab_sql-matnr,
             :itab_sql-ZSMET.
    endexec.
    if sy-subrc <> 0.
      exit.
    endif.
  enddo.

_________________
Не ломайте то что уже есть.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн, окт 29 2007, 15:26 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Ср, ноя 23 2005, 13:37
Сообщения: 1805
Откуда: ECC 6.0
Пол: Мужской
Судя по ноте 176792, можно использовать только единственно правильную версию синтаксиса, которую, в виде исключения, любезно предоставляет только MSSQL-порт.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт, дек 04 2008, 05:31 
Менеджер
Менеджер
Аватара пользователя

Зарегистрирован:
Чт, мар 09 2006, 10:12
Сообщения: 565
Откуда: Волгодонск
Пол: Мужской
Только начал изучать MS SQL SERVER
подскажите пожалуйста в постах выше под "recordset" понимается курсор что ли, или из ХП всё же можно вернуть табличку (array, it..)

в хелпе к MS SQL SERVER 2005 на "CREATE PROCEDURE" написано
Цитата:
Table-valued parameters can be specified as input parameters only, and they must be accompanied by a READONLY keyword

т.е. они могут быть только входящими, или я что то не понял.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт, дек 05 2008, 06:42 
Менеджер
Менеджер
Аватара пользователя

Зарегистрирован:
Чт, мар 09 2006, 10:12
Сообщения: 565
Откуда: Волгодонск
Пол: Мужской
Разобрался из ХП можно вернуть RecordSet первого селекта в ХП пример:
MS SQL Server
Code:
ALTER PROCEDURE [dbo].[SAP_sp_test]
   @id int = 0
AS
BEGIN
  SET NOCOUNT ON;

  select * from dbo.dtproperties
  where id = @id
END


SAP
Code:
  EXEC SQL.
    OPEN dbcur FOR
    SELECT * FROM $PROC$dbo.SAP_sp_test
     WHERE (:id)
  ENDEXEC.

  DO.
    EXEC SQL.
      FETCH NEXT dbcur INTO :wa
    ENDEXEC.

    IF sy-subrc <> 0. EXIT. ENDIF.
    WRITE: / wa. " wa - должно иметь структуру соотв. селекту в ХП
  ENDDO.


Принять этот ответ
Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 9 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: Ahrefs [Bot]


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB