Why am I getting: database is locked, in an SQLite3 script? - sqlite

I'm getting an error when running an SQLite script.
--drop use table before replacing it
DROP TABLE IF EXISTS db.use;
--Create the use table in the saved database
CREATE TABLE db.use AS SELECT * FROM use2; -- this is the line that generates the error: Error: near line 145: database is locked
Are these two statements run asynchronously or something? I don't understand what's causing the error, but I'm wondering if it has to do with that.
Might there be a way to run the script in a lock-step manner, i.e. non-asynchronously?

This is how I was running the command: sqlite3 --init script_name.sql dbname.db, and elsewhere in the script I had an ATTACH statement reading the same database dbname.db. Essentially reading the same file twice.
The way I solved this was by executing the script in the sqlite3 shell:
sqlite3> .read script_name.sql

Have you tried to add a commit statement after the drop statement?
I think that would make sure the create table statement run after the drop statement is totally done.

Related

How can I quit sqlite from a command batch file?

I am trying to create a sealed command for my build pipeline which inserts data and quits.
So far I have created my data files
things-to-import-001.sql and 002 etc, which contains all the INSERT statements I'd like to run, with a file per table.
I have created a command file to run them
-- import-all.sql
.read ./things-to-import-001.sql
.read ./things-to-import-002.sql
.quit
However when I run my command
sqlite3 -init ./import-all.sql ./database.sqlite
..the data is inserted, but the program remains running and shows the sqlite> prompt, despite the .quit command. I have also tried using .exit 0.
From the sqlite3 --help
-init FILENAME read/process named file
Docs: https://www.sqlite.org/cli.html#reading_sql_from_a_file
How can I tell sqlite to exit once my inserts have finished?
I have managed to find a dirty workaround for this issue.
I have updated my import file to include a bad command, and executed using -bail to quit on first error.
-- import-all.sql
.read ./things-to-import-001.sql
.read ./things-to-import-002.sql
.fakeErrorToQuitWithBail
Then you can execute with
sqlite3 -init import-all.sql -bail
and it should quit with
Error: unknown command or invalid arguments: "fakeErrorToQuitWithBail". Enter ".help" for help
Try using ".exit" at the place of ".quit". For some reason SQLite dont doccumented this commands.
https://www.tutorialspoint.com/sqlite/sqlite_commands.htm

with sqlplus, how do i run an explain plan on a query in a file

generally, i can run a .sql file in windows like so:
SQL> #"longpath/sqlfile.sql"
and sqlplus will spit out the results of the query.
but i'm trying to run something like:
SQL> EXPLAIN PLAN FOR #"longpath/sqlfile.sql";
i'm getting an error
EXPLAIN PLAN FOR #"longpath/sqlfile.sql"
*
ERROR at line 1:
ORA-00905: missing keyword
not sure what keyword im missing...

Push/Export large datframe from R to Vertica database

I have a dataframe of 10M rows which needs to be uploaded back from R to Vertica Database.
The DBwrite() function from DBI is running into memory issues and I have tried increasing memory to 16g by
options(java.parameters = c("-XX:+UseConcMarkSweepGC", "-Xmx16g"))
Still the process is running into memory issue. I am planning to use bulk copy option of vertica to copy the csv file to create the table.
I have created an empty table on vertica
When I am executing the query
dbSendQuery(vertica, "COPY hpcom_usr.VM_test FROM LOCAL \'/opt/mount1/musoumit/MarketBasketAnalysis/Code/test.csv\' enclosed by \'\"\' DELIMITER \',\' direct REJECTED DATA \'./code/temp/rejected.txt\' EXCEPTIONS \'./code/temp/exceptions.txt\'")
I am running into this error.
Error in .verify.JDBC.result(r, "Unable to retrieve JDBC result set", :
Unable to retrieve JDBC result set
JDBC ERROR: [Vertica]JDBC A ResultSet was expected but not generated from query "COPY hpcom_usr.VM_test FROM LOCAL '/opt/mount1/musoumit/MarketBasketAnalysis/Code/test.csv' enclosed by '"' DELIMITER ',' direct REJECTED DATA './code/temp/rejected.txt' EXCEPTIONS './code/temp/exceptions.txt'". Query not executed.
Please help with what i'm doing wrong here.
Vertica also provides STDIN option aswell. Link
Please help me how can I execute this.
My Environment.
CENT OS 7
R 3.6.3 (No R Studio here I have to execute this from CLI)
Tidyverse 1.0.x
Vertica driver 9.x
System 128GB Memory and 28Core system.
Your problem is that you fire dbSendQuery() , which lives with a following dbFetch() and a final dbClearResult() - but only for query SQL statements - those that actually return a result set.
Vertica's COPY <table> FROM [LOCAL] 'file.ext' ... command is treated like a DML command. And for those - as this docu says ...
https://www.rdocumentation.org/packages/DBI/versions/0.5-1/topics/dbSendQuery
.. you need to use dbSendStatement() for data manipulation statements.
Have a go at it that way - good luck ...
dbSendUpdate(vertica, "COPY hpcom_usr.VM_test FROM LOCAL \'/opt/mount1/musoumit/MarketBasketAnalysis/Code/test.csv\' enclosed by \'\"\' DELIMITER \',\' direct REJECTED DATA \'./code/temp/rejected.txt\' EXCEPTIONS \'./code/temp/exceptions.txt\'")
instead of dbSendQuery did the trick for me.

how to include new line in scipt log which is calling sql file and that sql file is giving lot of errors

I have written a shell script which is calling another sql file, which is disabling triggers in oracle.
but this sql file is generating lot of oracle errors and in log file of script, I am getting response like
ORA-21021 -- oracle errros ORA-20111 -- oracle errors
I would like to add a new line getting the oracle errors something like
ORA-21021 --** oracle errors**
ORA-20111 --** oracle errors**
How this can be done?
sql file code:
alter trigger trigger_name1 disable;
alter trigger trigger_name2 disable;
alter trigger trigger_name3 disable;
alter trigger trigger_name4 disable;
alter trigger trigger_name4 disable;
A solution with perl
perl -pe 's/ORA-\d/\n$&/g' <oldfile >newfile
to add a newline before sequences ORA- followed by a number (\d)
I was able to achieve this by below method:
SQL=$(echo "$SQL" | sed -e 's/ERROR/\\n\rERROR/g')
echo $SQL

Oracle Exception Detail

I'm using Flyway 3.0 within ANT and I would like to know if the stack when an Oracle error occur could be more detailed.
Example: if my migration script contain this statement:
DROP TABLE FOO$;
And this table doesn't exist, I expect:
ORA-00942 : table or view does not exist
But I got:
Flyway Error: org.flywaydb.core.internal.dbsupport.FlywaySqlScriptException: Error executing statement at line 4: DROP TABLE FOO$
Not optimal for root cause analysis...
Any idea for better verbosity ?
You can use Ant's standard -d switch to reveal more info. If you feel the standard info should be improved, please file a bug report in the issue tracker.
Adding the -X option to the flyway command line will print debug output.

Resources