0

I need to run a .sql file in Golang with Sql Plus, which creates a table and a file named tb_data_20180502104923. I named the .sql script as tb_data_20180502104923.sql with contents as follows:

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

I have tried this with os/exec like this:

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)
    }
}

Which return me an error message:

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

And if I change the cmd := exec.Command statement to:

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

It return me nothing, and both tabel & file tb_data_20180502104923 did not created.

Where did I do it wrong, or is using Sql Plus not possible in Golang? And if it's not possible, is there any other way to do what I need?

2
  • 1
    To run the command sqlplus user/pass@connect @scriptname in go, try exec.Command("sqlplus", "user/pass@connect", "@scriptname") Commented May 2, 2018 at 7:07
  • Thanks for your comment Mark, but I have solved my own question. It's just my poor understanding. I've post the solution of this problem below Commented May 2, 2018 at 7:11

1 Answer 1

1

Allright, nevermind, looks like it's just my poor understanding on how to use os/exec.

So in case someone doesn't know how to use it, here how I solve my own problem.

I change

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

to

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

The first parameter bash is the kind of Shell you want to use,

the second parameter -c is the argument of bash,

and the third parameter is the command which I want to execute.

Well, correct me if I'm wrong.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.