2012-02-23 51 views
0

首先,如果已经有人问我已经被彻底搜索过了,但是似乎无法找到答案,对不起。在cobol中读取并执行sql语句

这是学校的一个项目,我们也认识到这一点可以在一个更有效的方式来解决,但是这是不是一种选择。

所以这里的问题是:

  1. 我们必须使用Microsoft SQL Server 2008 R2,在这里我们有一个空数据库。
  2. 使用Cobol语言,我们必须创建所有的表,使用参数文件sqlstatements.sql(AI阅读每一个语句,执行它们,等等。

我们遇到我们的问题(并且甚至我们教师不能解决ATM)是:

  1. SQL语句都在一个非常奇怪的方式被读取(声明是随机扰码)
  2. 似乎我们并不拥有任何权利实际上编辑数据库。

这里是COBOL代码:

IDENTIFICATION DIVISION. 
    PROGRAM-ID. DB_connection. 

    INPUT-OUTPUT SECTION. 
    FILE-CONTROL. 
    SELECT sqlscript assign to "databaseScript.sql" 
    ORGANIZATION IS LINE SEQUENTIAL. 
    SELECT logfile assign to "logfile.txt" 
    ORGANIZATION IS LINE SEQUENTIAL. 
    DATA DIVISION. 
    FILE SECTION. 
    FD sqlscript. 
    01 sqlstatement. 
    FD logfile. 
    01 logrecord. 
    03 logline pic x(100). 
    WORKING-STORAGE SECTION. 
    EXEC SQL 
    BEGIN DECLARE SECTION 
    END-EXEC 

    * SQLCODE is 0 for success, 100 for no data, -1 for failure 
    01 SQLCODE PIC S9(3). 

    * SQLSTATE is a 5 character communication code; 00xxx is success. 
    01 SQLSTATE PIC X(5). 

    01 JdbcString PIC X(255). 

    EXEC SQL 
    END DECLARE SECTION 
    END-EXEC 
    01 einde   pic X value '0'. 
    88 einde-bestand value '1'. 

    PROCEDURE DIVISION. 
    MAIN-PARAGRAPH. 
    * Initial code 
    OPEN INPUT sqlscript 
    OPEN EXTEND logfile 
    PERFORM DO-CONNECT 

    DISPLAY "After connecting to the database:" 

    DISPLAY "SQLCODE= " + SQLCODE. 
    DISPLAY "SQLSTATE= " + SQLSTATE 
    DISPLAY "Connectie met java succes." 

    IF sqlcode = 0 
    MOVE "Connectie succesvol" to logline 
    WRITE logrecord 
    DISPLAY "Writing to logfile" 
    END-IF 


    PERFORM LEESSQLBESTAND 
    * lees sql bestand, read entry'sz 
    * Use the database  
    CLOSE sqlscript 
    CLOSE logfile 
    PERFORM DO-DISCONNECT 
    ACCEPT SQLSTATE 
    * Terminate the program  
    GOBACK 

    * The SQL connect statement must be completed with the information 
    * appropriate to the actual JDBC driver in use. JDBC stands for 
    * Java DataBase Connectivity, and it is the method by which PERCobol 
    * accesses databases and database-like data sources. 
    * 
    * The JDBC driver itself must be included in the Java library path 
    * in order to successfully connect to the database. The JDBC driver 
    * is generally included with the database itself; see the database 
    * documentation for more details. 
    * 
    * When connecting to a datasource, the jdbc:url may be 
    * ds:data-source-name. 
    * 
    * jdbc:url  The JDBC url to the database itself  
    * com.driver.name This is the classname of the driver 
    * 
    DO-CONNECT. 

    STRING "jdbc:sqlserver://localhost\SQLEXPRESS;" 
    DELIMITED BY SIZE 
    "databaseName=ProjectManagement;" 
    DELIMITED BY SIZE 
    "userName=admin;password=broforce" 
    DELIMITED BY SIZE 
    INTO JdbcString 

    EXEC SQL 
    CONNECT 
     TO :JdbcString   
     DRIVER "com.microsoft.sqlserver.jdbc.SQLServerDriver"     
    END-EXEC. 

    LEESSQLBESTAND. 
    READ sqlscript 
    AT END DISPLAY 'LEEG SQL BESTAND' MOVE '1' TO einde 
    MOVE "Leeg SQL-Bestand" to logline 
    NOT AT END DISPLAY 'MINSTENS 1 SQL STATEMENT' 
    MOVE "Queries found..." to logline 
    END-READ 
    WRITE logrecord 

    PERFORM UNTIL einde = 1 
      MOVE sqlstatement to logline 
      EXEC SQL 
        EXECUTE sqlstatement 
      END-EXEC 
      IF sqlcode < 0 
      move "failed" to logline 
      WRITE logrecord 
      END-IF 
      IF sqlcode = 0 
      move "succes" to logline 
      WRITE logrecord 
      END-IF 

      READ sqlscript 
      AT END DISPLAY 'EINDE SQL BESTAND' 
      MOVE '1' TO einde 
      MOVE "Einde Bestand" to logline 
      END-READ 
      WRITE logrecord 
    EXEC SQL COMMIT WORK END-EXEC  
    END-PERFORM 


    * Disconnect from the SQL database connection. This allows the 
    * JDBC driver to free any resources required for the connection. 


    DO-DISCONNECT. 
    EXEC SQL 
    DISCONNECT 
    END-EXEC. 

我在这里干什么什么了吗?我们处于亏损状态。

+1

COBOL仍然被教导? – gbn 2012-02-23 15:20:56

+4

与流行的观点相反,COBOL仍然是一种非常活跃的语言。不是每年发布的新代码,但COBOL代码库非常庞大。 – Chris 2012-02-23 15:23:35

+0

不幸的是,是的^^我们真的宁愿编程,但这是一个非常重要的任务。 – SkyronWtr 2012-02-23 15:25:12

回答

0

随机加扰,假设我正在解释什么是正确的,通常意味着您要么需要初始化您正在读取的变量(剩余数据将您的工作存储装满)或者要在两者之间移动数据不兼容的类型或错误大小的字段。由于你的sqlstatement没有图片条款(这是甚么工作原理?)很难说出那里有什么问题。

就权限的问题而言,我只在IBM/DB2环境中有经验,但我总是必须为DB2中的个人程序设置权限,以允许修改我的基础。

+0

我正在Windows 7上执行此操作,PerCobol安装 - 正在查看服务器问题,现在我只是试图让sql语句正确。我没有写图片子句的原因是我不能在这个.sql文件中定义一行或一个sql语句的长度 - 你有什么建议? – SkyronWtr 2012-02-24 15:50:21

1

COBOL面向固定长度的记录,但它可以轻松处理可变长度的记录。

... 
FD sqlscript 
    record is varying in size 
    depending on sqlstatement-length. 
01 sqlstatement. 
    05 filler pic x occurs 0 to 9999 times 
     depending on sqlstatement-length. 
... 
working-storage 
... 
01 sqlstatement-length pic 9(4) binary. 
... 
procedure division. 
... 
read sqlscript 
*then you can use sqlstatement-length to grab what you need 
*you might want to add if sqlstatement-length = zero logic for blank lines 
move sqlstatement(1:sqlstatement-length) to wherever