尝试在sqlActivity中使用脚本参数时:
{
"id" : "ActivityId_3zboU",
"schedule" : { "ref" : "DefaultSchedule" },
"scriptUri" : "s3://location_of_script/unload.sql",
"name" : "unload",
"runsOn" : { "ref" : "Ec2Instance" },
"scriptArgument" : [ "'s3://location_of_unload/#format(minusDays(@scheduledStartTime,1),'YYYY/MM/dd/hhmm/')}'", "'aws_access_key_id=????;aws_secret_access_key=*******'" ],
"type" : "SqlActivity",
"dependsOn" : { "ref" : "ActivityId_YY69k" },
"database" : { "ref" : "RedshiftCluster" }
}
其中unload.sql脚本包含:
unload ('
select *
from tbl1
')
to ?
credentials ?
delimiter ',' GZIP;
或:
unload ('
select *
from tbl1
')
to ?::VARCHAR(255)
credentials ?::VARCHAR(255)
delimiter ',' GZIP;
进程失败:
syntax error at or near "$1" Position
知道我做错了吗?
答案 0 :(得分:4)
这是从psql shell运行良好的脚本:
insert into tempsdf select * from source where source.id = '123';
以下是我使用数据管道对 SqlActivity 进行的一些测试:
测试1 :使用?&#39>
insert into mytable select * from source where source.id = ?;
- 如果通过'脚本使用,则可以正常使用'和' scriptURI' SqlActivity对象上的选项。
其中"ScriptArgument" : "123"
测试2:当使用'脚本'指定命令时,使用参数有效。仅限选项
insert into #{myTable} select * from source where source.id = ?;
- 如果通过'脚本'仅限选项
insert into #{myTable} select * from source where source.id = #{myId};
其中#{myTable}
,#{myId}
是参数,其值可以在模板中声明。
http://docs.aws.amazon.com/datapipeline/latest/DeveloperGuide/dp-custom-templates.html
(当您仅使用参数时,请确保删除未使用的参数 scriptArguments - 否则它仍然会抛出错误)
失败的测试和推论:
插入? select from from source where source.id =?;
插入?从source中选择*,其中source.id =' 123';
上述两个命令都不起作用,因为
表名不能用于脚本参数的占位符。 '?''只能用于传递比较条件和列值的值。
从源代码中插入#{myTable} select *,其中source.id =#{myId}; - 如果用作' SciptURI'
从源中插入tempsdf select *,其中source.id =#{myId}; - 与'' ScriptURI'一起使用时不起作用
以上2个命令不起作用,因为
如果脚本存储在S3中,则无法评估参数。
从源中插入tempsdf select *,其中source.id = $ 1; - 无法使用' scriptURI'
插入tempsdf值($ 1,$ 2,$ 3); - 不起作用。
使用$' s - 不能以任何组合工作
其他测试:
" ScriptArgument" :" 123" " ScriptArgument" :" 456" " ScriptArgument" :" 789"
insert into tempsdf values (?,?,?);
- 兼作scriptURI,脚本并转换为insert into tempsdf values ('123','456','789');
scriptArguments将遵循您插入的顺序并替换"?"在 脚本。
答案 1 :(得分:1)
我们在shell脚本(.sh)中使用$ 1 $ 2指定两个要访问的scriptArguments
" scriptArgument" :"' s3:// location_of_unload / #format(minusDays(@ scheduledStartTime,1),' YYYY / MM / dd / hhmm /')}'&# 34;,#可以使用$ 1加入 " scriptArgument" :"' aws_access_key_id = ????; aws_secret_access_key = *******'" #可以使用$ 2
加入我不知道这对你有用。
答案 2 :(得分:0)
我相信你正在使用这个sql活动进行Redshift。你能修改你的sql脚本,使用它们的位置表示法来引用参数。 要引用sql语句本身中的参数,请使用$ 1,$ 2等
请参阅http://www.postgresql.org/docs/9.1/static/sql-prepare.html