2016-07-11 9 views
2

私はコードをオフからコピーしました。ドキュメント:インターシステムキャッシュ:埋め込みSQLは常に最初の行だけを返します

&sql(SELECT *,%ID INTO :tflds() 
     FROM Sample.Person) 
    IF SQLCODE=0 { 
    SET firstflds=14 
    FOR i=0:1:firstflds { 
     IF $DATA(tflds(i)) { 
     WRITE "field ",i," = ",tflds(i),! } 
    } } 
    ELSE {WRITE "SQLCODE error=",SQLCODE,! } 

ただし、何らかの理由で最初の行のすべてのフィールドのみを返します。それはバグですか、それとも間違っているのですか?

答えて

5

カーソルを使用してSQLクエリ結果の行をループする必要があります。

&sql(declare c1 cursor for SELECT *,%ID INTO :tflds() 
    FROM Sample.Person) 

&sql(open c1) 
for { 
    &sql(fetch c1) 
    quit:SQLCODE'=0 
    set firstflds=14 
    for i=0:1:firstflds { 
     if $Data(tflds(i)) { 
      write "field ",i," = ",tflds(i),! 
     } 
    } 
    write "===NEXT ROW===",! 
} 

&sql(close c1) 

+0

ありがとうございます。これらのドキュメントは何らかの理由で本当に読みにくく、非常に混乱し、時にはあまり明確ではありません。 –

1

組み込みSQLは、パフォーマンスのための優れたツールです詳細はhttp://docs.intersystems.com/latest/csp/docbook/DocBook.UI.Page.cls?KEY=GSQL_esql#GSQL_esql_cursorを参照してください - 機密性の高い操作が、確かにハードあなたが複数の行を取得する必要がある場合に対処します。このすべてのカーソルビジネスは苦痛です。

代わりに動的SQLを使用することを検討してください。それは良い結果セットのようなインターフェイスを持っています。

関連する問題