2

環境: HP-UX 11.x C++ (ProC & aCC コンパイラ) Oracle 10g)

C++ Embedded SQL コードから次のコマンドを実行できません

EXEC SQL SELECT MAX(ORA_ROWSCN) INTO :scn_timestamp
FROM table_name ;

私が行っている変更は、既存のファイルに対するものです。以下は、コンパイラ エラーを示す自動ビルド スクリプトからの抜粋です。

/data/tsd_oracle/hpux/10.2.0.2/bin/proc +z ireclen=200 ORECLEN=200 LRECLEN=208 code=cpp cpp_suffix=C lines=yes sqlcheck=semantics maxopencursors=10 parse=PARTIAL unsafe_null=yes mode=oracle dbms=V8 sys_include='(/opt/aCC,/opt/aCC/include/iostream,/opt/aCC/include/rw,/usr/include)' include=/data/tsd_oracle/hpux/10.2.0.2/precomp/public include=/usr/include include=/opt/aCC/include include=/opt/aCC/include/SC iname=FILENAME.PC;

Pro*C/C++: Release 10.2.0.2.0 - Production on Fri Feb 15 12:48:35 2013

Copyright (c) 1982, 2005, Oracle. All rights reserved.

System default option values taken from: /data/tsd_oracle/hpux/10.2.0.2/precomp/admin/pcscfg.cfg

Error at line 81, column 5 in file FILENAME.PC
EXEC SQL SELECT MAX(ora_rowscn) INTO :scn_timestamp
....1
PLS-S-00201, identifier 'ORA_ROWSCN' must be declared
Error at line 81, column 5 in file FILENAME.PC
EXEC SQL SELECT MAX(ora_rowscn) INTO :scn_timestamp
....1
PLS-S-00000, SQL Statement ignored
Semantic error at line 81, column 5, file FILENAME.PC:
EXEC SQL SELECT MAX(ora_rowscn) INTO :scn_timestamp
....1
PCC-S-02346, PL/SQL found semantic errors
*** Error code 1
clearmake: Error: Build script failed for "FILENAME.C"

デフォルトのオプション値ファイル /data/tsd_oracle/hpux/10.2.0.2/precomp/admin/pcscfg.cfg の内容は次のとおりです。

sys_include=(/data/tsd_oracle/hpux/10.2.0.2/precomp/public,/usr/include)
ltype=short
define=ORASTDARG

次のようなコマンドのバリエーションも試しました

EXEC SQL SELECT MAX(A.ORA_ROWSCN) INTO :scn_timestamp
FROM table_name A;

ORA_ROWSCN 列が存在しないというエラーが表示されます。

この SQL クエリが SQLPlus コンソールで機能することを確認しました。埋め込まれたときにこれが機能しない特定の理由はありますか?

-------------------------------回避策---------------------- ----------

ドミニクの提案に基づいて、次を使用して必要なものを正常に取得できました

EXEC SQL PREPARE timestamp_stmt FROM 'SELECT MAX(A.ora_rowscn) FROM table_name A';
EXEC SQL DECLARE timestamp_cur CURSOR FOR timestamp_stmt;
EXEC SQL OPEN timestamp_cur;    
EXEC SQL FETCH timestamp_cur INTO :scn_timestamp;   
EXEC SQL CLOSE timestamp_cur;

この回避策には満足していますが、なぜ通常の方法で機能しないのかはまだ疑問に思っています。以前にカーソルを使用しようとしたこともあり、「識別子 'ORA_ROWSCN' を宣言する必要があります」という同じエラーが発生しました。

とにかく、ありがとうドミニク

4

1 に答える 1

0

それを動的SQLブロックにラップしてpro*cコンパイラから隠して、それが機能するかどうかを確認しましたか?

つまりEXEC SQL PREPARE sql_stmt FROM :select_stmt;、 select_stmt がchar含まれる配列のようなものを使用しますselect max(a.ora_rowscn) from table_name a

于 2013-02-16T08:44:47.993 に答える