谁能告诉我是否可以在数据库中运行 shell 脚本。
场景:
使用数据库 Informix。我在具有多个插入语句的文件中有一个脚本。我正在打开数据库连接。创建一些临时表并执行一些连接。为了将数据加载到临时表中,我需要在该"file"中插入语句。
问题:
有没有办法或解决方法,以便我可以在数据库控制台内的该文件中运行命令?当我创建多个临时表时,我无法关闭数据库连接。
最佳答案
要在命令行上将脚本传递到数据库连接,请执行以下操作:
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,您可以使用“此处文档”方法,我认为这就是您所暗示的:
#!/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 进程来注入(inject)整个 SQL...
dbaccess << EOSQL
DATABASE foo;
CREATE TEMP TABLE ...
`cat $PATH_TO/some_more_sql_in_an_external_file.sql`
UPDATE ...
EOSQL
即使如此,dbaccess 进程也会将其视为此处文档的全部内容(但这是一种罕见且坦率地说非常奇怪的事情)。
但是,如果您要问的是您能否以某种方式暂停或中断查询以以某种方式影响它、检查临时表的内容或以某种方式更改它,答案是不,你不能。
还有一个值得记住的技巧。将环境变量 DBACCNOIGN
设置为非零值将强制此处 doc SQL 处理中的任何错误中止整个处理链。 dbaccess 的默认行为是报告错误并转到下一条语句。
希望对您有所帮助。
关于database - 如何在数据库控制台内的文件中运行命令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13881627/