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

Часовой пояс: 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 часа


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

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

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