2017-12-11 6 views
0

新しいテーブルを作成するときに出力タイプの定義を繰り返すことなく、既存のプロシージャを呼び出してそのテーブルタイプのOUTパラメータを新しい物理テーブルに保存します。手順はテーブルタイプを繰り返さずに新しいテーブルにストアドプロシージャの出力を保存します

CREATE PROCEDURE MYPROC 
    (IN X INTEGER, OUT Y TABLE(A INTEGER, B DOUBLE, C NVARCHAR(25))) 
LANGUAGE SQLSCRIPT AS BEGIN 
... 
END; 

た場合たとえば、私は(A INTEGER, B DOUBLE, C NVARCHAR(25))一部を繰り返すことなく、出力のための物理的なテーブルを作成したいと思います。

私はすでに結果が欲しいと思う構造のテーブルを持っていればCREATE TABLE MY_OUTPUT LIKE EXISTING_TABLEできますが、私はできません。

プロシージャの出力タイプに定義されている名前付きタイプが既にある場合は、そのタイプに基づいてテーブルを作成できますが、そうではありません。

プロシージャの出力パラメータの代わりにサブクエリの場合は、CREATE TABLE MY_OUTPUT AS (<subquery>)とすることもできますが、サブクエリではないためサブクエリとして表現する方法はわかりません。また、複数の出力パラメータがあり、複数の出力パラメータでどのように動作させるかわかりません。

私の具体的なケースでは、関数はSAP HANA Predictive Analysis Libraryから来ているので、関数の定義方法を変更するオプションはありません。さらに、PALのパラメータの型の異常な柔軟な処理により、通常のSQLScriptプロシージャで使用できるソリューションを使用できなくなる可能性があると私は思っていますが、PALで失敗しても通常のプロシージャで使用できるソリューションにはまだ関心があります。

これを行う方法はありますか?

答えて

0

私が理解する限り、データベーステーブルを出力パラメータタイプとして使用したいとします。私のデフォルトのスキーマで

、私はCITY

という名前のデータベーステーブルを持って次のように私は、ストアドプロシージャを作成することができ、テーブルを使用して、出力パラメータの型として

CREATE PROCEDURE MyCityList (
    OUT CITYLIST CITY 
) 
LANGUAGE SQLSCRIPT 
AS 
BEGIN 

CITYLIST = SELECT * FROM CITY; 

END; 

手順の後に作成され、あなたが実行することができますそれここ

do 
begin 

declare myList CITY; 
call MyCityList(:myList); 
select * from :myList; 

end; 

出力データ、すなわちCITYテーブル

01のように、データベーステーブルの形式である結果であり、次のように私はこれがあなたの質問に答える願ってい

enter image description here

、最初のコメント 後

  • 更新シナリオは、最初のコメントで述べたように、反対の場合は、システムビューPROCEDURE_PARAMETER_COLUMNSを照会して、動的SQL文を作成することができますプロシージャ・テーブル・タイプのパラメータに定義付きのテーブルを生成します。

ここにはSQLクエリ

があります
select 
parameter_name, 
'CREATE Column Table ' || 
procedure_name || '_' 
|| parameter_name || ' (' || 

string_agg(
    column_name || ' ' || 
    data_type_name || 
    case when data_type_name = 'INTEGER' then '' else 
    '(' || length || ')' 
    end 

    , ',' 
) || ');' 

from PROCEDURE_PARAMETER_COLUMNS 
where 
    schema_name = 'A00077387' 
group by procedure_name, parameter_name 

あなたの場合に応じてWHERE句を置き換える必要があります。 各行は、そのような出力を有することになる

CREATE Column Table LISTCITIESBYCOUNTRYID_CITYLIST (CITYID INTEGER,NAME NVARCHAR(40)); 

テーブル名の形式は、プロシージャ名とパラメータ名の連結は

一つ最後のノート、いくつかのデータ・タイプ整数、小数などの長さを除いたような特別なコードが必要ですスケールの追加などがあります。このSQLでは処理されないものもあります。 すぐにクエリを強化し、更新を公開しようとします

+0

他の方法 - 私はプロシージャを持っており、プロシージャの出力タイプに一致するテーブルを作成したいと思います。 – user2357112

+0

PROCEDURE_PARAMETER_COLUMNSシステムビューには、ストアドプロシージャのパラメータの列情報があります。関連するスキーマでこれらをテーブルとして作成するためには、動的SQLを作成する必要があります – Eralper

関連する問題