问题:我在C中嵌入的SQL语句编译和运行都很好。
但嵌入PL/SQL块在windows平台可以通过,在Linux下就不行预编译过不去。
我检查了$ORACLE_HOME/precomp/admin/pcscfg.cfg
缺省设置不行,改动了几个选项也不行。
哪位有经验请不吝赐教!以下是我的源码(在windows下用VC++和Pro*C/C++编译通过,可执行。)#include <stdio.h>
#include <string.h>
#include <strings.h>
#include <stdlib.h>
#include <sqlca.h>
EXEC SQL INCLUDE sqlca;void sql_error(msg)
   char *msg;
{
   printf("\n%s,%ld,%s\n", msg, sqlca.sqlcode, (char *)sqlca.sqlerrm.sqlerrmc);
   EXEC SQL ROLLBACK RELEASE;
   exit(1);
}int main()
{EXEC SQL BEGIN DECLARE SECTION;
    int i_EMPNO;                       
    char c_ENAME[10+1];                
    char c_JOB[9+1];                   
    int i_MGR;                         
    char c_HIREDATE[10+1];             
    int i_SAL;                         
    int i_COMM;                        
    int i_DEPTNO;                      
    VARCHAR username[10];
    VARCHAR password[10];
    VARCHAR dbstring[4];
    VARCHAR sqlstmt[80];EXEC SQL END DECLARE SECTION;    memset(c_ENAME, '\0', sizeof(c_ENAME));
    memset(c_JOB, '\0', sizeof(c_JOB));
    memset(c_HIREDATE, '\0', sizeof(c_HIREDATE));
    i_EMPNO = 0;
    i_MGR = 0;
    i_SAL = 0;
    i_COMM = 0;
    i_DEPTNO = 0;
    strcpy(username.arr,"scott");
    strcpy(password.arr,"tiger");
    strcpy(dbstring.arr,"orcl");
    username.len=strlen(username.arr);
    password.len=strlen(password.arr);
    dbstring.len=strlen(dbstring.arr);
    EXEC SQL WHENEVER SQLERROR DO sql_error("Connect Failed __");    EXEC SQL CONNECT :username IDENTIFIED BY :password USING:dbstring;
    EXEC SQL EXECUTE
             BEGIN
     SELECT EMPNO,
                    NVL(ENAME,''),
                    NVL(JOB,''),
    NVL(MGR,0),
    NVL(TO_CHAR(HIREDATE,'yyyy/mm/dd'),''),
    NVL(SAL,0),
    NVL(COMM,0),
    NVL(DEPTNO,0)
             INTO :i_EMPNO,
                  :c_ENAME,
          :c_JOB,
          :i_MGR,
          :c_HIREDATE,
          :i_SAL,
          :i_COMM,
          :i_DEPTNO
             FROM EMP
     WHERE EMPNO=7839;
     END;
    END-EXEC;
    EXEC SQL COMMIT WORK RELEASE;    printf("EMPNO = %d\n",i_EMPNO); 
    printf("ENAME = %s\n",c_ENAME); 
    printf("JOB = %s\n",c_JOB);
    printf("MGR = %d\n",i_MGR);
    printf("HIREDATE = %s\n",c_HIREDATE);
    printf("SAL = %d\n",i_SAL);
    printf("COMM = %d\n",i_COMM);
    printf("DEPTNO = %d\n",i_DEPTNO);    return(0);
}
配置文件
$ORACLE_HOME/precomp/admin/pcscfg.cfgTYPE_CODE=oracle
PARSE=none
MODE=oracle
CODE=ANSI_C
DYNAMIC=oracle
COMP_CHARSET=multi_byte
CHAR_MAP=charz
SQLCHECK=semantics
DBMS=native
DURATION=transaction
VERSION=recent
PREFETCH=1
MAXOPENCURSORS=10
SYS_INCLUDE=(/usr/include,/usr/lib/gcc-lib/i386-redhat-linux/3.2.2/include)
INCLUDE=/opt/oracle/product/9.2.0/precomp/public

解决方案 »

  1.   

    $ proc iname=dbTest.pcSemantic error at line 81, column 14, file dbConnect.pc:
        EXEC SQL EXECUTE
    .............1
    PCC-S-02345, SQLCHECK=SEMANTICS must be given when embedded PL/SQL blocks are us
    ed$ proc iname=dbTest.pc sqlcheck=semanticsError at line 100, column 7 in file dbConnect.pc
                 WHERE EMPNO=7839;
    ......1
    PLS-S-00201, identifier 'EMP' must be declared
    Error at line 83, column 7 in file dbConnect.pc
                 SELECT EMPNO,
    ......1
    PLS-S-00000, SQL Statement ignored
    Semantic error at line 82, column 14, file dbConnect.pc:
                 BEGIN
    .............1
    PCC-S-02346, PL/SQL found semantic errors
      

  2.   

    $ proc iname=dbTest.pc  sqlcheck=semantics userid=user/pass@tnsname
      

  3.   

    我感觉是配置文件的问题,请关注$ORACLE_HOME/precomp/admin/pcscfg.cfg可我不知道问题具体在哪个设置上.欢迎各位高手参加讨论!!!!
      

  4.   

    $ proc iname=dbTest.pc  sqlcheck=semantics userid=user/pass@tnsnamePro*C/C++: Release 9.2.0.1.0 - Production on Thu Jan 17 12:52:35 2002Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.System default option values taken from: /opt/oracle/product/9.2.0/precomp/admin
    /pcscfg.cfgPCC-F-02041, CMD-LINE:  Option does not exist:  usrid
      

  5.   

    $ proc iname=dbTest.pc  sqlcheck=semantics usrid=user/pass@tnsnamesorry,写错了,usrid写成userid了,你再试试如有错误,请贴错误信息,thanks
      

  6.   

    谢谢您.
    在执行的时候我更正了,我执行的语句是:
    $ proc iname=dbTest.pc sqlcheck=semantics usrid=scott/tiger@orcl结果如下:Pro*C/C++: Release 9.2.0.1.0 - Production on Thu Jan 17 13:14:07 2002Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.System default option values taken from: /opt/oracle/product/9.2.0/precomp/admin
    /pcscfg.cfgPCC-F-02041, CMD-LINE:  Option does not exist:  usrid
      

  7.   

    难道linux的PROC 的option有变化?
    你可以执行:
    $proc
    看看,有些什么参数,或许usrid在linux proc下叫另外一个名字
      

  8.   

    解决了.
    真脸红,就是 drabit(square) 说的问题.结分!!1