Выполнить команду SQL Plus на Голанге - PullRequest
0 голосов
/ 02 мая 2018

Мне нужно запустить файл .sql в Golang с Sql Plus, который создает таблицу и файл с именем tb_data_20180502104923. Я назвал скрипт .sql как tb_data_20180502104923.sql со следующим содержанием:

set headsep off
set pagesize 0
set trimspool on
set trimout on
create table tb_data_20180502104923
as
select * from tb_data;
spool tb_data_20180502104923.txt
SELECT data_id||';'||data_content FROM tb_data_20180502104923;
spool off

Я пробовал это с os/exec вот так:

func main(){
    cmd := exec.Command("sqlplus -s admin/123#@172.10.1.211:1521/orcl < tb_data_20180502104923.sql")

    var out, stderr bytes.Buffer

    cmd.Stdout = &out
    cmd.Stderr = &stderr

    err := cmd.Run()
    if err != nil {
        log.Fatalf("Error executing query. Command Output: %+v\n: %+v, %v", out.String(), stderr.String(), err)
    }
}

Который возвращает мне сообщение об ошибке:

2018/05/02 11:06:46 Error executing query. Command Output: 
: , fork/exec sqlplus -s admin/123#@172.10.1.1:1521/orcl < tb_data_20180502104923.sql: no such file or directory
exit status 1

И если я изменю оператор cmd := exec.Command на:

cmd := exec.Command("sqlplus", "-s", "admin/123#@172.10.1.211:1521/orcl", "< tb_data_20180502104923.sql")

Он мне ничего не возвращает, и оба файла tabel & file tb_data_20180502104923 не созданы.

Где я сделал это неправильно, или использование Sql Plus на Голанге невозможно? И если это невозможно, есть ли другой способ сделать то, что мне нужно?

1 Ответ

0 голосов
/ 02 мая 2018

Хорошо, неважно, похоже, что это просто мое плохое понимание того, как использовать os/exec.

Так что, если кто-то не знает, как его использовать, вот как я решаю свою собственную проблему.

я меняю

cmd := exec.Command("sqlplus", "-s", "admin/123#@172.10.1.211:1521/orcl", "< tb_data_20180502104923.sql")

до

cmd := exec.Command("bash", "-c", "sqlplus -s admin/123#@172.10.1.211:1521/orcl < tb_data_20180502104923.sql")

Первый параметр bash - это тип оболочки, который вы хотите использовать,

второй параметр -c является аргументом bash,

и третий параметр - это command, который я хочу выполнить.

Ну, поправьте меня, если я ошибаюсь.

...