有人能告诉我是否可以在数据库中运行shell脚本吗?
脚本:
使用数据库informix。我在一个文件中有一个脚本有多个insert语句。我正在打开数据库连接。创建一些临时表并执行一些连接。为了将数据加载到临时表中,我需要那个“文件”中的insert语句。
问题:
是否有方法或解决方法可以让我在数据库控制台内的该文件中运行命令?由于我正在创建几个临时表,我无法关闭数据库连接。
最佳答案
要将脚本传递到命令行上的数据库连接,请执行以下操作:
dbaccess [databasename] file.sql
或
dbaccess filename.sql
(如果文件顶部包含
DATABASE
语句。)要在处理该文件时插入数据,请确保该文件包含以下内容:
CREATE TEMP TABLE foo (bar INT, baz CHAR(10));
LOAD FROM "foodata.unl" DELIMITER "|"
INSERT INTO foo;
SELECT ...
更新到原始答案
要在shell脚本中嵌入sql,可以使用“here document”方法,我认为这正是您所指的方法:
#!/bin/ksh
echo "Starting"
dbaccess << EOSQL
DATABASE foo;
CREATE TEMP TABLE foobar (foo INT, bar CHAR(10));
LOAD FROM "foobar.unl" DELIMITER "|"
INSERT INTO foobar;
SELECT ...
UPDATE ...
EOSQL
echo "Finished"
现在,如果需要的话,可以使用脚本或环境变量调整sql的行为……
SELECT * FROM foobar WHERE bar > $VALUE;
其中
$VALUE
将由shell在运行时为您插入,并像硬编码一样馈送到informix数据库。您甚至可以通过嵌入一个子shell进程来注入整个sql…
dbaccess << EOSQL
DATABASE foo;
CREATE TEMP TABLE ...
`cat $PATH_TO/some_more_sql_in_an_external_file.sql`
UPDATE ...
EOSQL
甚至dbaccess进程也会将其视为here文档的一部分(但这是一件罕见的、坦率地说相当奇怪的事情)。
但是,如果您要问的是,您是否可以以某种方式暂停或中断查询,以便以某种方式影响它,检查临时表的内容或以某种方式更改它,答案是否定的,您不能。
还有一个技巧值得记住。将环境变量
DBACCNOIGN
设置为非零值将强制HERE DOC SQL处理中的任何错误中止整个处理链。dbaccess的默认行为是报告错误并转到下一条语句。我希望这会有帮助。