2017-01-25 10 views
1

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

Процедура Образец:

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; 

Таблица Тип (Out Параметр):

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

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

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

ответ

0

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

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

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

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

Хорошо, после того, как вы уточнили, что вы на самом деле просто хотите получить доступ к ResultSet в SQLScript и не простой SQL, я могу добавить это мой ответ: Проверьте, что я написал в первом предложении! Вы можете просто назначить любую выходную переменную из процедуры соответствующей переменной. В документации приведены примеры этого HANA documentation: 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; 

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

+0

Спасибо за ваш ответ, но поскольку функции доступны только для чтения в SAP Hana, его нельзя использовать в нашей ситуации. Есть ли у нас другой вариант, кроме TUDF? – Amiga500

+0

Итак, вам нужна процедура, которая изменяет данные и возвращает набор результатов, который можно прочитать из простого SQL? Нет, я не вижу способа сделать это. Для вашего примера вы можете просто запустить процедуру и выбрать измененные данные из temp. table - данные сохраняются до тех пор, пока выполняется ваша сессия, поэтому вы можете злоупотреблять этим как способ передачи данных. Но поймите, что это довольно плохой дизайн и что большинство манипуляций с данными, которые вы можете захотеть сделать, можно сделать, не записывая и не обновляя данные в таблицах. Вы выбрали именно худший из них. –

+0

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

-1

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

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') 

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

+0

Спасибо, он возвращает параметры процедуры, но как я могу запросить/прочитать содержимое параметра out (который является типом таблицы)? – Amiga500

+0

Этот ответ не затрагивает вопрос ОП. –

0

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

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

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