脚本执行sql语句
你没有理解输入重定向的概念。在你上面的代码中,mysql -uDDAP -p$2是包含在输入重定向范围内的,所以不会提示你输入密码的。
你的$1 和$2也没有定义,可以参考如下写法:
#!/bin/sh
read -p "please input root password" pwd
mysql -uroot -p$pwd << EOF
\. /usr/src/DDAP-1.CreateUser.SQL
\. /usr/src/DDAP-2.CreateDatabase.SQL
\. /usr/src/DDAP-3.CreateTable.SQL
\. /usr/src/DDAP-4.CreateProcereAndFunction.SQL
\. /usr/src/DDAP-5.CreateData.SQL
EOF
‘贰’ Linux下如何运行sql脚本
Linux运行sql脚本的具体操作步骤如下:
1、使用shell工具登陆到安装postgresql的服务器,切换到postgres用户,postgresql默认的操作用户,命令是:su - postgres,查看当前路径是/var/lib/psql,创建一个test.sql脚本文件,命令是:vim test.sql。
‘叁’ 如何使用sqlcmd在批处理脚本中执行SQL
使用sqlcmd可以在批处理脚本中执行SQL。虽然这个命令的参数很多,但幸运的是,我们不需要全部理解,在这里简要介绍以下几个:x0dx0a{ -U login_id [ -P password ] } | _E trusted connection }] 如果指定了-E就不需要指定用户名密码,当然指定了用户名密码就不用-E了;x0dx0a-S server_name [ \ instance_name ] 数据库服务器,如果不在本机的话必须指定;x0dx0a-d db_name 数据库名字,必须的;x0dx0a[ -i input_file ] [ -o output_file ] sql存在文件里的话用-i,输出到文件用-o;x0dx0a[ -q "cmdline query" ] [ -Q "cmdline query" and exit ] 输入是简单的sql,不用文件,推荐用-Q,如果你执行完sqlcmd还需要执行别的动作的话;x0dx0a[ -W remove trailing spaces ] 删除多余的空格,结果会更紧凑。x0dx0a当我们在真正的脚本中执行sql时,通常需要传入和输出变量。x0dx0a传入变量比较简单,如下所示:x0dx0asqlcmd -d test -Q "select * from dbo.Investment where investor=$(x)" -v x='IBM' -Wx0dx0a这个语句从test数据库的Investment表中选出investor等于x的所有行,注意到变量x被包含在${}中。x0dx0a然后用-v定义了x的值,'IBM'。x0dx0a-W确定输出的结果不包含多余的空格。x0dx0ax的值如果没有在sqlcmd中设定,系统会试图从别的地方去寻找,可能的地方包括,系统环境变量,用户环境变量,以及用在sqlcmd之前用set设定的变量值。x0dx0a如果你的数据里确实包含${},那么你并不希望进行变量的替换,使用-x选项可以禁止变量的替换。x0dx0a有些时候,你还希望能获得sql执行结果并保存到变量中。比如你们的日志系统每天都在产生日志文件,你要执行一个脚本来处理这些日志文件并存到数据库中。在处理之前,你必须读取数据库以确定上次处理到那一天了。你期望这样能解决你的问题:x0dx0asqlcmd -d test -Q "select ${x}=max(date) from dbo.logDates " -Wx0dx0a但这样并不工作。因为sqlcmd并不提供输出变量。x0dx0a不过你可以这样做:x0dx0asqlcmd -d test -Q "declare @x nvarchar(8);select @x=max(date) from dbo.logDates;print @x; " -Wx0dx0a这样你就可以得到一个干干净净的数字,而不会包含列名和其他信息。x0dx0a接着你将上述结果导入到一个文件里:x0dx0asqlcmd -d test -Q "declare @x nvarchar(8);select @x=max(date) from dbo.logDates;print @x; " -W 1.txtx0dx0a现在到了最关键的一步,将文件的内容写入到变量里:x0dx0aset /P myvar=<1.txtx0dx0a/p表明这个变量myvar的值需要用户输入;x0dx0a<1.txt表明从1.txt中读入而不是从其他地方读入。x0dx0a这样,我们就巧妙的把sql执行的结果写入到变量里了。
‘肆’ 怎样让perl脚本中执行sql语句
首先得确保安装了数据库接口模块和相应数据库的驱动模块,如果是用MySql数据库(开源免费新手入门学习都喜欢),则需要确定DBI和DBD::mysql这两个模块是否安装;
然后在perl脚本中写:
!#usr/bin/perl -w
use strict;
use DBI; #使用DBI模块,DBD::mysql是驱动不必在脚本中使用,安装了就行
my $dbname = ""; #引号里填上数据库名
my $ip = ""; #引号里填上要访问的数据库的ip地址,数据库是本机就写127.0.0.1
my $port = ""; #引号里填上要访问的数据库的端口号,mysql默认端口号是3306
my $host = "dbi:mysql:" . $dbname . ":" . $ip . ":" . $port ;
my $user = "root"; #访问数据库使用的用户名
my $password = "xXxX"; #该用户名所使用的密码
my $dbh = DBI -> connect($host,$user,$password) or die "$@"; #与数据库建立连接
$dbh -> do("set names \'gbk\';"); #设置输出中文不乱码
while(1) #条件永远为真,除非人为终止,否则不会停止
{ #可以使用control+c停止脚本执行
my $sql = ""; #引号里填上sql语句
$sth = $dbh -> prepare($sql); #送入数据库做准备
$sth -> execute(); #执行这条sql语句
sleep(300); #设置300秒暂停执行,300秒后继续执行while
}
$dbh -> disconnect(); #断开与数据库的连接
这里使用的是最新的perl和最新的mysql最新,不是复制粘贴别人代码,前几天还在用,保证思路没有问题。