1

有人可以告诉是否可以在数据库中运行 shell 脚本。

设想:

使用数据库 Informix。我在具有多个插入语句的文件中有一个脚本。我正在打开数据库连接。创建一些临时表并执行一些连接。为了将数据加载到临时表中,我需要该“文件”中的插入语句。

问题:

有没有办法或解决方法,以便我可以在数据库控制台内的该文件中运行命令?当我创建几个临时表时,我无法关闭数据库连接。

4

1 回答 1

7

要在命令行上将脚本传递给数据库连接,请执行以下操作:

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 ...

更新原始答案

要将 SQL 嵌入到 shell 脚本中,您可以使用“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;

shell 将在运行时为您插入where $VALUE,并像硬编码一样将其提供给 Informix 数据库。

您甚至可以通过嵌入一个子 shell 进程来注入整个 SQL...

dbaccess << EOSQL

    DATABASE foo;

    CREATE TEMP TABLE ...

    `cat $PATH_TO/some_more_sql_in_an_external_file.sql`

    UPDATE ...

EOSQL

即便如此,dbaccess 进程也会将其视为此处文档的全部内容(但这是一种罕见且坦率地说非常奇怪的事情)。

但是,如果您要问的是您能否以某种方式暂停或中断查询以以某种方式影响它,检查临时表的内容或以某种方式更改它,答案是否定的,您不能。

还有一个值得记住的技巧。将环境变量设置为DBACCNOIGN非零值将强制 here doc SQL 处理中的任何错误中止整个处理链。dbaccess 的默认行为是报告错误并移至下一条语句。

我希望这会有所帮助。

于 2012-12-15T06:13:21.970 回答