2013-02-15 14 views
2

среды: HP-UX 11.x C++ (Proc & AcC компилятор) Oracle 10g)Невозможно выполнить SELECT MAX (ORA_ROWSCN) от встроенного SQL

Я не смог выполнить следующую команду из папки 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» должен быть объявлен ».

В любом случае, спасибо Dominic

+0

вы пробовали завернув в динамическом блоке SQL, чтобы скрыть это от Pro * C компилятора, чтобы увидеть, если это работает? 'Т.е. используя что-то например 'EXEC SQL PREPARE sql_stmt FROM: select_stmt;' где 'select_stmt' - ваш массив' char', который содержит 'select max (a.ora_rowscn) из table_name a'? – 2013-02-15 08:13:00

+0

Спасибо Доминик, это предложение отлично работает – user2074402

+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