4

補遺:Stata 14の時点で、揮発性テーブルはハッキングなしで機能します。

一時的な揮発性テーブルを操作するためにStataを微調整する方法はありますか?これらのテーブルとデータは、ユーザーがセッションからログオフした後に削除されます。

これは、StataとTeradataで使用している簡単なおもちゃのSQLクエリの例です。

odbc load,  exec("
    BEGIN TRANSACTION;
    CREATE VOLATILE MULTISET TABLE vol_tab AS (
        SELECT TOP 10 user_id
        FROM dw_users
    ) WITH DATA
    PRIMARY INDEX(user_id)
    ON COMMIT PRESERVE ROWS;

    SELECT * FROM vol_tab;
    END TRANSACTION;
") dsn("mozart");

これは私が受け取っているエラーメッセージです:

The ODBC driver reported the following diagnostics
[Teradata][ODBC Teradata Driver][Teradata Database] Only an ET or null statement is legal after a DDL Statement.
SQLSTATE=25000
r(682);

Stataエラーコードの意味は次のとおりです。

エラー 。。。。。。。。。。。。。。。。。。。。。。。。戻りコード682はodbcdsnに接続できませんでした。これは通常、不正なユーザー名やパスワードなどの不正な権限が原因で発生します。set debug onを使用して、ODBCドライバーによって生成された実際のエラーメッセージを表示します。

「SELECTTOP10...」クエリを実行するだけでデータをプルできるので、許可があれば問題ありません。デバッグをオンに設定しましたが、追加情報が生成されませんでした。

セッションモードはTeradataです。ODBCマネージャーはunixODBCに設定されています。UbuntuサーバーでStata13.1を使用しています。

根本的な問題は、SQLステートメントごとに個別の接続が確立されているため、selectが発行されるまでに揮発性テーブルが蒸発することであると考えられます。これを確認するためのテクニカルサポートを待っています。

コマンドをうまく使用してみodbc sqlfileましたが、最後に永続テーブルを作成しない限り、このアプローチは機能しません。にはロードオプションはありませんodbc sqlfile

揮発性テーブルはSASとRで問題なく機能するようです。たとえば、これは完全に機能します。

library("RODBC")
db <- odbcConnect("mozart")
sqlQuery(db,"CREATE VOLATILE MULTISET TABLE vol_tab AS (
         SELECT TOP 10 user_id
         FROM dw_users
     ) WITH DATA
     PRIMARY INDEX(user_id)
     ON COMMIT PRESERVE ROWS;
")
data<- sqlQuery(db,"select * from vol_tab;",rows_at_time=1)

おそらくこれは、DBへの接続が。まで開いたままであるためclose(db)です。

4

4 に答える 4

3

私は Stata に詳しくありませんが、ODBC が「ANSI」モードで接続していると思います。create volatile tableこれをとselectステートメントの間に追加してみてください。

commit work;

それでもうまくいかない場合は、何らかの方法で 2 つの別々の呼び出しを行う必要があるかもしれません。

更新: これについてもう少し考えて、おそらくこれを試すことができます:

odbc load, exec("select distinct user_id from dw_users where cast(date_confirm as
date) > '2011-09-15'") clear dsn("mozart") lowercase;

つまり、クエリを 1 ステップで実行するだけです。揮発性のテーブルを作成しようとしないでください。

于 2013-02-13T20:10:06.833 に答える
2

接続モードを TERADATA として次のことを試してみるとどうなりますか (これは多くの場合、デフォルトではありません)。

odbc load, exec("BT; create volatile table new_usr as
(select top 10 user_id from dw_users) with data primary index(user_id) on commit
preserve rows; 
ET;

select * from new_usr;") clear dsn("mozart") lowercase;

BT;andステートメントはET;、間に含まれる SQL を明示的なトランザクションにラップします。この SQL は、使用しているツールにアクセスできないため、SQL Assistant でテストされています。通常、BTおよびETは、正常に完了する必要がある論理トランザクション (または作業単位) を強制するために使用されます。そうしないと、すべてがロールバックされます。これにより、ツールで発生している問題を回避できる場合があります。

編集

揮発性テーブルの作成を BT および ET でラップできない場合、タスクを完了するために必要なすべてのロジックを埋め込み、Stata からストアド プロシージャまたはマクロを呼び出すことができるストアド プロシージャまたはマクロを作成できますか?

于 2013-02-20T15:19:15.727 に答える