如何在数据库控制台内的文件中运行命令?

Kun*_*mar 1 database informix

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

场景:

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

题:

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

RET*_*RET 7

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

dbaccess [databasename] file.sql
Run Code Online (Sandbox Code Playgroud)

要么

dbaccess filename.sql
Run Code Online (Sandbox Code Playgroud)

(如果文件DATABASE在顶部包含一个语句.)

要在处理该文件时插入数据,请确保该文件包含以下内容:

CREATE TEMP TABLE foo (bar INT, baz CHAR(10));
LOAD FROM "foodata.unl" DELIMITER "|"
INSERT INTO foo;

SELECT ...
Run Code Online (Sandbox Code Playgroud)

更新到原始答案

要在shell脚本中嵌入SQL,您可以使用"here here"方法,我认为这是您所指的:

#!/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"
Run Code Online (Sandbox Code Playgroud)

现在,如果需要,您可以使用脚本或环境变量调整该SQL的行为...

SELECT * FROM foobar WHERE bar > $VALUE;
Run Code Online (Sandbox Code Playgroud)

其中,$VALUE将在运行时,外壳为你进行插值,并输送到Informix数据库,如果它被硬编码.

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

dbaccess << EOSQL

    DATABASE foo;

    CREATE TEMP TABLE ...

    `cat $PATH_TO/some_more_sql_in_an_external_file.sql`

    UPDATE ...

EOSQL
Run Code Online (Sandbox Code Playgroud)

甚至那将由dbaccess进程处理,好像它都是这里的文档的一部分(但这是一个罕见的,坦率地说很奇怪的事情).

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

另一个值得记住的技巧.将环境变量设置为DBACCNOIGN非零值将强制在此doc SQL处理中的任何错误中止整个处理链.dbaccess的默认行为是报告错误并转到下一个语句.

我希望有所帮助.