1

Webは、非常に一般的であるはずの何かの実例が少し不足しているようです。「Getmesomerecords」のわかりやすいジェーンの例。これは私の初めてのストアドプロシージャであり、必要なのはいくつかのレコードを表示することだけです。なぜそんなにひっくり返るのですか?;-)うまくいく例を1つ手に入れることができれば、そこから実際に使用できるものに調整できると思います。これは私がウェブ上で見つけた別の例から取られています。CURSOR宣言はある種の構文エラーであるため、コンパイルされません。

CREATE PROCEDURE "SCHEMA"."GETRESULTSET (
    IN "p1" VARCHAR(30))
DYNAMIC RESULT SETS 1
BEGIN       
DECLARE CURSOR cur1 WITH RETURN ONLY TO CLIENT FOR 
 SELECT partitioninfo FROM SCHEMA.SessionInfo where username = p1;    
  OPEN cur1;    
END;

とにかく、確かに手がかりを使うことができます。CURSORがSQLとは別に宣言された例を見ましたが、変数がVARCHARとして宣言されたときに変数をSQLに取り込む方法を示す例はありませんでした。私が取り組んでいる例はかなり古いものでしたが、私が見つけた中で最高のものです。

4

1 に答える 1

1

Teradata MACROは、あなたが説明したことに対してより良いソリューションになるでしょう。

REPLACE MACRO [MyDB].GetResultSet(p1 VARCHAR(30)) AS (
SELECT "Partition"
  FROM DBC.SessionInfo
 WHERE UserName = :p1;
);

EXEC MyDB.GetResultSet

ストアドプロシージャを使用して、他の一般的なデータベースシステム(Oracle、SQL Serverなど)で使用されるタスクカーソルベースのロジックを実行できますが、Teradataのプログラミング習慣が悪くなる可能性があります。一般に、Teradataで大きなカーソルを処理すると、パフォーマンスが低下します。他のDBMSでカーソルを使用したことの多くは、可能な場合はSETベースのロジックで実行する方が適切です。

そうは言っても、Teradataでカーソルを正常に使用して、条件付きロジックまたは動的SQL処理を必要とする特定のタスクを実行できます。これがお役に立てば幸いです。より具体的な例があれば、サポートが必要です。喜んでいくつかの提案を提供します。

編集: プロシージャのこのDDLは、Teradata13.10に対して機能します。

CREATE PROCEDURE "SCHEMA"."GETRESULTSET" (
    IN "p1" VARCHAR(30))
DYNAMIC RESULT SETS 1
BEGIN       
DECLARE cur1 CURSOR WITH RETURN ONLY TO CLIENT FOR 
 SELECT "Partition" FROM "SCHEMA".SessionInfo where username = p1;    
  OPEN cur1;    
END;

カーソル名は、CURSORキーワードの前に置く必要があります。PartitionInfoは、DBC.SessionInfoの有効な列ではありません。「スキーマ」がMyBatisに置き換えられるかどうかわからないため、SELECTステートメントを微調整する必要がある場合があります。

于 2012-07-27T18:59:24.543 に答える