首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >创建使用用户定义的参数运行sql脚本的sh脚本

创建使用用户定义的参数运行sql脚本的sh脚本
EN

Stack Overflow用户
提问于 2020-07-16 17:19:14
回答 3查看 135关注 0票数 0

我是创建sh脚本的新手。我正在尝试创建一个.sh脚本,它将接受用户输入,并通过更新用户给出的参数来执行一个SQL脚本。

用户输入仅限于单个参数。要传递的参数是作业id -

代码语言:javascript
复制
Enter job id: 321
Confirm job id: 321

此作业id用于SQL代码的不同部分,代码摘录如下-

代码语言:javascript
复制
CREATE READABLE EXTERNAL TEMP TABLE JOBID_USER (
    cola numeric,
    colb bigint,
    )
LOCATION (
    'gpfdist://.../JOBID_USER_INFO_321.txt' --the job id is at the end of the file
)
FORMAT 'text' (header delimiter e',' null '' escape 'off') 
ENCODING 'latin9';
-------------------------------------------------------------------------------------------

CREATE TABLE AS 
SELECT * FROM schema.deliverytable_321 -- the job id is used to identify a table
        WHERE JOB_ID= 321              -- the job id is used as a condition
        AND asset_1 = 9999
DISTRIBUTE RANDOMLY;    

数据库是Postgres,我在Greenplum中手动执行脚本。任何帮助都将不胜感激。谢谢。

EN

回答 3

Stack Overflow用户

发布于 2020-07-16 17:51:18

这只是一个简单的想法。

将sql查询写在名为sample.sql的文件或其他文件中:

注:已将JobID替换为MY_VAR

代码语言:javascript
复制
CREATE READABLE EXTERNAL TEMP TABLE JOBID_USER (
    cola numeric,
    colb bigint,
    )
LOCATION (
    'gpfdist://.../JOBID_USER_INFO_MY_VAR.txt' --the job id is at the end of the file
)
FORMAT 'text' (header delimiter e',' null '' escape 'off') 
ENCODING 'latin9';
-------------------------------------------------------------------------------------------

CREATE TABLE AS 
SELECT * FROM schema.deliverytable_MY_VAR -- the job id is used to identify a table
        WHERE JOB_ID= MY_VAR              -- the job id is used as a condition
        AND asset_1 = 9999
DISTRIBUTE RANDOMLY;

现在使用这个名为sql_executor.sh的脚本:

代码语言:javascript
复制
#!/bin/bash 
sed "s/MY_VAR/$1" sample.sql | psql -U [USERNAME] -d [DATABASE_NAME]

用法:

代码语言:javascript
复制
sql_executor.sh 321
票数 2
EN

Stack Overflow用户

发布于 2020-07-16 17:31:02

这就是如何在bash中以交互方式获得输入

代码语言:javascript
复制
#!/bin/bash

printf "Enter job id:"
read -r JOBID
printf "Confirm job id:"
read -r JOBIDCONFIRM

[ "$JOBID" != "$JOBIDCONFIRM" ] && {
        echo "Jobid inputs have not the same value"
        exit
}

echo "Now you can use your jobid $JOBID anywhere in double quoted strings, like this sentence"

解释:

printf:回显字符串

read varname:等待用户输入并将其赋给varname变量

票数 1
EN

Stack Overflow用户

发布于 2020-07-16 23:07:32

psql有可用于参数的“变量”。例如:

代码语言:javascript
复制
cat foo.sql 
select :param1

SQL文件中的冒号表示它是一个变量。

要使用这个变量,只需使用psql传递一个值给它。

代码语言:javascript
复制
psql -f foo.sql -v param1="'bar'"
 ?column? 
----------
 bar
(1 row)

要从bash脚本执行此命令,可以使用bash变量。

代码语言:javascript
复制
cat runme.sql 
#!/bin/bash
param1="$1"
psql -f foo.sql -v param1="'$param1'"

注意:一定要对runme.sql进行chmod,这样才能执行它。

代码语言:javascript
复制
chmod 755 runme.sql

现在运行它。

代码语言:javascript
复制
./runme.sql foobar
 ?column? 
----------
 foobar
(1 row)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62931446

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档