Чтение и выполнение SQL-операторов в Cobol - PullRequest
0 голосов
/ 23 февраля 2012

Прежде всего, извините, если об этом уже спросили, я тщательно искал, но не могу найти ответ.

Это школьный проект, мы понимаем, что это можно решить вгораздо более эффективный способ, но это не вариант.

Так вот в чем проблема:

  1. Мы должны использовать Microsoft SQL Server 2008 R2, здесь у нас есть пустая база данных.
  2. Используя Cobol, мы должны создать все таблицы, используя файл параметров sqlstatements.sql (чтобы прочитать все операторы, выполнить их и т. Д.

Наша проблема, которую мы 'Мы столкнулись (и что даже наши учителя не могут решить atm) таково:

  1. операторы sql читаются очень странным образом (операторы шифруются случайным образом)
  2. у нас, похоже, нет никаких прав на редактирование базы данных.

Вот код кобола:

   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.

Я что-то здесь не так делаю?потеря.

Ответы [ 2 ]

1 голос
/ 27 февраля 2012

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
0 голосов
/ 23 февраля 2012

Случайное скремблирование, если я правильно понимаю, что это означает, обычно означает, что вам нужно либо инициализировать переменные, в которые вы читаете (оставшиеся данные портят ваше рабочее хранилище), либо что вы перемещаете данные между несовместимыми типы или поля неправильного размера. Поскольку в вашем sqlstatement отсутствует пункт с изображением (как это вообще работает?), Трудно сказать, что там не так.

Что касается разрешений, я имею опыт работы только в среде IBM / DB2, но мне всегда нужно получать разрешения, установленные для моей отдельной программы в самой DB2, чтобы можно было изменять мои базы.

...