2013-02-15 25 views
2

環境:HP-UX 11.x的C++(PROC & ACC編譯器)的Oracle 10g)不能從嵌入式SQL執行SELECT MAX(ORA_ROWSCN)

我無法從我的C++嵌入式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控制檯中的工作。嵌入時無法正常工作的特定原因?

---------------------------解決方法------------------ -------------

基於Dominic的建議,我是能夠成功地恢復使用以下

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'必須聲明」。

不管怎麼說,感謝多米尼克

+0

你嘗試過它包裹在一個動態的SQL塊從PRO * C編譯器隱藏起來,看看是否能工作?'即使用的東西

即像'EXEC SQL PREPARE sql_stmt FROM:select_stmt;'其中'select_stmt'是你的'char'數組,包含'select max_name(a.ora_rowscn)from table_name a'? – 2013-02-15 08:13:00

+0

謝謝多米尼克,那個建議很好用 – user2074402 2013-02-15 10:40:06

+0

啊。我已將其設置爲答案,以便您可以接受它 – 2013-02-16 08:45:15

回答

0

你嘗試它包裹在一個動態的SQL塊從PRO * C編譯器隱藏起來,看看是否可行?使用類似EXEC SQL PREPARE sql_stmt FROM :select_stmt;其中select_stmt是你char陣列包含select max(a.ora_rowscn) from table_name a