如何将列表作为参数从 powershell 插入到 SqlPlus
How to insert list as parameter from powershell to SqlPlus
我在文件中有一个类似这样的查询:
script.sql
select *
from test_table
where name in (&1)
这是我正在尝试进行的查询示例
我用一个强大的 shell 脚本来执行它,就像这样:
$names = '''Name1'', ''Name2'''
$params = '"' + $names + '"'
sqlplus -silent $username/$password@$tnsalias "@script.sql" $params
注意 $names
有一个可变的名称列表
但是当脚本执行时,参数会像这样替换:
former : where name in (&1)
new : where name in (Name1)
当然 SQL 会抛出错误。
为什么要这样替换参数?
我怎样才能实现我想做的事情,所以第一个参数是将在 where name in(&1)
子句中使用的字符串列表。我的目标是 sql 将是
where name in ('Name1', 'Name2')
如果有帮助,SQL 在 Oracle 11 上执行。
powershell 示例
$username_dba = "system"
$password_dba = "manager"
$tnsalias_db = "es"
$names = "'''Name1'',''Name2'', ''X'''"
$params = '"' + $names + '"'
$sqlfile = "@sqltest.sql"
Write-Host $names
Write-Host $params
C:\oracle\instantclient_11_2\sqlplus $username_dba/$password_dba@$tnsalias_db $sqlfile $params
输出powershell:
C:\upwork\Whosebug\param_sql>powershell .\sql_param.ps1
'''Name1'',''Name2'', ''X'''
"'''Name1'',''Name2'', ''X'''"
SQL*Plus: Release 11.2.0.4.0 Production on Fri Nov 15 11:46:49 2019
Copyright (c) 1982, 2013, Oracle. All rights reserved.
Connected to:
Oracle Database 11g Release 11.2.0.3.0 - 64bit Production
old 1: select sysdate from dual where DUMMY in (&&1 )
new 1: select sysdate from dual where DUMMY in ('Name1','Name2', 'X' )
SYSDATE
---------
15-NOV-19
Disconnected from Oracle Database 11g Release 11.2.0.3.0 - 64bit Production
bat 文件示例。
@echo off
set user_name=system
set password=manageresmd
set net_service_name=esmd
set param1='''test1'',''test22'',''X'''
C:\oracle\instantclient_11_2\sqlplus.exe %user_name%/%password%@%net_service_name% @sqltest.sql %param1%
pause
输出bat文件:
C:\upwork\Whosebug\param_sql>sqltest1.bat
SQL*Plus: Release 11.2.0.4.0 Production on Fri Nov 15 11:50:58 2019
Copyright (c) 1982, 2013, Oracle. All rights reserved.
Connected to:
Oracle Database 11g Release 11.2.0.3.0 - 64bit Production
old 1: select sysdate from dual where DUMMY in (&&1 )
new 1: select sysdate from dual where DUMMY in ('test1','test22','X' )
SYSDATE
---------
15-NOV-19
Disconnected from Oracle Database 11g Release 11.2.0.3.0 - 64bit Production
我在文件中有一个类似这样的查询:
script.sql
select *
from test_table
where name in (&1)
这是我正在尝试进行的查询示例
我用一个强大的 shell 脚本来执行它,就像这样:
$names = '''Name1'', ''Name2'''
$params = '"' + $names + '"'
sqlplus -silent $username/$password@$tnsalias "@script.sql" $params
注意 $names
有一个可变的名称列表
但是当脚本执行时,参数会像这样替换:
former : where name in (&1)
new : where name in (Name1)
当然 SQL 会抛出错误。
为什么要这样替换参数?
我怎样才能实现我想做的事情,所以第一个参数是将在 where name in(&1)
子句中使用的字符串列表。我的目标是 sql 将是
where name in ('Name1', 'Name2')
如果有帮助,SQL 在 Oracle 11 上执行。
powershell 示例
$username_dba = "system"
$password_dba = "manager"
$tnsalias_db = "es"
$names = "'''Name1'',''Name2'', ''X'''"
$params = '"' + $names + '"'
$sqlfile = "@sqltest.sql"
Write-Host $names
Write-Host $params
C:\oracle\instantclient_11_2\sqlplus $username_dba/$password_dba@$tnsalias_db $sqlfile $params
输出powershell:
C:\upwork\Whosebug\param_sql>powershell .\sql_param.ps1
'''Name1'',''Name2'', ''X'''
"'''Name1'',''Name2'', ''X'''"
SQL*Plus: Release 11.2.0.4.0 Production on Fri Nov 15 11:46:49 2019
Copyright (c) 1982, 2013, Oracle. All rights reserved.
Connected to:
Oracle Database 11g Release 11.2.0.3.0 - 64bit Production
old 1: select sysdate from dual where DUMMY in (&&1 )
new 1: select sysdate from dual where DUMMY in ('Name1','Name2', 'X' )
SYSDATE
---------
15-NOV-19
Disconnected from Oracle Database 11g Release 11.2.0.3.0 - 64bit Production
bat 文件示例。
@echo off
set user_name=system
set password=manageresmd
set net_service_name=esmd
set param1='''test1'',''test22'',''X'''
C:\oracle\instantclient_11_2\sqlplus.exe %user_name%/%password%@%net_service_name% @sqltest.sql %param1%
pause
输出bat文件:
C:\upwork\Whosebug\param_sql>sqltest1.bat
SQL*Plus: Release 11.2.0.4.0 Production on Fri Nov 15 11:50:58 2019
Copyright (c) 1982, 2013, Oracle. All rights reserved.
Connected to:
Oracle Database 11g Release 11.2.0.3.0 - 64bit Production
old 1: select sysdate from dual where DUMMY in (&&1 )
new 1: select sysdate from dual where DUMMY in ('test1','test22','X' )
SYSDATE
---------
15-NOV-19
Disconnected from Oracle Database 11g Release 11.2.0.3.0 - 64bit Production