Чтение вывода типа таблицы в SAP Hana

Как я могу прочитать содержимое параметра типа таблицы процедуры в SAP Hana SQL Script?

Пример процедуры:

create procedure "MYSCHEMA".ReturnTypeTest(out OUTPUT_TABLE "MYSCHEMA"."RESOUT")
as
begin
    create local temporary table #temp ("COL1" bigint, "COL2" bigint, "COL3" bigint);

    insert into #temp values(1, 2, 3);
    insert into #temp values(4, 5, 6);
    insert into #temp values(7, 8, 9);

    OUTPUT_TABLE = select * from #temp;

    drop table #temp;
end;

Тип таблицы (выходной параметр):

create type "MYSCHEMA"."RESOUT" as table ("COL1" bigint, "COL2" bigint, "COL3" bigint);

Когда я вызываю процедуру, как показано ниже, она отображает весь контент в панели результатов SAP Hana Studio, но как я могу получить его программно?

call "MYSCHEMA"."RETURNTYPETEST"(?);

person Amiga500    schedule 25.01.2017    source источник


Ответы (4)


Выходные переменные из процедур могут быть назначены только переменным в контексте SQLScript.
Исключением является набор результатов по умолчанию, который привязывается к последней команде SELECT, выполненной в процедуре.
Если вы намерены создать что-то, что можно ВЫБРАТЬ, вы можете вместо этого использовать табличную пользовательскую функцию (TUDF).

Два комментария к вашему примеру кода:

  1. использование временных таблиц не является хорошей идеей, если производительность вашего приложения важна. Хотя императивный код часто кажется более интуитивным, он действительно имеет тенденцию блокировать параллелизм во время выполнения оператора.

  2. Очень (слишком) легко перегрузить одну функцию процедуры, включив в нее манипуляции с данными, вычисления и возврат набора результатов. Если возможно, лучше отдавайте предпочтение более мелким функциональным блокам и разделите их на несколько объектов.

Хорошо, после того, как вы пояснили, что на самом деле вы просто хотите получить доступ к набору результатов в SQLScript, а не в простом SQL, я могу добавить это к своему ответу: проверьте, что я написал в первом предложении! Вы можете просто назначить любую выходную переменную из процедуры соответствующей переменной. В документации есть примеры для этого Документация HANA: CALL. Например, если ваша структура вывода представляет собой таблицу, содержащую информацию о пользователе, она может выглядеть так:

DECLARE uaccounts TABLE (USERID bigint, USERNAME NVARCHAR(256), CREATED date);
DECLARE expdate date := current_date;

/* In this example the procedure 'get_expired_useraccounts_by date' has got
   the IN parameter expiry_date (date) and 
   the OUT parameter expired_accounts (table structure).

  By assigning the variable uaccounts to the OUT parameter, the result set
  automatically gets bound to uaccounts.*/

call get_expired_useraccounts_by_date  (:expdate, :uaccounts);

/* from here you can use :uaccounts like a table variable*/

SELECT count(*) FROM :uaccounts;

Все это, конечно же, часть справочной документации и руководств разработчика ...

person Lars Br.    schedule 26.01.2017
comment
Благодарим за ответ, но поскольку функции в SAP Hana доступны только для чтения, в нашей ситуации его нельзя использовать. Есть ли у нас другой вариант, кроме TUDF? - person Amiga500; 26.01.2017
comment
Итак, вам нужна процедура, которая изменяет данные и возвращает набор результатов, который можно прочитать из простого SQL? Нет, я не вижу способа сделать это. В вашем примере вы можете просто запустить процедуру и выбрать измененные данные из файла temp. table - данные живут, пока живет ваш сеанс, поэтому вы можете злоупотреблять этим как способом передачи данных. Но поймите, что это довольно плохой дизайн и что большинство манипуляций с данными, которые вы, возможно, захотите, можно выполнить без записи / обновления данных в таблицах. То, что вы выбрали здесь, является наихудшим подходом. - person Lars Br.; 29.01.2017
comment
Нет, я не ищу способ прочитать выходной параметр из простого SQL. Мне нужно вызвать эту процедуру в теле другой процедуры и обработать то, что она вернет. Но я не знаю, как обрабатывать выходные данные табличного типа. Если бы это был скалярный выходной параметр, я мог бы просто объявить для него переменную, но я не мог понять, какая структура данных используется для выходных параметров табличного типа. - person Amiga500; 29.01.2017

Не могли бы вы проверить следующий SQLScript

declare lt_list "MYSCHEMA"."RESOUT";
call "MYSCHEMA"."RETURNTYPETEST"(lt_list);
select * from :lt_list;

Это должно отобразить таблицу выходных параметров с использованием последнего оператора SELECT.

person Eralper    schedule 10.11.2017

Ответ, после понимания контекста с помощью вопросов и ответов Ларса, таков: определите табличную переменную в коде процедуры вызывающего абонента.

ОБЪЯВИТЬ ТАБЛИЦУ темп. (N int); DECLARE temp MY_TABLE_TYPE;

Затем назначьте ему выходной параметр вызываемого.

https://help.sap.com/viewer/de2486ee947e43e684d39702027f8a94/2.0.01/en-US/ea5065d06d14426799d879234d8e3e7b.html

person Sefan L.    schedule 19.03.2018

Вы можете запросить метаданные в системных представлениях. Пожалуйста, проверьте следующий SQLScript Select

select table_type_schema, table_type_name, *
from PROCEDURE_PARAMETERS 
where 
schema_name = UPPER('MYSCHEMA') and
procedure_name = UPPER('ReturnTypeTest') and
parameter_name = UPPER('OUTPUT_TABLE')

Я надеюсь, что это помогает

person Eralper    schedule 27.01.2017
comment
Спасибо, он возвращает параметры процедуры, но как я могу запросить / прочитать содержимое параметра out (который является типом таблицы)? - person Amiga500; 27.01.2017
comment
Этот ответ не отвечает на вопрос OP. - person Lars Br.; 29.01.2017