файлы execute.sql на оракульной БД в сценарии оболочки - PullRequest
0 голосов
/ 20 сентября 2018

Я хочу выполнить .sql файлы, которые записаны с помощью команд sql * plus в Oracle DB из сценария оболочки.

Пример одного .sql файла, который вы можете увидеть ниже:

  SET DEFINE OFF;

  -- Changeset om-core/om-core.sys.db-changelog.xml::om-core-createUser.24.0.0::mlo
  -- Creating om-dashboard schema/user
  CREATE USER omcore27 IDENTIFIED BY omcore;
  GRANT CONNECT TO omcore27;
  GRANT CREATE TABLE TO omcore27;
  GRANT CREATE SEQUENCE TO omcore27;
  GRANT CREATE ANY INDEX, SELECT ANY TABLE TO omcore27;
  GRANT CREATE TRIGGER TO omcore27;
  GRANT CREATE PROCEDURE TO omcore27;
  GRANT UNLIMITED TABLESPACE TO omcore27;
  GRANT EXECUTE ON SYS.DBMS_AQADM to omcore27;
  GRANT EXECUTE ON SYS.DBMS_AQ to omcore27;
  ALTER USER omcore27 QUOTA UNLIMITED ON SYSTEM;
  GRANT SELECT ON SYS.DBA_RECYCLEBIN TO omcore27;
  GRANT EXECUTE ON DBMS_AQIN to omcore27;
  GRANT select on v_$sysmetric to omcore27;
  GRANT select on dba_hist_sysmetric_summary TO omcore27;
  GRANT create job TO omcore27;
  GRANT create external job TO omcore27;

  -- Changeset om-core/om-core.sys.db-changelog.xml::om-core-grantAQ.24.0.0::mlo
  begin
            DBMS_AQADM.GRANT_SYSTEM_PRIVILEGE (privilege => 'ENQUEUE_ANY', grantee => 'omcore27', admin_option => FALSE);
            DBMS_AQADM.GRANT_SYSTEM_PRIVILEGE (privilege => 'DEQUEUE_ANY', grantee => 'omcore27', admin_option => FALSE);
            DBMS_AQADM.GRANT_SYSTEM_PRIVILEGE (privilege => 'MANAGE_ANY', grantee => 'omcore27', admin_option => FALSE);
        end;/

Так что мне нужна команда оболочки для выполнения выше .sql файла в oracleDB.

Я уже пытался сделать это с помощью Java-программы, а затем запустить эту программу .jar из моей оболочкисценария, но я получаю эту ошибку:

 Line: SET DEFINE OFF;
 *** Error : java.sql.SQLSyntaxErrorException: ORA-00922: missing or invalid option

Это код моего класса DBScriptRunner:

public class DBScriptRunner {
    public static void main(String[] args) {
        try {
            String pathname = args[0];
            System.out.println("path name: " +pathname);
            executeScript(pathname);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    static void executeScript(String scriptFilePath) throws IOException, SQLException {
        // initialize script path
        // String scriptFilePath = "e:/script.sql";
        BufferedReader reader = null;
        Connection con = null;
        Statement statement = null;
        try {

            Class.forName("oracle.jdbc.driver.OracleDriver");
            // create connection
            con = DriverManager.getConnection("jdbc:oracle:thin:@//hostname:1521/romdb", "user",
                    "pwd");
            statement = con.createStatement();
            // initialize file reader
            reader = new BufferedReader(new FileReader(scriptFilePath));
            String line = null;
            // read script line by line
            while ((line = reader.readLine()) != null) {
                // execute query
                if (line.startsWith("--")|| line.isEmpty()) {
                    System.out.println("comment line or empty line: " + line);
                } else {
                    System.out.println("Line: " + line);
                    statement.execute(line);
                }

            }
        } catch (Exception e) {
            System.out.println("*** Error : "+e.toString());  
            System.out.println("*** ");  
            System.out.println("*** Error : ");  
            e.printStackTrace();
        } finally {
            // close file reader
            if (reader != null) {
                reader.close();
            }
            // close db connection
            if (con != null) {
                con.commit();
                con.close();
            }
        }
    }
} 

У вас есть идеи?

Ответы [ 2 ]

0 голосов
/ 20 сентября 2018

Ваш скрипт просто должен вызывать SQL * Plus.Предполагая, что переменные среды, связанные с Oracle, уже установлены в оболочке, из которой вы вызываете это, базовый формат:

sqlplus -l -s user/pwd@hostname:1521/romdb @your_script.sql

или если ваш скрипт не имеет exit в конце, с перенаправлением вместо:

sqlplus -l -s user/pwd@hostname:1521/romdb < your_script.sql

Флаг -l предотвращает повторную проверку учетных данных, если предоставленные не работают по какой-либо причине, что может быть особенно полезно при запуске сценария без присмотра.Флаг -s подавляет баннер SQL * Plus и отображение команд во время их выполнения.

Затем вы можете адаптировать и расширять его различными способами, например, для настройки среды в сценарии, для добавлениязахват вывода в файл журнала или скрытие учетных данных для входа в систему из командной строки, чтобы они не были видны ps и т. д. Последнее может выглядеть следующим образом:

sqlplus -s /nolog <<EOF
connect user/pwd@hostname:1521/romdb
@your_script.sql
EOF
0 голосов
/ 20 сентября 2018

Вы можете использовать ниже bash скрипт.

#!/usr/bin/env bash
username="username"
password="XXXXXXXXXXX"
db_ip="ipaddress"
port="1521"
sid=""
schema="schema"


echo "

select * from $schema.$tablename ;
## you can place all your queries here.
commmit;
exit
" | sqlplus -s "$username/$password@$db_ip:$port/$sid"

Надеюсь, это поможет.

Как показано выше, вы можете добавить свой файл .sql к команде sqlplus, как показано ниже

sqlplus -s "$username/$password@$db_ip:$port/$sid @script.sql"

...